0

私はいくつかのopenGLラッパーを書いており、次のコードを実行しようとしています:

void some_func1() {
    float vertices[] = {50.0, 50.0, 0.0, 20.0, 50.0, 0.0, 20.0, 60.0, 0.0};
    glColor3f(1.0, 0.0, 0.0);
    glInterleavedArrays(GL_V3F, 0, vertices);
}

void some_func2() {
    int indices[] = {0,1,2};
    glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_INT, indices);
}

void parent_func() {
    some_func1();
    some_func2();
}

しかし、openGL は 2 番目の関数で glDrawElements への呼び出しを取得していないようです。私のルーチンはウィンドウを開き、それを黒くクリアし、何も描画しません。奇妙なのは、このコードを実行することです

void some_func1() {
    float vertices[] = {50.0, 50.0, 0.0, 20.0, 50.0, 0.0, 20.0, 60.0, 0.0};
    int indices[] = {0,1,2};
    glColor3f(1.0, 0.0, 0.0);
    glInterleavedArrays(GL_V3F, 0, vertices);
    glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_INT, indices);
}

void parent_func() {
    some_func1();
}

期待どおりに動作します: 赤い三角形が描かれます。ドキュメントを調べて検索しましたが、glDrawElements が機能しない理由や、別の関数で呼び出された場合にデータが欠落する理由が見つかりません。何か案は?

参考までに: ホスト上の 32 ビット プロセッサである VirtualBox を介して Ubuntu 12.04 VM でこれを実行しており、freeglut がウィンドウ処理を行っています。また、VM の 3D レンダリングに関する問題を回避するために、LIBGL_ALWAYS_INDIRECT=1 を設定しました。(それが重要かどうかはわかりませんが... :))

4

1 に答える 1

1

その理由は、 で描画する時点で、描画するglDrawElements有効な頂点データがないためです。呼び出すときglInterleavedArrays(gl...Pointerボンネットの下で一連の呼び出しを行うだけです)、何もコピーせずに頂点データの場所を OpenGL に伝えるだけです。実際のデータは、描画操作の前にアクセスされません ( glDrawElements)。したがって、関数が戻った後はもう存在しないsome_func1ローカル変数へのポインターを設定しています。verticesこれは、変更されたコード (ポインターが設定され、同じ関数で描画される) では発生しません。

したがって、この配列を呼び出しまで存続させるか、頂点バッファ オブジェクトを使用して実際のデータ コピーを実行することglDrawElementsにより、OpenGL に実際に頂点データ自体を格納するようにします。この場合、非常に非推奨の関数 (とにかく、適切な関数と呼び出しの単なるソフトウェア ラッパー以上のものではありません) を控えた方がよいかもしれません。glInterleavedArraysgl...PointerglEnableClientState

于 2013-01-08T16:08:16.113 に答える