7

厳密なコア プロファイルではレンダリングされないが、「通常の」(コアのみとして明示的に要求されていない) プロファイル コンテキストでは問題なくレンダリングされることに気付いた 3D コードがいくつかありました。この問題を切り分けるために、三角形と四角形だけを描画する最小で最も単純な OpenGL プログラムを作成しました。

ここに画像の説明を入力

その OpenGL プログラムを Gist here として投稿しました。

useStrictCoreProfile変数を false に設定すると、プログラムはコンソールにエラー メッセージを出力せず、上記のスクリーンショットのように、Intel HD OpenGL 3.3 と OpenGL 4.2 を使用する GeForce の両方で四角形と三角形を描画します。

ただしuseStrictCoreProfileを true に設定すると、背景色はクリアされますが、三角形と四角形は描画されません。コンソール出力は次のとおりです。

GLCONN: OpenGL 3.2.0 @ NVIDIA Corporation GeForce GT 640M LE/PCIe/SSE2 (GLSL: 1.50 NVIDIA via Cg compiler)
LASTERR: OpenGL error at step 'render.VertexAttribPointer()': GL_INVALID_OPERATION
LASTERR: OpenGL error at step 'render.DrawArrays()': GL_INVALID_OPERATION
LASTERR: OpenGL error at step 'render.VertexAttribPointer()': GL_INVALID_OPERATION
LASTERR: OpenGL error at step 'render.DrawArrays()': GL_INVALID_OPERATION
LASTERR: OpenGL error at step '(post loop)': GL_INVALID_OPERATION
EXIT

... 3.2 の代わりに 4.2 の厳格なコア プロファイルが要求された場合、同じ問題が発生します。3 つの異なる nvidia GPU に適用されるため、厳密なコア プロファイルに適切に準拠していないと思います。何が間違っていましたか?どうすれば修正できますか?

インポートしている glutil パッケージ内にあるため、上記の Gist にはglEnableVertexAttribArray呼び出しが見つからないことに注意してください。ただし、これはGist のcompileShaders()関数の最後のステップとして呼び出されます。

4

1 に答える 1

15

glGenVertexArrays()およびglBindVertexArray( ) で頂点配列オブジェクトを作成/バインドしていません。VAO は、有効になっている属性、詳細な属性ごとの情報などを含む、一連の頂点属性状態をカプセル化します。機能が最初に導入されたときはオプションでしたが、セクション 10.4 に従って厳密/コア コンテキストで必要になりました。 OpenGL コア仕様:

頂点配列がバインドされていない場合、頂点配列の状態を変更、描画、またはクエリするコマンドによって、INVALID_OPERATION エラーが生成されます。これは GL の初期状態で発生し、BindVertexArray または DeleteVertexArrays の副作用の結果として発生する可能性があります。

以下は、VAO の使用方法の非常に大まかな例です。

// At initialization time:
GLuint vao = 0;
glGenVertexArrays(1, &vao);
glBindVertexArray(vao);
// Set up your vertex attribute state:
//  - glBindBuffer(GL_ARRAY_BUFFER,...);
//  - glEnableVertexAttribArray(...);
//  - glVertexAttribPointer(...);
//  - etc. -- Refer to OpenGL docs to see what is/isn't included in the VAO!
glBindVertexArray(0); // unbinds vao

// At draw time:
glBindVertexArray(vao); // automatically sets up previously-bound vertex attribute state
glDrawArrays(...);
glBindVertexArray(0); // unbinds vao
于 2012-10-25T06:38:43.500 に答える