gpt4 book ai didi

c++ - 多个 GLSL 统一缓冲区

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:14:39 25 4
gpt4 key购买 nike

我在使用多个统一缓冲区时遇到问题。

这是我的 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 不是那样工作的。它检索一个标识该特定统一 block 的数字。它不是要传递给 glBindBufferRange/Base 的统一缓冲区绑定(bind)索引。

UBO 绑定(bind)与纹理绑定(bind)非常相似。您告诉程序要查找的插槽。对于纹理,您可以获得纹理的统一位置,然后将该统一的值设置为纹理单元索引。使用 UBO,您可以获得 block 的 block 索引,将该 block 索引的绑定(bind)值设置为它将查找的统一缓冲区绑定(bind)点。

所以你应该从 glGetUniformBlockIndex 中获取索引并使用 glUniformBlockBinding为它分配一个缓冲区绑定(bind)点。然后将您的缓冲区绑定(bind)到您分配给统一 block 的绑定(bind)点。

关于c++ - 多个 GLSL 统一缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12746040/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com