我的多重渲染目标代码中有一些非常奇怪的行为,并开始怀疑我是否会灾难性地误解了这应该起作用的方式.
我正在2.1版本的上下文中运行.这是我正在执行的渲染设置代码的核心部分:
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m_fbo);
GLenum buffers[] = { GL_COLOR_ATTACHMENT0_EXT, GL_COLOR_ATTACHMENT1_EXT };
glDrawBuffers(2,buffers);
Run Code Online (Sandbox Code Playgroud)
然后我的着色器将颜色数据写入gl_FragColor[0]
和glFragColor[1]
.
这与本问题中讨论的情况基本相同.但是,当我在OS X上运行它时,我的着色器仅输出到第一个渲染目标.OpenGL在构建具有两个颜色附件的FBO期间或在渲染过程中的任何时刻都不会抛出任何错误.
当我通过OSX的"OpenGL Profiler""跟踪"视图检查正在发生的事情时,它会将此代码执行的驱动程序显示为:
2.86 µs glBindFramebufferEXT(GL_FRAMEBUFFER, 1);
3.48 µs glDrawBuffersARB(2, {GL_COLOR_ATTACHMENT0, GL_ZERO});
Run Code Online (Sandbox Code Playgroud)
这或许可以解释为什么没有写入GL_COLOR_ATTACHMENT1
; 它似乎正在被GL_ZERO
召唤中取代glDrawBuffers
!
如果我将buffers[]
数组中缓冲区的顺序切换为GL_COLOR_ATTACHMENT1_EXT
第一个然后GL_COLOR_ATTACHMENT0_EXT
,那么我的着色器只会写入GL_COLOR_ATTACHMENT1_EXT
,并且GL_COLOR_ATTACHMENT0_EXT
似乎被替换为GL_ZERO
.
这就是它变得奇怪的地方.如果我使用代码:
GLenum buffers[] = { GL_COLOR_ATTACHMENT0_EXT, GL_COLOR_ATTACHMENT1_EXT };
glDrawBuffers(3, buffers);
Run Code Online (Sandbox Code Playgroud)
然后统计视图显示:
0.46 µs glDrawBuffersARB(3, {GL_COLOR_ATTACHMENT0, GL_ZERO, GL_COLOR_ATTACHMENT1});
Run Code Online (Sandbox Code Playgroud)
OpenGL仍然没有抛出错误,我的着色器成功地将数据写入两个颜色附件,即使它正在写入gl_FragColor[0]
和gl_FragColor[1]
.
所以即使我的程序现在正在运行,在我看来这样做也不行.我很想知道我能推动多远,希望将OpenGL推向最终的失败将是有教育意义的.所以我尝试用这段代码编译:
GLenum buffers[] = { …
Run Code Online (Sandbox Code Playgroud) opengl ×1