7

我注意到一些 3D 代码不会在严格的核心配置文件中呈现,但在“正常”(未明确要求仅作为核心)配置文件上下文中很好。为了隔离这个问题,我编写了最小最简单的 OpenGL 程序,只绘制一个三角形和一个矩形:

在此处输入图像描述

我已将 OpenGL 程序作为 Gist 发布在这里

useStrictCoreProfile变量设置为 false 时,程序不会向控制台输出任何错误消息,并根据上面的屏幕截图在 Intel HD OpenGL 3.3 和带有 OpenGL 4.2 的 GeForce 上绘制一个四边形和一个三角形。

但是,将useStrictCoreProfile设置为 true 时,它​​会清除背景颜色但不会绘制 tri & quad,控制台输出是这样的:

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调用,因为它在我正在导入的 glutil 包中——但这确实被称为 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 回答