为什么OpenGL的glDrawArrays()在Core Profile 3.2

我有调用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上失败,并带有错误代码,该错误代码根据规范仅在有两种具体情况,据我所知,这两种情况都不适用。


这有什么问题吗?你遇到过这个吗?有什么想法我一直想念的吗?


绝地无双
浏览 280回答 2
2回答

慕斯709654

我有一个疯狂的猜测。据我了解,所有OpenGL调用都必须在同一线程上发生。此限制与goroutine不能很好地结合在一起,因为同一个goroutine可以在其执行过程中的不同时间点在不同线程上运行。为了解决这个问题,您需要在初始化OpenGL之前就将您的主goroutine(或任何goroutine正在执行OpenGL调用)锁定到当前线程。import "runtime"func main() {    runtime.LockOSThread()    ...}看到结果不一致的原因可能是实现上的差异。

浮云间

不只是 DrawArrays,我在这里被误解了。我以某种方式调用glVertexAttribPointer的方式就是这里的问题:在任何严格的核心配置文件中,无论是3.2还是4.2 ...都将作进一步调查。在4.2非严格环境中,没有问题。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go