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

nee*_*vek 1 opengl fbo textures

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

以下是我采取的步骤:

  1. 创建一个FBO fboA.
  2. 创建一个纹理textureA,并将其绑定为颜色附件fboA.
  3. 调用glBindFrameBuffer绑定fboA到framebuffer目标.
  4. 打电话glUseProgram使用着色器程序shaderA.
  5. 调用glDrawArrays绘制的东西(最终绘制textureA因为fboA当前是绑定的).
  6. 调用glUseProgram以使用在片段着色器中shaderB具有sampler2D统一的着色器程序.
  7. 绑定textureAsampler2D着色器程序的统一shaderB.
  8. 在片段着色器中,textureA用于设置fragColor.

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

Nic*_*las 5

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

因为" 未定义的行为 "并不排除行为可能看起来"正常工作"的可能性.UB意味着任何事情都可能发生,包括你真正想要发生的事情.

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

未定义的行为未定义.

如果你想明确定义它,那么你需要使用纹理屏障功能并遵守它的规则:在屏障之间只有一个读取/修改/写入每个片段,或者只读取和写入不同的片段.