我有一个带有两个纹理的帧缓冲区t0
and t1
随附的。
在第一遍中,我使用多个片段着色器输出渲染它们。
在第二遍之前,我执行以下操作:
- 打开仅具有一个输出的着色器
- Bind
t1
到纹理单元
- 调用 glDrawBuffers 禁用写入
t1
的附件
注意t1
用于采样,但它仍然绑定到当前帧缓冲区。据我了解,这种配置中没有环回。
它在 OpenGL 和 WebGL 中都合法吗?
我做了一个example它在 Linux 下的 Chrome 和 Firefox 中完美运行,但在 Windows 下的两种浏览器中都会呈现黑屏。这是 D3D 支持的 Webgl 实现中的原因,并且正如所指出的那样,它是积极的纹理解除绑定here?
据我了解,这种配置中没有环回。
但有一个。
在 GL 4.5 之前的版本(包括 WebGL)中,反馈回路每当您从当前附加到帧缓冲区的纹理读取数据时都会发生这种情况。如果你现在不写信也没关系。你没关系can't此刻写信给它。只要它附加到帧缓冲区,您就会在读取它时得到未定义的行为(除非它们是从未附加的 mipmap 级别读取的)。
In GL 4.5 后 (which doesn't包括 WebGL)或使用纹理屏障扩展,这很轻松。但还不足以解决你的问题。当您尝试从仍附加到帧缓冲区的图像读取先前调用中写入的像素时,UB 仍会被触发。
因此,您必须更改 FBO,以便不再附加图像,或者必须发出纹理屏障(如果您有权访问 4.5/ARB/NV_texture_barrier,在桌面 GL 上您可能会这样做)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)