Opengl和Webgl:从附加到当前帧缓冲区的纹理中采样

时间:2018-04-25 05:51:10

标签: opengl webgl direct3d framebuffer

我有一个帧缓冲区,附加了两个纹理t0t1

在第一遍中,我使用多个片段着色器输出渲染它们。

在第二轮之前,我会做以下事情:

  • 仅使用一个输出打开着色器
  • t1绑定到纹理单元
  • 调用glDrawBuffers禁用写入t1的附件

请注意,t1用于抽样,但它仍然绑定到当前帧缓冲区。据我了解,这种配置中没有环回。

OpenGL和WebGL都合法吗?

我制作的example在Linux下的Chrome和Firefox中完美运行,但在两种浏览器中都呈现黑屏。是D3D支持的Webgl实现的原因,它的主动纹理解除绑定为here

2 个答案:

答案 0 :(得分:3)

  

据我了解,此类配置中没有环回。

但是有一个。

在GL-4.5之前(包括WebGL),只要您从当前附加到帧缓冲区的纹理中读取feedback loops,就会发生post-GL 4.5。如果你现在不写信也没关系。此时无法写入它并不重要。只要它附加到帧缓冲区,就会从读取中获得未定义的行为(除非它们是从未附加的mipmap级别读取的)。

http://javaevangelist.blogspot.de/2012/05/jsf-2-tip-of-day-programmatic.html包含WebGL)或纹理屏障扩展名中,这是放松的。但还不足以解决你的问题。当您尝试从仍附加到帧缓冲区的图像中读取先前调用中写入的像素时,仍会触发UB。

因此,您必须更改FBO以便不再附加图像,或者您必须发出纹理屏障(如果您有权访问4.5 / ARB / NV_texture_barrier,您可能会在桌面GL上访问)。

答案 1 :(得分:1)

在WebGL1和WebGL2中这都是非法的。如果存在反馈循环,则WebGL必须生成INVALID_OPERATION错误。

From the spec section 6.25

  

6.25纹理和帧缓冲区之间的反馈循环

     

在OpenGL ES 2.0 API中,可以进行同时写入和读取相同纹理的调用,从而创建反馈循环。它指定存在这些反馈循环的位置会导致未定义的行为。

     

在WebGL API中,将导致此类反馈循环(根据OpenGL ES 2.0规范中的定义)的操作将生成INVALID_OPERATION错误。

正如您所指出的,听起来您的情况似乎没有实际的反馈回路,但是正如Nicol根据规范指出的那样,仍然存在。 This appears to be a bug both Chrome and Firefox