glMemoryBarrier可用于GL 4.2及更高版本,而glTextureBarrier可用于GL 4.5。
当每个纹理元素被纹理获取恰好一次时,glTextureBarrier允许同时渲染到相同的纹理,并且片段着色器从中获取。
我想知道glMemoryBarrier(GL_TEXTURE_FETCH_BARRIER_BIT)是否也允许这样做?如果不是,是否有一个等效于glTextureBarrier的OpenGL ES 选项?
glMemoryBarrier可用于GL 4.2及更高版本,而glTextureBarrier可用于GL 4.5。
当每个纹理元素被纹理获取恰好一次时,glTextureBarrier允许同时渲染到相同的纹理,并且片段着色器从中获取。
我想知道glMemoryBarrier(GL_TEXTURE_FETCH_BARRIER_BIT)是否也允许这样做?如果不是,是否有一个等效于glTextureBarrier的OpenGL ES 选项?
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中执行此类操作。