0

シェーダーとプログラム可能なパイプラインを使用しています。2 つのメッシュを線 (おそらく色付き) で接続する必要がありますが、これら 2 つのオブジェクトのモデル マトリックスしかありません。線はこれらのオブジェクトの中心から開始する必要があるため、2 つの点のオブジェクト座標は次のようになるはずです。

start point: 0,0,0
end point: 0,0,0

2 つのオブジェクトを接続するには、シェーダー内のこれらのポイントをそれぞれのオブジェクトのモデル マトリックスで乗算する必要があると思います。次に、すべてにビュー マトリックスを掛けます (これは 2 つのオブジェクトに共通です)。そして最終的に射影行列によって。

私は常に頂点配列を持つシェーダーを使用してきましたが、シェーダーに 2 つの異なる頂点を渡すにはどうすればよいでしょうか? 彼らにも制服を使うべきですか?また、glDrawElements と glDrawArrays の両方がデータ配列を必要とするため、線を描画するにはどの関数を使用すればよいでしょうか?

4

1 に答える 1

2

最も簡単な方法は、GL_LINESで描画するすべての線のワールドスペースポイントを含むVBOを作成することです。

最も簡単なのはglDrawArraysを使用することです。(10.000s +)の間に線を必要とするオブジェクトのペアが極端に多い場合は、すべてのポイントをVBOに格納してから、IBO(インデックスバッファー)を使用して、VBO内のどのポイントがライン。

線の頂点は、ビューマトリックスによって変換する必要があります。

次に例を示します。GLuintvao、vbo;

// generate and bind the vao
glGenVertexArrays(1, &vao);
glBindVertexArray(vao);

// generate and bind the buffer object
glGenBuffers(1, &vbo);
glBindBuffer(GL_ARRAY_BUFFER, vbo);

struct Point{ 
    float x,y,z; 
    Point(float x,float y,float z) 
                    : x(x), y(y), z(z) 
    {} 
};

// create two points needed for a line. For more lines, just add another point-pair
std::vector<Point> vertexData;
vertexData.push_back( Point(-0.5, 0.f, 0.f) );
vertexData.push_back( Point(+0.5, 0.f, 0.f) );

// fill with data
size_t numVerts = vertexData.size();
glBufferData(GL_ARRAY_BUFFER, sizeof(Point)*numVerts, &vertexData[0], GL_STATIC_DRAW);

// set up generic attrib pointers
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, numVerts*sizeof(Point), (char*)0 + 0*sizeof(GLfloat));

// "unbind" vao
glBindVertexArray(0);

// In your render-loop:
glBindVertexArray(vao);
glDrawArrays(GL_LINES, 0, numVerts);

実行時にポイントペアを追加する必要がある場合は、std :: vectorを更新し、VBOをバインドして、glBufferDataを呼び出します。

于 2012-07-21T19:10:25.897 に答える