我创建了一个FBO,并将纹理绑定为其颜色附件,我有多个着色器程序对纹理进行一些后期处理,一切都很好,但对我来说纹理没有意义用作输入(sampler2D)以及着色器的输出同时。
以下是我采取的步骤:
fboA
。textureA
,并将其绑定为fboA
的颜色附件。glBindFrameBuffer
将fboA
绑定到帧缓冲区目标。glUseProgram
以使用着色器程序shaderA
。glDrawArrays
绘制内容(最终在textureA
上绘制,因为fboA
当前已绑定)。glUseProgram
以使用在片段着色器中具有shaderB
制服的着色器程序sampler2D
。textureA
绑定为着色器程序sampler2D
的{{1}}制服。shaderB
用于设置textureA
。我最困惑的是最后两个步骤,其中fragColor
用作片段着色器的输入,仍然绑定到当前帧缓冲区。在我看来,片段着色器正在读取和写入同一块内存,这不是某种未定义的行为,为什么它仍能正常工作?
答案 0 :(得分:5)
这不是某种未定义的行为,为什么它仍能正常工作?
因为" undefined behavior"并不排除行为可能表现为"正常工作"。 UB意味着任何都可能发生,包括你真正想要发生的事情。
当然,它可能突然停止"工作"明天。或者当您将代码带到不同的GPU时。或者如果你开始渲染更多的东西。或者如果你真的很难在电脑上呼吸。
未定义的行为未定义。
如果你想明确定义它,那么你需要使用texture barrier功能并遵守它的规则:在障碍之间不得超过一个读/修改/写入每个片段,或者只读取和写不同的片段。