gpt4 book ai didi

opengl - 为什么 OpenGL 的 glDrawArrays() 在核心配置文件 3.2 下会因 GL_INVALID_OPERATION 而失败,但在 3.3 或 4.2 下却不会?

转载 作者:IT王子 更新时间:2023-10-29 01:28:07 29 4
gpt4 key购买 nike

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

根据规范,当 glDrawArrays() 因 GL_INVALID_OPERATION 失败时,只有两个实例:

  • “如果非零缓冲区对象名称绑定(bind)到已启用的数组,并且缓冲区对象的数据存储当前已映射”——此时我没有进行任何缓冲区映射

    <
  • “如果几何着色器处于事件状态且模式与 [...] 不兼容”——不,目前没有几何着色器。

此外:

  1. 我已经验证并仔细检查了它只是 glDrawArrays() 调用失败。还要仔细检查传递给 glDrawArrays() 的所有参数在两个 GL 版本下是否相同,缓冲区绑定(bind)也是如此。

  2. 这发生在 3 个不同的 nvidia GPU 和 2 个不同的操作系统(Win7 和 OSX,都是 64 位 - 当然,在 OSX 中我们只有 3.2 上下文,无论如何没有 4.2 ).

  3. 它不会发生在集成的“Intel HD”GPU 上,但对于那个 GPU,我只得到一个自动隐式 3.3 上下文(试图通过 GLFW 在此 GPU 上显式强制 3.2 核心配置文件失败窗口创建但这是一个完全不同的问题...)

对于它的值(value),这里是从 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”构造只有两个实例,一个是简单的立方体,另一个是简单的金字塔。重要的是,整个绘图循环完美无瑕地工作,当查询 GL 是否存在 3.3 和 4.2 下的错误时,没有错误报告,但是在具有显式 3.2 核心配置文件的 3 个 nvidia GPU 上失败,错误代码根据规范仅在两种具体情况,据我所知,没有一种适用于此。

这里可能有什么问题?你遇到过这个吗?有什么我遗漏的想法吗?

最佳答案

我有一个疯狂的猜测。

据我了解,所有 OpenGL 调用都必须发生在同一个线程上。此限制不能很好地与 goroutines 混合,因为同一个 goroutines 可以在不同线程上的不同执行点上运行。

要解决此问题,您需要在初始化 OpenGL 之前,在主协程(或执行 OpenGL 调用的任何协程)启动后立即将其锁定到其当前线程。

import "runtime"

func main() {
runtime.LockOSThread()

...
}

您看到不一致结果的原因可能是实现差异造成的。

关于opengl - 为什么 OpenGL 的 glDrawArrays() 在核心配置文件 3.2 下会因 GL_INVALID_OPERATION 而失败,但在 3.3 或 4.2 下却不会?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13051587/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com