我有一些 3D 代码,我注意到它们不会在严格的核心配置文件中呈现,但在“正常”(未明确请求仅作为核心)配置文件上下文中正常。为了隔离这个问题,我编写了最简单的 OpenGL 程序,仅绘制一个三角形和一个矩形:
我已经发布了OpenGL程序作为这里的要点 http://gist.github.com/3950516.
随着使用StrictCoreProfile当变量设置为 false 时,程序不会向控制台输出任何错误消息,并根据上面的屏幕截图绘制一个四边形和一个三角形,无论是在 Intel HD OpenGL 3.3 上还是在具有 OpenGL 4.2 的 GeForce 上。
However, with 使用StrictCoreProfile设置为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,因此我认为我没有正确遵守严格的核心配置文件。我做错了什么,我该如何解决这个问题?
请注意,您将找不到glEnableVertexAttribArray调用上面的要点,因为它是在 glutil 包内 http://github.com/go3d/go-util/blob/master/gl/shaders.go#L58我正在导入——但这确实被称为要点的最后一步编译着色器() func.
您没有创建/绑定顶点数组对象 https://www.opengl.org/wiki/Vertex_Specification#Vertex_Array_Object with glGenVertexArrays() https://www.opengl.org/wiki/GLAPI/glGenVertexArrays and glBindVertexArray() https://www.opengl.org/wiki/GLAPI/glBindVertexArray。 VAO 封装了一堆顶点属性状态,包括启用了哪些属性、详细的每个属性信息等。在最初引入该功能时,它们是可选的,但根据 10.4 节,现在在严格/核心上下文中需要它们。OpenGL核心规范 https://www.opengl.org/documentation/current_version/:
任何命令都会生成 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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)