glTextureBarrier()和glMemoryBarrier(GL_TEXTURE_FETCH_BARRIER_BIT)的区别

7

glMemoryBarrier可用于GL 4.2及更高版本,而glTextureBarrier可用于GL 4.5。

当每个纹理元素被纹理获取恰好一次时,glTextureBarrier允许同时渲染到相同的纹理,并且片段着色器从中获取。

我想知道glMemoryBarrier(GL_TEXTURE_FETCH_BARRIER_BIT)是否也允许这样做?如果不是,是否有一个等效于glTextureBarrier的OpenGL ES 选项?

1个回答

4

glTextureBarrier允许在片段着色器从纹理中获取数据时同时渲染到同一纹理,前提是纹理的每个像素都被纹理获取恰好一次。

不是这样的。

glTextureBarrier是一个函数。ARB_texture_barrier是一个扩展(也是GL 4.5的一部分)。作为规范更改的一部分,ARB_texture_barrier扩展允许对附加图像进行一次读取/修改/写入。

现在,调用glTextureBarrier将允许您进行第二次读取/修改/写入操作。您可以再次调用它以获得另一个通行证。但是,glTextureBarrier本身并不会给您读取/修改/写入权限。整个扩展提供了这个功能。

此外,请注意这两个函数没有任何共同之处。

glMemoryBarrier(GL_TEXTURE_FETCH_BARRIER_BIT)仅适用于不连贯的内存操作(SSBOs / image load / store)的写入。该屏障位表示在此函数之前发出的不连贯写入将对此函数之后发出的纹理采样操作可见。

glTextureBarrier专门适用于对帧缓冲附加图像的写入和在着色器中随后读取它们。帧缓冲写操作不是不一致的内存操作,因此它们不受glMemoryBarrier调用的控制。

如果没有,是否有OpenGL ES等效的glTextureBarrier?

目前还没有。考虑到实现ES的硬件类型,它不太可能到达那里。虽然这个通用的想法对于基于瓷砖的渲染器很有价值,但对于它们来说,它只是错误的抽象。

Vulkan的输入附件和管道屏障更适合在TBR中执行此类操作。


1
这是否意味着如果可用texture_barrier扩展,我可以将一个对象渲染到FBO中,然后使用一个片段着色器将全屏四边形渲染到相同的FBO中,该片段着色器作为纹理获取此FBO的颜色附件(gl_FragCoord.xy),以实现全屏效果,并且在绘制全屏四边形之前不需要调用glTextureBarrier?还是说在这种情况下我仍需要glTextureBarrier? - matthias_buehlmann
此外,“read/modify/write pass”是什么意思?如果纹理是多采样纹理,是否允许读取源像素的所有采样,或者这不被视为单次读取? - matthias_buehlmann

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接