i有openGL渲染代码调用gldrawarrays,当OpenGL上下文是(自动/隐式获得)4.2时,它可以完美地工作,但始终如一地(GL_INVALID_OPERATION)以明确要求的OpenGL Core Core上下文3.2失败(GL_INVALID_OPERATION)。(在这两种情况下,着色器总是设置为#version 150,但我怀疑这一点旁边。)
根据规格,只有两个 gldrawarrays()失败的实例gl_invalid_operation:
-
"如果非零缓冲对象名称被绑定到启用数组,而缓冲区对象的数据存储当前已映射" - 我目前没有进行任何缓冲映射
-
"如果几何着色器处于活动状态并且模式与[...]的模式不相容 - 不,到目前
此外:
-
我已经验证了&仔细检查的是,只有gldrawarrays()调用失败。同样仔细检查了所有参数传递给gldrawarrays()在两个GL版本下都是相同的。
-
这发生在3种不同的NVIDIA GPU和2个不同的OS(Win7和OSX,均为64位) - 当然,在OSX中,我们只有3.2上下文,无论如何,NO 4.2无论如何)。
-
它不会使用集成的" Intel HD" GPU发生但这是一个完全不同的问题...)
对于它的价值,这是Golang中渲染循环摘录的相关常规:
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"结构只是两个实例,一个是一个简单的立方体,另一个是简单的金字塔。重要的是,整个绘图循环在3.3和4.2下是否询问GL的错误时,没有任何错误,但在3个NVIDIA GPU上,具有显式3.2 3.2核心配置文件在错误代码上失败,而根据规格,该错误代码仅在Spec中调用。两种具体情况,据我所知,这都不是在这里申请。
这里可能有什么问题?你有没有遇到过这个?有什么想法我缺少什么?
我有一个疯狂的猜测。
据我了解,所有OpenGL调用都必须在同一线程上发生。该限制与goroutines不能很好地混合,因为同一goroutine可以在执行的不同点上在不同的线程上运行。
要解决这个问题,您需要在初始化OpenGL之前锁定其当前线程的主要Goroutine(或任何Goroutine执行OpenGL调用)。
。import "runtime"
func main() {
runtime.LockOSThread()
...
}
您看到不一致结果的原因可以通过实现差异来解释。
不是 drawarrays ,我在这里误会了。以某种方式我打电话 glvertexattribpointer 是这里的问题:在中,无论是严格的核心配置文件,无论3.2还是4.2 ...都会进一步研究。在4.2非图案上下文中,没问题。