我有一个#version 420 GLSL顶点着色器,使用imageStore函数写入uimage的texel(总是相同的)。 (在实际发布版本中,我使用了多个纹素,因此这个设置只是性能测量的极端测试用例。)
我尝试了两种不同的方式:
写入'layout(r32ui)coherent uniform uimage2D', 即,我将GL_TEXTURE_2D绑定到图像单元
写一个'layout(r32ui)coherent uniform uimageBuffer', 即,我将一个GL_TEXTURE_BUFFER绑定到图像单元,它本身有一个带有GL_STATIC_DRAW边界的VBO)
在具有360K顶点的测试场景中,对于两种替代方案,我测量不同的性能(顶点被简单地光栅化为GL_POINTS,因此片段着色器的工作量是可以忽略的):
因此,似乎imageStore到imageBuffer的速度比图像2D慢。但它变得更糟。如果我没有像上面那样使用常量坐标将图像存储到固定纹理像素,而是使用动态确定的偏移量,那么我得到了这些性能:
任何人都可以确认这种性能差异,或解释为什么写入uimageBuffer比写入uimage2D要慢得多?是因为VBO绑定到Buffer-Texture?或者我似乎做错了什么?
我还应该提到顶点着色器还使用第二个uimage2D进行一些原子计数,但每种情况都是一样的,并且与imageStore无关。