- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我有调用 glDrawArrays 的 OpenGL 渲染代码,当 OpenGL 上下文(自动/隐式获得)4.2 时,它可以完美地工作,但在明确请求的 OpenGL 核心上下文 3.2 时始终失败(GL_INVALID_OPERATION)。 (在这两种情况下,着色器始终设置为#version 150,但我怀疑这不是重点。)
根据规范,当 glDrawArrays() 因 GL_INVALID_OPERATION 失败时,只有两个实例:
“如果非零缓冲区对象名称绑定(bind)到已启用的数组,并且缓冲区对象的数据存储当前已映射”——此时我没有进行任何缓冲区映射
<“如果几何着色器处于事件状态且模式与 [...] 不兼容”——不,目前没有几何着色器。
此外:
我已经验证并仔细检查了它只是 glDrawArrays() 调用失败。还要仔细检查传递给 glDrawArrays() 的所有参数在两个 GL 版本下是否相同,缓冲区绑定(bind)也是如此。
这发生在 3 个不同的 nvidia GPU 和 2 个不同的操作系统(Win7 和 OSX,都是 64 位 - 当然,在 OSX 中我们只有 3.2 上下文,无论如何没有 4.2 ).
它不会发生在集成的“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/
每次我尝试使用 Qt QOpenGLTexture 上传具有多个 mipmap 级别的 DXT1 纹理时,我都会收到 GL_INVALID_OPERATION。对于 mipmap 级别 0,一切正常,
我正在使用 this lovely tutorial. 进行阴影转换这个过程是,我们将场景渲染到一个帧缓冲区,附加到它的是一个立方体贴图来保存深度值。然后,我们将这个立方体贴图传递给片段着色器,片段着
为什么是glTexSubImage2D()突然导致 GL_INVALID_OPERATION? 我正在尝试将我过时的增强现实应用程序从 iOS4.x 升级到 iOS5.x,但我遇到了困难。我运行的是
我将 OpenGL 与 LWJGL 和我自己的非常小的框架一起用于琐碎的任务。我正在关注OpenGL SuperBible: Comprehensive Tutorial and Reference
我正在开发一些图形应用程序,在 glPopAttrib() 之后我得到了一个 GL_INVALID_OPERATION。预测答案“您似乎在 glBegin/glEnd block 中调用了 glPop
我正在尝试从已有效编译和链接的程序中检索二进制文件。我已经通过 GL_PROGRAM_BINARY_LENGTH 收到了它的长度。该文档说有两个实例可能会发生 GL_INVALID_OPERATION
当我尝试为 gound 分配几何图形时,我在示例的最开始遇到异常,here和 here : 此时 gl4.glNamedBufferData(vertexBuffer[0], Vertex.size(
我已将错误范围缩小到此 OpenGL 调用: glVertexAttribPointer(var.vertex, 4, GL_FLOAT, GL_FALSE, 0, 0); 前面没有错误,后面有 GL
我当前正在连接 OpenGL 应用程序并收到GL_INVALID_OPERATION。整个 GL 分散在多个文件中,很难从中创建示例,但我已经使用 apitrace 创建了 OpenGL 跟踪。这是造
我正在浏览 OGLdev教程,而且我一直坚持让顶点数组对象工作。相关代码如下: glBindBuffer(GL_ARRAY_BUFFER, buffers[POS_VB]); FloatBuffer
我有两个具有 TextureView 的 fragment 来显示相机预览或播放视频。 在使用应用程序一段时间后,玩弄屏幕,我在 logcat 中收到此错误 OpenGLRenderer﹕ GL_IN
嘿,我有一个抽象所有与着色器相关的类,名为 Shader.cpp : #include "Shader.h" #include "Renderer.h" #include #include Sha
我目前正在研究阴影贴图。我找到了 Paul 的项目 http://www.paulsprojects.net/tutorials/smt/smt.html ,我目前正在尝试实现这一点。但我无法获得合适
当我在下面的代码中调用 glUniformMatrix4fv 或 glUniform4fv 时,它每次都会引发 GL_INVALID_OPERATION,我尝试更改我传递矩阵数据的方式,我传递 id
我正在使用 OpenGL 核心配置文件 3.3 版 当我调用 glVertexAttribPointer 时,我得到 GL_INVALID_OPERATION。我已经 checkout http://
我目前正在学习 OpenGL 3.X,正在使用 ubuntu 14.04。我正在使用 C 语言创建我的应用程序和 SDL2 库。 命令 glxinfo | grep "OpenGL version"
我的目标是让实例化渲染工作,但即使是单个 glDrawElements 现在也会失败。注意:此代码已在 Windows 上运行。然而在 OS X 上它失败了 GL_INVALID_OPERATION
这是我的(包装的)OpenGL 调用,它导致 GL_INVALID_OPERATION: GLTextures.TexImage2D(TexImage2DTarget.TEXTURE_2D, 0, T
我试图让 OpenGL ES 2.0 在 Windows 7 上使用(Google 的)Angle 运行,但是无论我把它放在哪里,glGetError() 都会无限返回 GL_INVALID_OPER
我正在尝试找出模板。现在我只是用模板值绘制一些框,然后读取值。每次我用 GL_STENCIL_INDEX 调用 glReadPixels 时,我都会得到 GL_INVALID_OPERATION。这是
我是一名优秀的程序员,十分优秀!