为什么OpenGL的glDrawArrays()在Core Profile 3.2下GL_INVALID_OPERATION失败,而不是3.3或4.2?



i有openGL渲染代码调用gldrawarrays,当OpenGL上下文是(自动/隐式获得)4.2时,它可以完美地工作,但始终如一地(GL_INVALID_OPERATION)以明确要求的OpenGL Core Core上下文3.2失败(GL_INVALID_OPERATION)。(在这两种情况下,着色器总是设置为#version 150,但我怀疑这一点旁边。)

根据规格,只有两个 gldrawarrays()失败的实例gl_invalid_operation:

  • "如果非零缓冲对象名称被绑定到启用数组,而缓冲区对象的数据存储当前已映射" - 我目前没有进行任何缓冲映射

  • "如果几何着色器处于活动状态并且模式与[...]的模式不相容 - 不,到目前

此外:

  1. 我已经验证了&仔细检查的是,只有gldrawarrays()调用失败。同样仔细检查了所有参数传递给gldrawarrays()在两个GL版本下都是相同的。

  2. 这发生在3种不同的NVIDIA GPU和2个不同的OS(Win7和OSX,均为64位) - 当然,在OSX中,我们只有3.2上下文,无论如何,NO 4.2无论如何)。

  3. 它不会使用集成的" 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非图案上下文中,没问题。

相关内容

  • 没有找到相关文章

最新更新