我编写了我的第一个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());
这有效,但似乎过于复杂。 有更简单的方法吗?为什么我不能像任何其他统一一样查询缓冲区基础集?
谢谢!
答案 0 :(得分:3)
使用layout(binding = #)
,您已经已经设置 SSBO的块绑定索引。您不需要再从代码中重新设置它;除非您将索引更改为新索引。你在这里使用相同的索引。
所以只需绑定缓冲区并继续前进。