c++ - 了解 GL_SHADER_STORAGE_BLOCK 绑定(bind)

标签 c++ opengl glsl

在使用计算着色器时,我看到大多数示例只是创建了 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 几乎完全相同。真正的区别在于您可以:

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

引入 UBO 时,尚未创建 ARB_shading_language_420pack(提供 layout (binding = ...));这可能就是为什么您会看到显式绑定(bind) SSB 指数的建议。

关于c++ - 了解 GL_SHADER_STORAGE_BLOCK 绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21165289/

相关文章:

c++ - 右循环

c++ - 为什么 Visual Studio 2012 不为我插入括号?

opengl - GLSL:如何获得像素 x、y、z 世界位置?

opengl - 是否可以使用 GLSL 着色器实现视频编解码器?

c++ - 如何使用QSqlQueryModel处理海量数据?

C++ 通用 Windows 应用程序仅在安装驱动器上的 VS2015 项目时有效

java - JOGL 如何搜索 OpenGL 库?

c++ - GLSL NVidia 方形工件

c++ - 无法将纹理绑定(bind)到 GL_QUADS

javascript - 支持着色和纹理的 GLSL 着色器