我有调用glDrawArrays的OpenGL渲染代码,当OpenGL上下文是(自动/隐式获取)4.2时,它可以完美地工作,但是在显式请求的OpenGL核心上下文3.2中,它始终失败(GL_INVALID_OPERATION)。(在两种情况下,着色器始终设置为#version 150,但我怀疑这是不正确的。)
根据规范,只有两个实例,当glDrawArrays()失败并出现GL_INVALID_OPERATION时:
“如果将非零缓冲区对象名称绑定到已启用的数组,并且该缓冲区对象的数据存储区当前已映射”,则此时我不进行任何缓冲区映射
“如果几何着色器处于活动状态,并且模式与[...]不兼容”,不,到目前为止,还没有几何着色器。
此外:
我已经验证并仔细检查了只是glDrawArrays()调用失败。还要仔细检查传递给glDrawArrays()的所有参数在这两个GL版本下是否相同,缓冲区绑定也是如此。
这在3个不同的nvidia GPU和2个不同的操作系统(Win7和OSX,均为64位)上发生,当然,在OSX中,我们只有3.2上下文,反之则没有4.2。
集成“ Intel HD” GPU不会发生这种情况,但是对于那一个,我只有一个自动的隐式3.3上下文(试图通过GLFW对此GPU显式强制使用3.2核心配置文件,这会导致窗口创建失败,但这是一个完全不同的问题...)
对于它的价值,这是从Golang中的render循环中摘录的相关例程:
func (me *TMesh) render () {
curMesh = me
curTechnique.OnRenderMesh()
gl.BindBuffer(gl.ARRAY_BUFFER, me.glVertBuf)
if me.glElemBuf > 0 {
gl.BindBuffer(gl.ELEMENT_ARRAY_BUFFER, me.glElemBuf)
gl.VertexAttribPointer(curProg.AttrLocs["aPos"], 3, gl.FLOAT, gl.FALSE, 0, gl.Pointer(nil))
gl.DrawElements(me.glMode, me.glNumIndices, gl.UNSIGNED_INT, gl.Pointer(nil))
gl.BindBuffer(gl.ELEMENT_ARRAY_BUFFER, 0)
} else {
gl.VertexAttribPointer(curProg.AttrLocs["aPos"], 3, gl.FLOAT, gl.FALSE, 0, gl.Pointer(nil))
/* BOOM! */
gl.DrawArrays(me.glMode, 0, me.glNumVerts)
}
gl.BindBuffer(gl.ARRAY_BUFFER, 0)
}
因此,这当然是更大的渲染循环的一部分,尽管目前整个“ * TMesh”构造只是两个实例,一个实例是一个简单的立方体,另一个实例是一个简单的金字塔。重要的是,当在GL下3.3和4.2下都查询到GL时,整个绘图循环都可以完美地工作,没有错误报告,但是在3个具有显式3.2核心配置文件的nvidia GPU上失败,并带有错误代码,该错误代码根据规范仅在有两种具体情况,据我所知,这两种情况都不适用。
这有什么问题吗?你遇到过这个吗?有什么想法我一直想念的吗?
慕斯709654
浮云间
相关分类