OpenGL计算着色器绑定点冗余

时间:2017-09-26 22:22:56

标签: opengl glsl compute-shader

我编写了我的第一个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());

这有效,但似乎过于复杂。 有更简单的方法吗?为什么我不能像任何其他统一一样查询缓冲区基础集?

谢谢!

1 个答案:

答案 0 :(得分:3)

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

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