gpt4 book ai didi

OpenGL - 使用 index = 1 调用 glBindBufferBase 会中断渲染(黑色)

转载 作者:行者123 更新时间:2023-12-03 15:01:58 27 4
gpt4 key购买 nike

我的着色器中有一组统一 block ,其定义如下:

layout (std140) uniform LightSourceBlock
{
int shadowMapID;
int type;
vec3 position;
vec4 color;

float dist;

vec3 direction;
float cutoffOuter;
float cutoffInner;
float attenuation;
} LightSources[12];

为了能够将我的缓冲区对象绑定(bind)到每个光源,我将每个统一绑定(bind)到统一 block 索引:
for(unsigned int i=0;i<12;i++)
glUniformBlockBinding(program,locLightSourceBlock[i],i); // locLightSourceBlock contains the locations of each element in LightSources[]

渲染时,我使用以下方法将缓冲区绑定(bind)到相应的索引:
glBindBufferBase(GL_UNIFORM_BUFFER,i,buffer);

只要我只将一个缓冲区绑定(bind)到绑定(bind)索引 0,这就可以正常工作。只要有更多,一切都是漆黑的(即使是使用完全不同着色器的东西)。 (glGetError 不返回错误)

如果我将 block 索引范围从 0-11 更改为 2-13(跳过索引 1),则一切正常。我想如果我使用索引 1,我会覆盖一些东西,但我的着色器中没有任何其他统一 block ,而且我没有在代码中的其他任何地方使用 glUniformBlockBinding 或 glBindBufferBase,所以我不确定。

什么可能导致这种行为?索引 1 是为某些东西保留的吗?

最佳答案

1)不要使用多个 block 。使用一个带有数组的 block 。像这样的东西:

struct Light{
...
}
layout(std430, binding=0) uniform lightBuffer{
Light lights[42];
}

跳过 glUniformBlockBinding 并且只有 glBindBufferBase 到着色器中指定的索引

2) 阅读 std140、std430 的对齐方式。简而言之,缓冲区变量是对齐的,因此它们不会跨越 128 位边界。因此,在您的情况下,位置将从字节 16(而不是 8)开始。这会导致 CPU/GPU 端访问不匹配。 (重新排序变量或添加填充)

关于OpenGL - 使用 index = 1 调用 glBindBufferBase 会中断渲染(黑色),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21498407/

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