0

質問

OpenGL 4.4、C++11

element_array_buffer と array_buffer の両方に頂点属性を設定することにより、各属性に対して 0 から element_array_buffer のインデックスを使用する権限はありますか?

データレイアウト

VAO      
 Buffer(array_buffer)      
   PositionFloat * n  
   TextureFloat  * n
   NormalFloat   * n
 Buffer(element_array_buffer)      
   PositionIndex * 1
   TextureIndex  * 1
   NormalIndex   * 1

データの使用

//gen
glBindVertexArray(VAO);

glBindBuffer(array_buffer, vbo);
glBufferData(array_buffer, size(vertices), data(vertices), access(vertices));
glVertexAttribPointer(POSITIONS, 3, float, offset(0));
glVertexAttribPointer(UVS,       2, float, offset(positions));
glVertexAttribPointer(NORMALS,   3, float, offset(normals));

glBindBuffer(element_array_buffer, ebo);
glBufferData(element_array_buffer, size(elements), data(elements), access(elements)); 
...?! /*Cannot set element attributes!  
If I could, I would set a strided, offset attribPointer for each attribute, 
so that if 0 appears in the NORMALS attribute, it will look up the first normal, 
and not the first element in the buffer. */

問題

最初の頂点、UV、および法線を 0/0/0 で参照できるようにインデックスを記述します。これを element_array_buffer にマップしてそのまま使用することはできますか? または、nPositions をテクスチャ インデックスに追加し、nPositions+nTextures を通常のインデックスに追加するソリューションはありますか?

4

1 に答える 1

2

OpenGL は、頂点属性ごとの個別のインデックスをサポートしていません。頂点属性にバッファーを使用する場合、頂点属性の一意の組み合わせごとに頂点を作成する必要があります。

標準的な例は、頂点属性として位置と法線を持つ立方体です。立方体には 8 つの角があるため、位置属性には 8 つの異なる値があります。6 つの面があるため、通常属性の値は 6 種類あります。立方体にはいくつの頂点がありますか? OpenGL では、答えは... 24です。

この場合の頂点の数が 24 である理由を導き出すには、少なくとも 2 つの方法があります。

  • 立方体には 6 つの面があります。法線が異なるため、側面間で頂点を共有することはできません。各辺には 4 つの角があるため、辺ごとに 4 つの頂点が必要です。6 * 4 = 24。
  • 立方体には 8 つのコーナーがあります。これらの 8 つのコーナーのそれぞれで、3 つの側面が交わります。これらの 3 つの側面には異なる法線があるため、それぞれに異なる頂点が必要です。8 * 3 = 24。

さて、あなたは特に OpenGL 4.4 について尋ねているので、考慮できる他のオプションがあります。たとえば、頂点属性の値を座標ではなくインデックスに指定できます。もちろん、複数の頂点属性を使用できるため、頂点ごとに複数のインデックスを持つことができます。次に、頂点シェーダーはこれらのインデックスを頂点属性の値として取得します。次に、別のソースから実際の属性値を取得できます。これらのソースの可能性は次のとおりです。

  • 均一バッファー。
  • テクスチャ バッファ。
  • テクスチャ。

これらのいずれかが、より伝統的な方法で頂点属性を単純に使用するのと同じくらい効率的であるとは確信していません。ただし、すべてのオプションを検討したい場合は、試してみる価値があります。

インスタンス化されたレンダリングは、すべての組み合わせを列挙することなく頂点属性のさまざまな組み合わせをレンダリングするのに役立つ場合がある別の方法です。ただし、これはジオメトリが反復する場合にのみ機能します。たとえば、1 回の描画呼び出しで多くの立方体をレンダリングし、それぞれに異なる色を使用する場合、インスタンス化されたレンダリングは完全に機能します。

于 2014-08-17T18:42:36.660 に答える