在使用计算着色器时,我看到大多数示例只是创建了 GL_SHADER_STORAGE_BUFFERS,就像普通缓冲区一样:
glGenBuffers、glBindBuffer、glBufferData
然后它们的使用方式如下:
glUseProgram(computeShader);
glBindBufferRange(GL_SHADER_STORAGE_BUFFER, **3**, bufferA, 0, bufferSize);
glBindBufferRange(GL_SHADER_STORAGE_BUFFER, **4**, bufferB, 0, bufferSize);
glDispatchCompute(computeShader);
在计算着色器中,缓冲区声明如下:
layout ( **binding = 3** ) buffer
buffer1
{
vec4 data1[];
};
layout ( **binding = 4** ) buffer
buffer2
{
vec4 data2[];
};
然后我得到了一些建议,在初始化之后我应该做这样的事情:
GLuint index = glGetProgramResourceIndex(computeShader, GL_SHADER_STORAGE_BLOCK, "buffer1");
glShaderStorageBlockBinding(shader, index, index);
为什么这是必要的?
由于 glBindBufferRange 需要布局(binding = x)指定的索引,它有什么用途?
最佳答案
在这种情况下,它没有任何目的。您已经在着色器中显式设置了绑定(bind) - 但如果您查询着色器存储 block 的索引,您也可以手动执行此操作。您可能希望在加载时更改它,而不是将其硬编码到着色器中,因为着色器存储缓冲区对象可以使用全局绑定(bind)点共享,就像统一缓冲区对象一样。
事实上,它们与 UBO 非常相似,甚至 API 几乎完全相同。真正的区别在于您可以:
- 在着色器中写入它们(如果这样做,最好使用内存屏障)
- 使用更大的存储空间(至少 16 MiB)
- 长度可变。
引入 UBO 时,尚未创建 ARB_shading_language_420pack
(提供 layout (binding = ...)
);这可能就是为什么您会看到显式绑定(bind) SSB 指数的建议。
关于c++ - 了解 GL_SHADER_STORAGE_BLOCK 绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21165289/