[英]Multiple GLSL uniform buffers
我在使用多个统一缓冲区时遇到问题。
这是我的GLSL代码:
layout(std140) uniform MaterialInfo {
vec3 Ka;
vec3 Ks;
vec3 Kd;
};
layout(std140) uniform LightInfo {
vec3 La;
vec3 Ls;
vec3 Ld;
};
这就是我创建和填充缓冲区的方式:
blockIndex = glGetUniformBlockIndex(program, "MaterialInfo");
if (blockIndex == -1) {
fprintf(stderr, "Could not bind uniform block\n");
}
glGenBuffers(1, &materialUbo);
glBindBuffer(GL_UNIFORM_BUFFER, materialUbo);
glBufferData(GL_UNIFORM_BUFFER, sizeof(MaterialBlock), &mesh->material, GL_DYNAMIC_DRAW);
glBindBufferBase(GL_UNIFORM_BUFFER, blockIndex, materialUbo);
blockIndex = glGetUniformBlockIndex(program, "LightInfo");
if (blockIndex == -1) {
fprintf(stderr, "Could not bind uniform block\n");
}
glGenBuffers(1, &lightUbo);
glBindBuffer(GL_UNIFORM_BUFFER, lightUbo);
glBufferData(GL_UNIFORM_BUFFER, sizeof(LightBlock), &light->lightBlock, GL_DYNAMIC_DRAW);
glBindBufferBase(GL_UNIFORM_BUFFER, blockIndex, lightUbo);
当结构定义如下:
struct LightBlock {
glm::vec4 La;
glm::vec4 Ld;
glm::vec4 Ls;
};
struct MaterialBlock {
glm::vec4 Ka;
glm::vec4 Ks;
glm::vec4 Kd;
};
如果我只使用一个统一缓冲区,这段代码工作正常。 这就是MaterialInfo。 如果我为lightInfo包含第二个缓冲区,那么当我在渲染后到达glDrawElements()时会出现崩溃。
使用像这样的多个统一缓冲区有问题吗? 我能把它变成1个UBO吗?
glGetUniformBlockIndex
不起作用。 它检索标识该特定统一块的数字。 它不是传递给glBindBufferRange/Base
的统一缓冲区绑定索引。
UBO绑定很像纹理绑定。 您告诉程序要查看哪个插槽。使用纹理,您可以获得纹理的统一位置,然后将该均匀值设置为纹理单位索引。 使用UBO,您可以获得块的块索引,将该块索引的绑定值设置为它将看起来的统一缓冲区绑定点。
所以你应该从glGetUniformBlockIndex
获取索引并使用glUniformBlockBinding
为它分配一个缓冲区绑定点。 然后将缓冲区绑定到分配给统一块的绑定点。
只是为了扩展Nicol的答案。 大多数样本都会混淆分配和使用,并且他们对使用槽进行硬编码,因此只支持一个缓冲区,这真的令人困惑,只是自己输了一天。
设置着色器初始化:
m_ubo_transform_block_index = glGetUniformBlockIndex(m_gl_program_object, "transform_uniforms");
if (m_ubo_transform_block_index != -1)
{
glUniformBlockBinding(m_gl_program_object, m_ubo_transform_block_index, UBO_TRANSFORM_INDEX);
}
UBO_TRANSFORM_INDEX就像一个纹理单元一样。
在抽奖时使用:
if(m_ubo_transform_block_index != -1)
{
glBindBufferBase(GL_UNIFORM_BUFFER, UBO_TRANSFORM_INDEX, uniform_buffer->m_uniform_transform_buffer_object);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.