现在,这是一个非常奇怪的行为。
TL;DR - 在渲染到纹理设置中,在调整窗口大小(帧缓冲区 0)时,只有下一次调用glClear(GL_COLOR_BUFFER_BIT)绑定帧缓冲区 0(窗口的客户区)才会给出GL_OUT_OF_MEMORY,仅在两个之一上GPU,但是渲染仍然正确且正确地进行。
现在,所有坚韧不拔的细节:
所以这是在带有两个 GPU 的 Vaio Z 上(可以通过机器上的物理切换按钮切换到):
OpenGL 4.2.0 @ NVIDIA Corporation GeForce GT 640M LE/PCIe/SSE2(GLSL:4.20 NVIDIA 通过 Cg 编译器)
OpenGL 4.0.0 - Build 9.17.10.2867 @ Intel Intel(R) HD Graphics 4000 (GLSL: 4.00 - Build 9.17.10.2867)
我的程序在使用 GLFW 64 位的 Win 7 64 位下的 Go 1.0.3 64 位。
我有一个相当简单直接的渲染到纹理“迷你管道”。首先,使用最简单的着色器(没有照明,什么都没有,只是纹理三角形网格,它们只是一些立方体和平面)将普通 3D 几何图形渲染到一个帧缓冲区,该帧缓冲区具有作为深度/模板附件的深度/模板渲染缓冲区和一个texture2D 作为颜色附件。对于纹理,所有过滤都被禁用,mip-maps 也是如此。
然后,我使用 texelFetch(tex, gl_FragCoord.xy, 0) 从所述帧缓冲区纹理(颜色附件)中采样渲染一个全屏四边形(实际上是一个“超大”全屏 tri),因此不使用包装。
当我强制核心配置文件和不强制使用核心配置文件时,两个 GPU 都可以很好地呈现这一点。没有为此报告任何 GL 错误,所有渲染也都按预期进行。除非我在使用 Intel HD 4000 GPU 的 GL 4.0 渲染器(在核心配置文件和 Comp 配置文件中)时调整窗口大小。只有在这种情况下,单个调整大小将在帧缓冲区 0(屏幕)上的下一个 glClear(GL_COLOR_BUFFER_BIT) 调用之后直接记录 GL_OUT_OF_MEMORY 错误,但仅在调整大小后记录一次,而不是在每个后续循环迭代中。
有趣的是,我什至实际上并没有对调整大小进行任何分配!我暂时禁用了窗口调整大小时发生的所有逻辑——也就是说,现在我完全忽略了窗口调整大小事件,这意味着 RTT 帧缓冲区及其深度和颜色附件分辨率甚至没有更改/重新创建。这意味着下一个 glViewPort 仍将使用与第一次创建窗口和 GL 上下文时相同的尺寸,但无论如何错误发生在 glClear() 上(不是之前,只是之后,只有一次 - 我已经双重和三重检查了)。
这会是驱动程序错误,还是我在这里做错了什么?