2012-10-25 5 views
7

私は、厳しいコアプロファイルではレンダリングせず、「通常の」(コアとして明示的に要求されていない)プロファイルコンテキストではレンダリングしないと気づいた3Dコードをいくつか持っていました。問題を特定するために、私は、三角形や四角形を描画する最小の最も簡単なOpenGLのプログラムを書いている:この単純なOpenGLコード( "寛大な" 3.3と4.2のプロファイルで動作)は、厳格な3.2と4.2のコアプロファイルで動作するのですか?

enter image description here

私はas a Gist here OpenGLのプログラムということを掲載しています。 falseに設定useStrictCoreProfile変数で

、プログラムは、コンソールにエラーメッセージを出力せず、インテルHDのOpenGL 3.3およびOpenGL 4.2のGeForceの両方、クワッドおよび上記スクリーンショット当たりとして三角形を描画します。

しかし、trueにuseStrictCoreProfileセットで、それは背景色をクリアしますが、トライ&クワッドを描画していない、コンソール出力がこれです:

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 

... 4.2厳格なコア場合プロファイルは3.2、同じ問題の代わりに要求されます。 3つの異なるNVIDIA GPUに適用されるので、厳密なコアプロファイルに正しく準拠していないと仮定します。私は間違って何をしていたのですか?これをどのように修正できますか?しかし、これは、その要旨のcompileShaders() FUNCの最後のステップとして呼び出されるん -

注意、あなたはそれがinside the glutil packageだと私は輸入しています、上記の骨子でglEnableVertexAttribArrayコールを見つけることができません。

+1

あなたが「GL_INVALID_OPERATION」よりも、より有用なエラーメッセージを取得するためにGL_ARB_debug_output拡張子を使用してみましたか?それは設定するのはちょっと面倒ですが、絶対にその価値があります。 – postgoodism

+0

+1最も簡単な可能な最小限のOpenGLプログラムの例を共有するために – ANisus

+0

公正であるために、実際には「最小の最も単純な可能なOpenGLプログラム」とは言えません。 ;) – metaleap

答えて

14

Vertex Array Objectを作成していません。glGenVertexArrays()glBindVertexArray()です。 VAOは、どの属性が有効になっているか、属性ごとの詳細情報などを含む頂点属性状態の束をカプセル化します。これらの属性は、最初に機能が導入されたときはオプションでしたが、セクション10.4のthe OpenGL core specificationに従って厳密/ :

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

ここVAOsが使用されているかの非常に大まかな例です:

// 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 
+0

うわー、私はあなたの答えに基づいていくつかの周りを掘って、あなたが実際にそうであると言っていることは...それを試して、報告する! – metaleap

+0

あなたは正しいです!それでおしまい。このようなことを早期に発見するために、開発中にコアプロファイルに固執する。 – metaleap

+0

素晴らしい!私が見たいと思うのは、互換性とコアGLコンテキストの違いを確認するいくつかの公式のOpenGLドキュメント(フォーラム/ SE投稿ではなく)ですが、今までは見つけられませんでした。 – postgoodism

関連する問題