5

アプリケーションの速度を上げるために、頂点配列関数を VBO に転送しています。

これが私の元の作業頂点配列レンダリング関数です。

void BSP::render()
{
    glFrontFace(GL_CCW);

    // Set up rendering states
    glEnableClientState(GL_VERTEX_ARRAY);
    glEnableClientState(GL_TEXTURE_COORD_ARRAY);

    glVertexPointer(3, GL_FLOAT, sizeof(Vertex), &vertices[0].x);

    glTexCoordPointer(2, GL_FLOAT, sizeof(Vertex), &vertices[0].u);

    // Draw
    glDrawElements(GL_TRIANGLES, numIndices, GL_UNSIGNED_SHORT, indices);

    // End of rendering - disable states
    glDisableClientState(GL_VERTEX_ARRAY);
    glDisableClientState(GL_TEXTURE_COORD_ARRAY);
}

うまくいきました!

現在、それらをVBOに移動していますが、実際にプログラムが原因でグラフィックカードが応答しなくなりました。頂点とインデックスの設定はまったく同じです。

新しいセットアップ:

vboId は bsp.h で次のように設定されます。GLuint vboId[2];

createVBO() 関数を実行しただけではエラーは発生しません。

void BSP::createVBO()
{

    // Generate buffers
    glGenBuffers(2, vboId);

    // Bind the first buffer (vertices)
    glBindBuffer(GL_ARRAY_BUFFER, vboId[0]);
    glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);

    // Now save indices data in buffer
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vboId[1]);
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);

}

そして、VBOS のレンダリング コード。私はそれがここにあると確信しています。頂点配列で行ったように、VBO で whats をレンダリングしたいだけです。

与える:

void BSP::renderVBO()
{
    glBindBuffer(GL_ARRAY_BUFFER, vboId[0]);         // for vertex coordinates
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vboId[1]); // for indices

    // do same as vertex array except pointer
    glEnableClientState(GL_VERTEX_ARRAY);             // activate vertex coords array
    glVertexPointer(3, GL_FLOAT, 0, 0);               // last param is offset, not ptr

    // draw the bsp area
    glDrawElements(GL_TRIANGLES, numVertices, GL_UNSIGNED_BYTE, BUFFER_OFFSET(0));

    glDisableClientState(GL_VERTEX_ARRAY);            // deactivate vertex array

    // bind with 0, so, switch back to normal pointer operation
    glBindBuffer(GL_ARRAY_BUFFER, 0);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
}

エラーの内容はわかりませんが、レンダリング機能が間違っていることは確かです。オンラインにはたくさんありますが、互いに矛盾していることが多いため、これに関するより統一されたチュートリアルがあればいいのにと思います。

4

3 に答える 3

2

さらに、ミロが言ったこと ( は であるGL_UNSIGNED_BYTE必要があります)、非 VBO 呼び出しのように、butGL_UNSIGNED_SHORTを使用したくないと思います。numVerticesnumIndices

glDrawElements(GL_TRIANGLES, numIndices, GL_UNSIGNED_SHORT, 0);

それ以外の場合、コードは非常に有効に見えますが、これで問題が解決しない場合は、エラーが別の場所にある可能性があります。

ちなみに、BUFFER_OFFSET(i)これは通常、 の定義にすぎない((char*)0+(i))ため、特に 0 の場合は、バイト オフセットを直接渡すこともできます。

編集:ちょうど別のものを見つけました。非 VBO バージョン (上記で想定した) に使用する正確なデータ構造を使用する場合は、もちろん のsizeof(Vertex)ストライド パラメータとして使用する必要がありますglVertexPointer

于 2011-08-12T13:46:05.280 に答える
0

頂点インデックスをどのように宣言しますか?

glBufferData の size パラメータはバッファのサイズ (バイト単位) である必要があり、sizeof(vertices)を渡すと、宣言された配列の合計サイズが返されます (割り当てられたものだけではありません)。

代わりにsizeof(Vertex)*numVerticessizeof(indices[0])*numIndicesなどを試してください。

于 2011-08-12T13:54:43.370 に答える
0

VBOを使用していないときに同じデータをglDrawElementsに渡し、同じデータをVBOバッファに渡す場合。GL_UNSIGNED_SHORT次に、使用した FBO を使用しない場合と使用した FBO を使用した場合のパラメーターはほとんど変わりませんGL_UNSIGNED_BYTE。したがって、VBO呼び出しは次のようになるはずです。

glDrawElements(GL_TRIANGLES, numVertices, GL_UNSIGNED_SHORT, 0);

このチュートリアルも見てください。非常によく説明された VBO バッファがあります。

于 2011-08-12T11:14:58.033 に答える