纹理同时用作着色器程序的FBO颜色附件和sampler2D

时间:2017-08-08 15:19:20

标签: opengl textures fbo

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

以下是我采取的步骤:

  1. 创建FBO fboA
  2. 创建纹理textureA,并将其绑定为fboA的颜色附件。
  3. 调用glBindFrameBufferfboA绑定到帧缓冲区目标。
  4. 致电glUseProgram以使用着色器程序shaderA
  5. 调用glDrawArrays绘制内容(最终在textureA上绘制,因为fboA当前已绑定)。
  6. 调用glUseProgram以使用在片段着色器中具有shaderB制服的着色器程序sampler2D
  7. textureA绑定为着色器程序sampler2D的{​​{1}}制服。
  8. 在片段着色器中,shaderB用于设置textureA
  9. 我最困惑的是最后两个步骤,其中fragColor用作片段着色器的输入,仍然绑定到当前帧缓冲区。在我看来,片段着色器正在读取和写入同一块内存,这不是某种未定义的行为,为什么它仍能正常工作?

1 个答案:

答案 0 :(得分:5)

  

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

因为" undefined behavior"并不排除行为可能表现为"正常工作"。 UB意味着任何都可能发生,包括你真正想要发生的事情。

当然,它可能突然停止"工作"明天。或者当您将代码带到不同的GPU时。或者如果你开始渲染更多的东西。或者如果你真的很难在电脑上呼吸。

未定义的行为未定义

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