2017-08-08 95 views
1

我创建了一个FBO并将纹理绑定为其颜色附件,并且我有多个着色器程序对纹理进行一些后期处理,所有内容效果很好,但对我来说纹理可以用作输入(sampler2D)以及着色器同时输出是没有意义的。纹理同时用作着色器程序的FBO颜色附件和sampler2D

以下是我所采取的步骤:

  1. 创建FBO fboA
  2. 创建纹理textureA,并将其绑定为fboA的颜色附件。
  3. 调用glBindFrameBufferfboA绑定到帧缓冲区目标。使用着色器程序shaderA
  4. 致电glDrawArrays绘制一些东西(最终绘制在textureA上,因为fboA目前已绑定)。
  5. 致电glUseProgram使用着色器程序shaderB其在片段着色器中具有sampler2D制服。
  6. 绑定textureA作为sampler2D统一着色器程序shaderB
  7. 在片段着色器中,textureA用于设置fragColor

我感到困惑的是最后两个步骤,其中textureA作为片段着色器的输入,它仍然被绑定到当前帧缓存。在我看来,片段着色器正在读取和写入同一片内存,这不是一种未定义的行为,为什么它仍然正常工作?

回答

5

是不是这种某种未定义的行为,为什么它仍然正常工作?

因为“undefined behavior”并不排除行为似乎可以“正常工作”的可能性。 UB意思是任何东西都可能发生,包括你实际想要发生的事情。

当然,明天可能会突然停止“工作”。或者当你把你的代码放到不同的GPU上。或者如果你开始渲染更多的东西。或者,如果你真的很难在你的电脑上呼吸。

未定义的行为是undefined

如果您想使其定义明确,那么您需要使用texture barrier功能并遵守其规则:不超过一次读/修改/写障碍之间的每片段,或者只读取和写入不同的片段。

+0

谢谢,正是我想知道的。此外,我只是指向[反馈循环](https://www.khronos.org/opengl/wiki/Framebuffer_Object#Feedback_Loops)。 – neevek