2012-10-25 58 views
7

我有一些3D代码,我注意到不会在严格的核心配置文件中呈现,但在“正常”(未明确请求的仅作为核心)配置文件上下文中可以。为了找出问题,我已经写了最小最简单可行的OpenGL绘图程序只是一个三角形和矩形:如何使这个简单的OpenGL代码(在“宽松的”3.3和4.2配置文件中工作)在严格的3.2和4.2核心配置文件中工作?

enter image description here

我已经张贴的OpenGL程序as a Gist here

随着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调用,因为它是inside the glutil package我进口 - 但这被调用为主旨的compileShaders最后一步() FUNC。

+1

您是否尝试过使用GL_ARB_debug_output扩展获得比“GL_INVALID_OPERATION”更多有用的错误信息?设置起来有点麻烦,但绝对值得。 – postgoodism

+0

+1分享一个最小的最简单可能的OpenGL程序的示例Go – ANisus

+0

公平地说,它不是真正的“最小的最简单的可能的OpenGL程序Go”,公平......可以减少它;) – metaleap

回答

14

您并未创建/绑定Vertex Array ObjectglGenVertexArrays()glBindVertexArray()。 VAO封装了一堆顶点属性状态,包括启用了哪些属性,每个属性的详细信息等等。当功能最初被引入时,它们是可选的,但是现在根据the OpenGL core specification的第10.4节在严格/核心环境中要求它们:是由 修改,从绘制,或查询顶点数组状态时没有顶点阵列结合的任何命令产生

的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 
+0

哇,我根据你的答案挖掘了一些更多的信息,你真的在​​说什么似乎是这种情况......会尝试并报告回来! – metaleap

+0

你说得对!而已。从现在开始在开发过程中坚持核心概要,以便早日发现这些事情。 – metaleap

+0

太棒了!我希望看到的是一些官方的OpenGL文档(而不是论坛/ SE的文章),它证实了兼容性和核心GL上下文之间的这种区别(以及其他),但到目前为止我还没有找到。 – postgoodism

相关问题