複数の頂点配列オブジェクトを使用して複雑なシーンをレンダリングするレンダリング インフラストラクチャがあります。各頂点配列オブジェクトは、バインドされたバッファー、ポインター、および属性の独自のセットを維持する責任があります (これらは設計されているため)。
レンダリングを担当する複数の配列オブジェクトが与えられた場合、各個別の配列オブジェクトがレンダリング中に同じ深度バッファを使用するような方法で深度バッファリングを導入するにはどうすればよいですか? 言い換えれば、Vertex Array Objects (およびそれらの優れたカプセル化プロパティ) の概念と、よりグローバルな概念であると思われる深度バッファリングを統合するにはどうすればよいでしょうか。
私が見つけたすべての例は、フレームバッファのコンテキストで深度バッファを使用することを説明しています。Apple は、この手法についてここで説明しています。フレームバッファ レベルで深度バッファリングを実装し、頂点配列オブジェクトをそのフレームバッファに書き込む手法はありますか? VAO と深度バッファリングを使用する従うことができる例はありますか?
頂点配列オブジェクトをカプセル化するクラスがあり、これがそのバインド メソッドです (さまざまなバッファー、ポインター、および属性の設定を担当します)。
void scene_GLBuffer::BindTriangles()
{
glBindVertexArrayOES(_mVertexArrayObject);
glGenVertexArraysOES(1, &_mVertexArrayObject);
// generate the buffer and configure the gl pointers for position and normal data
glGenBuffers(1, &_mVertexPositionNormalTriangles);
/* Bind and set up vertex position and normal data */
glBindBuffer(GL_ARRAY_BUFFER, _mVertexPositionNormalTriangles);
glBufferData(GL_ARRAY_BUFFER,
sizeof(crVertexPN)*_mPositionNormalTriangleData->size(),
_mPositionNormalTriangleData->data(),
GL_STATIC_DRAW);
glVertexAttribPointer(GLKVertexAttribPosition, 3, GL_FLOAT, GL_FALSE,
sizeof(crVertexPN), (void*)offsetof(crVertexPN,Position));
glEnableVertexAttribArray(GLKVertexAttribPosition);
glVertexAttribPointer(GLKVertexAttribNormal, 3, GL_FLOAT, GL_FALSE,
sizeof(crVertexPN), (void*)offsetof(crVertexPN,Normal));
glEnableVertexAttribArray(GLKVertexAttribNormal);
// generate the buffer and configure the gl pointers for color and alpha data
glGenBuffers(1, &_mVertexColorTriangles);
glBindBuffer(GL_ARRAY_BUFFER, _mVertexColorTriangles);
glBufferData(GL_ARRAY_BUFFER,
sizeof(crVertexC)*_mColorTriangleData->size(),
_mColorTriangleData->data(),
GL_DYNAMIC_DRAW);
glVertexAttribPointer(GLKVertexAttribColor, 4, GL_FLOAT, GL_TRUE,
sizeof(crVertexC), (void*)offsetof(crVertexC,Color));
glEnableVertexAttribArray(GLKVertexAttribColor);
glBindBuffer(GL_ARRAY_BUFFER,0);
// generate the buffer and configure the gl pointers for triangle index data
glGenBuffers(1, &_mVertexIndexTriangles);
/* Bind and set up triangle index data */
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, _mVertexIndexTriangles);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(bits32)*_mIndexTriangleData->size(),_mIndexTriangleData->data(), GL_STATIC_DRAW);
// glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,0);
glBindVertexArrayOES(0);
}
バインド後、draw メソッドは次のように実装されます (この draw メソッドは、個々の頂点バッファー オブジェクトごとに呼び出されます)。
void scene_GLBuffer::Draw()
{
glBindVertexArrayOES(_mVertexArrayObject);
glBindBuffer(GL_ARRAY_BUFFER, _mVertexPositionNormalTriangles);
glDrawElements(GL_TRIANGLES, _mIndexTriangleData->size(), GL_UNSIGNED_INT, 0);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindVertexArrayOES(0);
}
これはすべてスムーズに機能しますが、深度バッファリングがこれに適合する場所を見つけるのに苦労しています。