我有一些3D代码,我注意到它不会在严格的核心配置文件中呈现,但在“正常”(未明确请求为核心)配置文件上下文中很好。为了解决这个问题,我编写了最简单的最简单的OpenGL程序,只绘制了一个三角形和一个矩形:
我发布了OpenGL程序as a 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
...如果要求4.2严格的核心配置文件而不是3.2,则同样的问题。适用于3种不同的nvidia GPU,因此我假设我没有正确地符合严格的核心配置文件。我做错了什么,我该如何解决这个问题?
注意,你不会在上面的Gist中找到 glEnableVertexAttribArray 调用,因为它是inside the glutil package我正在导入 - 但这确实被称为gist的最后一步 compileShaders() func。
答案 0 :(得分:14)
您没有使用Vertex Array Object和glGenVertexArrays()创建/绑定glBindVertexArray()。 VAO封装了一堆顶点属性状态,包括启用了哪些属性,详细的每个属性信息等。当最初引入该特征时,它们是可选的,但现在根据{10.4节的要求在严格/核心上下文中需要它们。 {3}}:
任何命令都会生成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