1

VAO をバインドしようとすると、ランダムに表示される奇妙なクラッシュに直面しています。

VAO 自体は glGenVertexArrays によって以前に生成されており、エラーは返されません。

glGenVertexArrays(NUM_VAO,vao);
glGenBuffers(NUM_VAO,vbo);

glBindVertexArray(vao[2]);
glBindBuffer(GL_ARRAY_BUFFER,vbo[2]);
glBufferData(GL_ARRAY_BUFFER,1024*sizeof(GLfloat),NULL,GL_DYNAMIC_DRAW);
glVertexAttribPointer(...);
glEnableVertexAttribArray(...);

実行中、次への呼び出し:

glBindVertexArray(vao[2])

INVALID_OPERATION を生成する場合と生成しない場合があります。vao[2] の内容は glGenVertexArrays によって返されるものと同じであり、配列は実行中に削除されないことに注意してください。

仕様によると、ゼロ以外の名前が渡され、名前自体が glGenVertexArrays によって返されなかった場合にのみ INVALID_OPERATION が発行されますが、これは明らかに当てはまりません。

この問題は、アプリケーションの実行時間の約 15% で散発的に発生しますが、それ以外の場合はすべて期待どおりに機能します。デバッグ モードでも問題が解決しない。

ワークステーションをアップグレードしたばかりで、以前は NVidia ドライバー 290.10 および Qt 4.7.1 を使用して OpenSUSE 12.1 で開発していましたが、この問題は一度もありませんでした。

NVidia ドライバー 304.43 および Qt 4.8.1 を使用して OpenSUSE 12.2 に移行したところ、この問題が発生しました。

誰かが前にそのような状況に遭遇したことがありますか? 何か不足していますか?

4

1 に答える 1

1

わかりました、私のせいです。 glDeleteVertexArrays() が暴走しました..しかし、それを見つけるのは本当に困難でした。

おそらく古いOSとドライバーでは、返された名前、初期メモリレイアウトなどが異なり、存在しないVAOを削除しただけですが、ここでは有効なものを指しています..

Linux のバージョンやディストリビューションを変更したり、BSD に移行したりしたことは、真に移植性の高いコードを作成するのに大いに役立ちました..

于 2012-09-18T11:58:16.677 に答える