OpenGL 计算着色器绑定点冗余

OpenGL Compute Shader Binding Point Redundancy

我写了我的第一个 OGL 计算着色器。经过许多小时和示例,我终于开始工作了。我不明白的程序部分之一是块索引和绑定点。 (在其他 example 之后。)

我的电脑着色器有:

layout (std430, binding=2) buffer particles
{
    particle ps[];
};
layout (std430, binding=3) buffer spheres
{
    sphere ss[];
};

我不清楚的部分是binding=X。我的设置代码如下:

        GLuint block_index =
            glGetProgramResourceIndex(
                compute_shader->getProgramId(),
                GL_SHADER_STORAGE_BLOCK,
                "particles");
        GLuint ssbo_binding_point_index = 2;
        GL_CALL(glShaderStorageBlockBinding,
            compute_shader->getProgramId(),
            block_index,
            ssbo_binding_point_index);

(注意,GL_CALL 只是转发呼叫并在之后检查错误。)

最后,我在每次调用计算着色器之前:

GL_CALL(glBindBufferBase, GL_SHADER_STORAGE_BUFFER, 2, particles->bufferId());
GL_CALL(glUseProgram, compute_shader->getProgramId());

这可行,但似乎过于复杂。 有更简单的方法吗?为什么我不能像其他统一一样查询设置缓冲区基数?

谢谢!

通过使用 layout(binding = #),您已经设置 SSBO 的块绑定索引。您不需要从代码中再次设置它;除非您 将索引更改 为新索引。你在这里使用相同的索引。

所以只需绑定缓冲区并继续前进。