-->

如何使这个简单的OpenGL代码(工作在“宽” 3.3和4.2配置文件)工作在严格的3.2和4.2核

2019-08-01 22:01发布

我有一些3D的代码,我注意到在一个严格的核心配置文件将不会渲染而精“正常”(-作为核心,只有要求没有明确)配置文件环境。 为了找出问题,我已经写了最小最简单可行的OpenGL绘图程序只是一个三角形和矩形:

我已经发布使OpenGL程序作为这里要点 。

useStrictCoreProfile变量设置为假,则程序没有错误消息输出到控制台,并绘制一个四边形和三角形按照上面的截图,无论在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的,所以我认为我不符合严格的核心配置文件正确。 什么是我做错了,我怎么能解决这个问题?

请注意,你不会发现有上述要点的glEnableVertexAttribArray调用,因为它的glutil包里面我进口-但这被调用为主旨的compileShaders最后一步()FUNC。

Answer 1:

你没有创建/绑定一个顶点数组对象与glGenVertexArrays()和glBindVertexArray() 。 VAOs封装一堆顶点属性的状态,包括哪些属性被启用,详细介绍每个属性信息等,他们是可选的,当最初推出的功能,但是他们现在严格/核心上下文需要根据第10.4节的OpenGL的核心规格 :

是由修改,从绘制,或查询顶点数组状态时没有顶点阵列结合的任何命令产生的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


文章来源: How do I make this simple OpenGL code (works in a “lenient” 3.3 and 4.2 profile) work in a strict 3.2 and 4.2 core profile?