0

複数の頂点配列オブジェクトを使用して複雑なシーンをレンダリングするレンダリング インフラストラクチャがあります。各頂点配列オブジェクトは、バインドされたバッファー、ポインター、および属性の独自のセットを維持する責任があります (これらは設計されているため)。

レンダリングを担当する複数の配列オブジェクトが与えられた場合、各個別の配列オブジェクトがレンダリング中に同じ深度バッファを使用するような方法で深度バッファリングを導入するにはどうすればよいですか? 言い換えれば、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);
}

これはすべてスムーズに機能しますが、深度バッファリングがこれに適合する場所を見つけるのに苦労しています。

4

1 に答える 1

1

深度バッファリングがこれに適合する場所を見つけるのに苦労しています。

そのどれにも当てはまらないからです。

頂点配列オブジェクトは、頂点配列の状態をカプセル化する方法です。この状態は、現在のプログラム オブジェクト、現在バインドされているテクスチャ、またはフレーム バッファなどの他の状態とは関係ありません。最後の 1 つは、深度バッファーがどこから来るかです。

VAO を使用して複数のオブジェクトを同じフレーム バッファにレンダリングする場合は、単に framebuffer を変更しないでください。これは、それらすべてを同じ画像にレンダリングする方法です (簡単にするために、それを画面と呼びましょう)。深度バッファはフレームバッファの一部であるため、同じ深度バッファにレンダリングする場合は、異なるオブジェクト間でフレームバッファを変更しないでください。

つまり、オブジェクトのDraw関数は、現在使用されている深度バッファーを認識したり、気にしたりしてはなりません。Draw関数が、どのプログラムが使用されているか、どのテクスチャがバインドされているか、現在のビューポートが何であるかを認識または気にしないのと同じように。

于 2013-01-18T20:47:14.183 に答える