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 的块绑定索引。您不需要从代码中再次设置它;除非您 将索引更改 为新索引。你在这里使用相同的索引。
所以只需绑定缓冲区并继续前进。
我写了我的第一个 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 的块绑定索引。您不需要从代码中再次设置它;除非您 将索引更改 为新索引。你在这里使用相同的索引。
所以只需绑定缓冲区并继续前进。