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