OpenGL计算着色器绑定点冗余
我写了我的第一个OGL计算着色器。经过许多小时和例子,我终于把事情做好了。我不理解的程序部分之一是块索引和绑定点。(除此之外,还包括以下内容。) 我的计算机着色器具有: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。我的设置代码包含以下内容:
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:“你不需要从代码中重新设置”的哪一部分你不明白?