OpenGL - 使用索引1调用glBindBufferBase会导致渲染失败(全黑)

6

我的着色器中有一个统一块的数组,定义如下:

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

    float dist;

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

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

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

这很好,只要我绑定单个缓冲到绑定索引0。一旦有更多的,所有东西都是漆黑的(即使使用完全不同的着色器)。 (glGetError没有返回任何错误)
如果我将块索引范围从0-11更改为2-13(跳过索引1),则一切正常工作。我想,如果我使用索引1,我正在覆盖某些内容,但是我的着色器中没有其他统一块,并且我没有在我的代码中使用glUniformBlockBinding或glBindBufferBase,所以我不确定。
什么可能导致这种行为?索引1保留用于某些内容吗?
1个回答

0

1) 不要使用多个代码块,而是使用一个带有数组的代码块。就像这样:

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

跳过glUniformBlockBinding,只使用在着色器中指定的索引绑定缓冲区

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接