Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
OpenGL计算着色器绑定点冗余_Opengl_Glsl_Compute Shader - Fatal编程技术网

OpenGL计算着色器绑定点冗余

OpenGL计算着色器绑定点冗余,opengl,glsl,compute-shader,Opengl,Glsl,Compute Shader,我写了我的第一个OGL计算着色器。经过许多小时和例子,我终于把事情做好了。我不理解的程序部分之一是块索引和绑定点。(除此之外,还包括以下内容。) 我的计算机着色器具有: layout (std430, binding=2) buffer particles { particle ps[]; }; layout (std430, binding=3) buffer spheres { sphere ss[]; }; 我不清楚的部分是binding=X。我的设置代码包含以下内容:

我写了我的第一个OGL计算着色器。经过许多小时和例子,我终于把事情做好了。我不理解的程序部分之一是块索引和绑定点。(除此之外,还包括以下内容。)

我的计算机着色器具有:

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
只是转发呼叫,然后检查错误。)

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

GL_CALL(glBindBufferBase, GL_SHADER_STORAGE_BUFFER, 2, particles->bufferId());
GL_CALL(glUseProgram, compute_shader->getProgramId());
这是可行的,但似乎过于复杂。有没有更简单的方法?为什么我不能像任何其他制服一样查询设置缓冲区基

谢谢

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


因此,只需绑定缓冲区并继续前进。

您链接到的教程已经告诉您我的答案:“实际上,这最后一步不是必需的:绑定点可以直接在缓冲区布局中的GLSL着色器中硬编码:”等等,上面有什么不必要的吗?还是说“前进”,你是说“接受它”?(这也很好)@Tim:“你不需要从代码中重新设置”的哪一部分你不明白?