0

フラット プレーンとインデックス バッファー、または画像にインデックスがマークされた EBO があります。

ここに画像の説明を入力

今私が電話した場合:

glDrawElementsBaseVertex(GL_TRIANGLES, 3, GL_UNSIGNED_INT, 0, 0);

私はこれを得る:

ここに画像の説明を入力

これはわかります。さらに、これを行うと:

glDrawElementsBaseVertex(GL_TRIANGLES, 9, GL_UNSIGNED_INT, 0, 0);

ここに画像の説明を入力

これも一理あります。しかし、他のパラメーターのいずれかを変更すると、私の理解は完全に崩壊します。私がこれを行う場合:

glDrawElementsBaseVertex(GL_TRIANGLES, 3, GL_UNSIGNED_INT, 0, 3);

次のようになります。

ここに画像の説明を入力

したがって、引数 3 を basevertex 引数 (最後の引数) に渡すことにより、インデックスの 3 つの位置からではなく、インデックスの 3 つの三角形からでもなく、インデックスの使用が開始されますが、約 6 つの三角形、またはより正確には開始されます。インデックス番号 18. この動作が理解できません。

また、これらの関数の「インデックス」の引数について矛盾する意味を読みました。

void glDrawElements(GLenum mode,  GLsizei count,  GLenum type,  const GLvoid * indices);
void glDrawElementsBaseVertex(GLenum mode​, GLsizei count​, GLenum type​, GLvoid *indices​, GLint basevertex​);

インデックス ポインターを使用すると、ポインターを提供することでインデックス バッファーを直接参照できるようになることを読みました。それが null の場合、インデックス バッファーは現在バインドされている GL_ELEMENT_ARRAY_BUFFER から取得されます。ただし、あるバージョンのドキュメントからは、次のように書かれています。

インデックスの読み取りを開始する GL_ELEMENT_ARRAY_BUFFER にバインドされたバッファーへのバイト オフセット (ポインター型にキャスト) を指定します。

そして、別のバージョンでは次のように述べています。

インデックスが格納されている場所へのポインターを指定します。

最後から 2 番目の引数 (インデックス) を (void*)3 として glDrawElementsBaseVertex を呼び出すと、最初の三角形が赤く描画されます。(void*)6 を指定すると、三角形が強調表示されません。(void*)9 を指定すると、2 番目の三角形が強調表示されます。

私はこれを理解することはできません。この引数 index は、現在バインドされている要素配列バッファーを使用する代わりに、使用したいインデックスへのオプションのポインターではないということですか?

4

3 に答える 3