2017-11-02 4 views
1

私の目標は、さまざまな色と可能な場合は幅の異なるVBOを使用してセグメントのリストをレンダリングすることです。各頂点は、によって定義さVBOを使用して異なる幅の色付き線を描画しますか?

class Vector2f { 
public: 
    float x, y; 
}; 

セグメントのリストは、セグメントを定義する頂点の対で構成されています。

は、その後、私はVBOを初期化します。

glGenBuffers(1, &vbo); 
glBindBuffer(GL_ARRAY_BUFFER, vbo); 
glBufferData(GL_ARRAY_BUFFER, sizeof(Vector2f) * segments.size(), &segments[0], GL_DYNAMIC_DRAW); 
glBindBuffer(GL_ARRAY_BUFFER, 0); 

そして私は使って描く:

glBindBuffer(GL_ARRAY_BUFFER, vbo); 
glEnableClientState(GL_VERTEX_ARRAY); 
glVertexPointer(2, GL_FLOAT, sizeof(Vector2f), (void*)(sizeof(float) * 0)); 
glColor3f(0.0f, 1.0f, 0.0f); 
glDrawArrays(GL_LINES, 0, segments.size()); 
glDisableClientState(GL_VERTEX_ARRAY); 
glBindBuffer(GL_ARRAY_BUFFER, 0); 

私の例では、私は、各セグメントに色を与えたいです。色は以前に定義されており、3つのオプションから1つしか選択できません。 どうすればいいですか?そして、それらを全部繰り返すのではなく、色のインデックスを使って最適化できますか?

もしそうなら、どうですか?

また、個々のセグメントの幅を定義することは可能ですか?

答えて

2

どうすればいいですか?

カラー値を含むようにあなたの頂点構造体を拡張:

class Vector2f 
{ 
public: 
    float x, y; 
    unsigned char r, g, b; 
}; 

そしてGL_COLOR_ARRAY + glColorPointer()を使用します。

glBindBuffer(GL_ARRAY_BUFFER, vbo); 
glEnableClientState(GL_VERTEX_ARRAY); 
glEnableClientState(GL_COLOR_ARRAY); 
glVertexPointer(2, GL_FLOAT, sizeof(Vector2f), offsetof(Vector2f, x)); 
glColorPointer(3, GL_UNSIGNED_BYTE, sizeof(Vector2f), offsetof(Vector2f, r)); 
glDrawArrays(GL_LINES, 0, segments.size()); 
glDisableClientState(GL_VERTEX_ARRAY); 
glDisableClientState(GL_COLOR_ARRAY); 
glBindBuffer(GL_ARRAY_BUFFER, 0); 

また、それは、個々のセグメントの幅を定義することが可能です?

固定機能はありません。あなたはどちらかのセグメントで描画呼び出しをglLineWidth() +(描画呼び出しのバッチ処理のパフォーマンス上の利点を失う)またはconverting the line into triangle geometry(かなり複雑になります)で終了します。

+0

インデックスを使用してカラー配列を最適化できないのですか? – gdf31

+0

@ gdf31:そうではありませんが、OpenGLでは各属性ごとに別々のインデックス配列は使用できません。 – genpfault

+0

@ gdf31:デスクトップをターゲットにしているのなら正直OpenGLの頂点データはほんの一握りのテクスチャに比べて微妙です。 – genpfault

関連する問題