1

複数の頂点バッファからの描画がopengles2.0でサポートされているかどうかについて多くの情報を見つけることができません(つまり、1つの頂点バッファを位置データに使用し、別の頂点バッファを法線、色などに使用します)。このページ http://developer.apple.com/library/ios/#documentation/3DDrawing/Conceptual/OpenGLES_ProgrammingGuide/TechniquesforWorkingwithVertexData/TechniquesforWorkingwithVertexData.htmlおよびリスト9.4は、特にできるはずですが、私はそれを取得できません私のプログラムに取り組んでください。問題のあるドローコールのコード:

glBindBuffer(GL_ARRAY_BUFFER, mPositionBuffer->openglID);
glVertexAttribPointer(0, 4, GL_FLOAT, 0, 16, NULL);
glEnableVertexAttribArray(0);

glBindBuffer(GL_ARRAY_BUFFER, mTexCoordBuffer->openglID);
glVertexAttribPointer(1, 2, GL_FLOAT, 0, 76, NULL);
glEnableVertexAttribArray(1);

glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, mIndexBuffer->openglID);
glDrawElements(GL_TRIANGLES, 10788, GL_UNSIGNED_SHORT, NULL);

この描画呼び出しは、シミュレーターのEXC_BAD_ACCESSで停止またはクラッシュし、デバイスで非常に奇妙な動作をします(openglはランダムな三角形を描画するか、以前にレンダリングされたフレームを表示します)。opengl呼び出しでエラーが返されることはありません。頂点バッファを広範囲に検査し、正しいサイズとデータがあると確信しています。

誰かが複数の頂点バッファを使用して正常にレンダリングし、これが機能しない理由についての経験を共有できますか?エラーコードを返さない、停止した/失敗した描画呼び出しのデバッグを開始する場所に関する情報をいただければ幸いです。

4

2 に答える 2

2

アクセス違反は通常、バッファに割り当てたよりも多くの三角形を描画しようとしていることを意味します。バッファを設定する方法は完全に問題なく機能するはずです。パラメータが適切に設定されているかどうかを確認します。

http://www.opengl.org/sdk/docs/man/xhtml/glVertexAttribPointer.xml http://www.opengl.org/sdk/docs/man/xhtml/glDrawElements.xml

あなたの問題は、あなたがあなたのglVertexAttribPointer呼び出しでオフセットとストライドを切り替えたか、あなたが描いているインデックスの数を誤って数えたかのどちらかだと思います

于 2012-01-07T20:25:07.790 に答える
1

はい、1回の描画に複数の頂点バッファオブジェクト(VBO)を使用できます。OpenGL ES 2.0の仕様では、セクション2.9.1でそのように述べています。

コードにハードコードされた定数が本当にすべて含まれていますか?その76はどこから来たのですか?

デバッグのヘルプが必要な場合は、バッファを初期化するコード(とを呼び出すコード)を投稿する必要がありglGenBuffersますglBufferData。EXC_BAD_ACCESSのスタックトレースも投稿する必要があります。

また、3596個の三角形ではなく、1つの三角形など、より単純なものを描画した方がデバッグが簡単な場合があります。

于 2012-01-07T20:22:57.380 に答える