opengl – glClear()给出了英特尔HD 4000(GL 4.0)上的GL_OUT_OF_MEMORY,但没有给出GeForce(GL 4.2)……为什么?

现在,这是一个非常奇怪的行为.

TL; DR – 在渲染到纹理设置中,在调整窗口大小(帧缓冲区0)时,只有下一次调用glClear(GL_COLOR_BUFFER_BIT)才能绑定帧缓冲区0(窗口的客户区域),只有两个中的一个给出GL_OUT_OF_MEMORY然而,GPU渲染仍然正确且正确地进行.

现在,所有细节:

所以这是在带有两个GPU的Vaio Z上(可以通过机器上的物理切换按钮切换到):

> OpenGL 4.2.0 @ NVIDIA公司GeForce GT 640M LE / PCIe / SSE2(GLSL:4.20 NVIDIA通过Cg编译器)
> OpenGL 4.0.0 – 构建9.17.10.2867 @ Intel Intel(R)HD Graphics 4000(GLSL:4.00 – Build 9.17.10.2867)

我的程序是使用GLFW 64位在Win 7 64位下的64位Go 1.0.3.

我有一个相当简单和直接的渲染到纹理“迷你管道”.首先,使用最简单的着色器(没有光照,没有任何东西,只是纹理三角形网格,只是多个立方体和平面)渲染普通3D几何体到帧缓冲区,该帧缓冲区同时具有深度/模板渲染缓冲区作为深度/模板附件和texture2D作为颜色附件.对于纹理,所有过滤都被禁用,因为mip-maps也是如此.

然后,我使用texelFetch(tex,gl_FragCoord.xy,0)从所述帧缓冲纹理(颜色附件)中采样全帧四边形(实际上是单个“超大”全屏三像素),因此不使用包装.

当我强制使用核心配置文件时,以及当我不强制核心配置文件时,两个GPU都可以正常使用.没有报告GL错误,所有渲染也按预期进行.除非我在使用Intel HD 4000 GPU的GL 4.0渲染器(在Core配置文件和Comp配置文件中)调整窗口大小.仅在这种情况下,单个调整大小将在帧缓冲区0(屏幕)上的下一个glClear(GL_COLOR_BUFFER_BIT)调用之后直接记录GL_OUT_OF_MEMORY错误,但仅在调整大小后调用一次,而不是在每个后​​续循环迭代中.

有趣的是,我甚至没有对调整大小进行任何分配!我暂时禁用了窗口大小调整时出现的所有逻辑 – 也就是说,现在我只是完全忽略了窗口调整大小事件,这意味着RTT帧缓冲区及其深度和颜色附加分辨率甚至没有被更改/重新创建.这意味着下一个glViewPort仍将使用与首次创建窗口和GL上下文时相同的尺寸,但是任何错误都发生在glClear()上(不是之前,之后,只有一次 – 我进行了双重和三重检查).

这会是一个驱动程序错误,还是我在这里做错了什么?

最佳答案 HD的GL驱动程序中有趣的故障似乎是:

当我切换到渲染到纹理设置时,我还在GL上下文创建时将主帧缓冲区0(即屏幕/窗口)的深度/模板位设置为0.这是我开始看到此错误时与之前相比,帧率变得相当迟缓.

我通过实验将(严格来说不需要的)深度位设置为8,这两个问题都消失了.因此,当前的HD 4000 GL 4.0驱动程序版本似乎不喜欢在GL上下文创建时其深度缓冲区位的值为0.

点赞