我注意到一些3D代码不会在严格的核心配置文件中呈现,但可以在“正常”(非明确要求仅作为核心提供)配置文件上下文中呈现。为了解决这个问题,我编写了最小的,最简单的OpenGL程序,仅绘制了一个三角形和一个矩形:
With the useStrictCoreProfile variable set to false, the program outputs no error messages to the console and draws a quad and a triangle as per the above screenshot, both on an Intel HD OpenGL 3.3 and on a GeForce with OpenGL 4.2.
However, with useStrictCoreProfile set to true, it clears the background color but does not draw the tri & quad, console output is this:
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
... if a 4.2 strict core profile is requested instead of 3.2, same issue. Applies to 3 different nvidia GPUs so I assume I'm not conforming to the strict core profile properly. What was I doing wrong, and how can I fix this?
Note, you won't find a glEnableVertexAttribArray call in the above Gist, as it's inside the glutil package I'm importing -- but this does get called as the last step in the gist's compileShaders() func.
You're not creating/binding a Vertex Array Object with glGenVertexArrays() and glBindVertexArray(). VAOs encapsulate a bunch of vertex attribute state, including which attributes are enabled, detailed per-attribute information, etc. They were optional when the feature was originally introduced, but they're now required in strict/core contexts according to section 10.4 of the OpenGL core specification:
当没有绑定顶点数组时,任何修改,绘制或查询顶点数组状态的命令都会生成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
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句