【问题标题】:Understanding GL_SHADER_STORAGE_BLOCK binding了解 GL_SHADER_STORAGE_BLOCK 绑定
【发布时间】:2014-01-16 15:01:03
【问题描述】:

在使用计算着色器时,我看到大多数示例只是创建了 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 需要 layout(binding = x) 指定的索引,它有什么目的?

【问题讨论】:

  • 代码中那些随机的**在做什么?
  • 我只是想把它们加粗...

标签: c++ opengl glsl


【解决方案1】:

在这种情况下,它没有任何目的。您已经在着色器中明确设置了绑定 - 但如果您查询着色器存储块的索引,您也可以手动进行。您可能希望在加载时更改它而不是将其硬编码到着色器中,因为着色器存储缓冲区对象可以使用全局绑定点进行共享,就像统一缓冲区对象一样。

事实上,它们与 UBO 非常相似,甚至具有几乎相同的 API。真正的区别在于您可以:

  1. 在着色器中写入它们(如果这样做,最好使用内存屏障)
  2. 使用更大的存储空间(至少 16 MiB)
  3. 长度可变。

在引入 UBO 时,尚未创建 ARB_shading_language_420pack(提供 layout (binding = ...));这可能就是您看到显式绑定 SSB 索引的建议的原因。

【讨论】:

    猜你喜欢
    • 2010-09-20
    • 2012-02-16
    • 1970-01-01
    • 2017-05-03
    • 2011-07-19
    • 1970-01-01
    • 2023-02-24
    • 2016-06-09
    • 1970-01-01
    相关资源
    最近更新 更多