glClear()给出了Intel HD 4000(GL 4.0)上的GL_OUT_OF_MEMORY,但没有给GeForce(GL 4.2)......为什么?

时间:2013-01-25 17:55:12

标签: opengl go framebuffer render-to-texture

现在,这是一种非常奇怪的行为。

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

现在,所有细节:

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

  1. OpenGL 4.2.0 @ NVIDIA Corporation GeForce GT 640M LE / PCIe / SSE2(GLSL:4.20 NVIDIA via Cg编译器)

  2. OpenGL 4.0.0 - Build 9.17.10.2867 @ Intel Intel(R)HD Graphics 4000(GLSL:4.00 - Build 9.17.10.2867)

  3. 我的程序使用64位的GLFW在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()上(不是之前,之后,只有一次 - 我进行了双重和三重检查)。

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

1 个答案:

答案 0 :(得分:2)

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

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

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