我的着色器有一个统一的块:
layout (std140) uniform LightSourceBlock
{
vec3 test;
vec3 color;
} LightSources;
这个块的数据应该来自一个缓冲对象,它是这样创建的:
GLuint buffer;
glGenBuffers(1,&buffer);
GLfloat data[6] = {
0,0,0,
0,0,1
};
glBindBuffer(GL_UNIFORM_BUFFER,buffer);
glBufferData(GL_UNIFORM_BUFFER,sizeof(data),&data[0],GL_DYNAMIC_DRAW);
缓冲区在渲染之前链接到统一块:
unsigned int locLightSourceBlock = glGetUniformBlockIndex(program,"LightSourceBlock");
glUniformBlockBinding(program,locLightSourceBlock,8);
glBindBufferBase(GL_UNIFORM_BUFFER,8,buffer);
根据我的理解,这应该是将着色器中块内的“颜色”设置为(0,0,1),但我得到的值是(0,1,0)。
如果我从块中删除'test'变量并仅将三个浮点数(0,0,1)绑定到着色器,它将按预期工作。
发生了什么事?
答案 0 :(得分:3)
正如您为UBO指定layout (std140)
一样,您必须遵守其中定义的alginment规则。该布局首先在OpenGL 3.2 core spec,第2.11.4节“统一变量”中的“标准统一块布局”小节中指定(在核心中):
- 如果该成员是消耗N个基本机器单位的标量,则基本对齐为N。
- 如果该成员是一个双组分或四组分向量,其组件消耗N个基本机器单元,则基本对齐为2N或4N, 分别
- 如果该成员是一个三分量向量,其组件消耗N个基本机器单位,则基本对齐为4N。
- 如果成员是标量或向量的数组,则将基本对齐和数组步长设置为匹配单个数组的基本对齐方式 元素,根据规则(1),(2)和(3),并向上舍入到 vec4的碱基对齐。阵列末端可能有填充;该 数组后面的成员的基本偏移量向上舍入到 下一个基本对齐的多个。
- 如果成员是具有C列和R行的列主矩阵,则矩阵与C列向量的数组相同地存储 根据规则(4),每个R组件。
- 如果成员是具有C列和R行的S列主矩阵的数组,则矩阵与S C列的行相同地存储 根据规则(4),每个都有R个成分的载体。
- 如果成员是具有C列和R行的行主矩阵,则矩阵与具有C的R行向量的数组相同地存储 根据规则(4),每个组成部分。
- 如果成员是具有C列和R行的S行主矩阵的数组,则矩阵与S R行的行相同地存储 根据规则(4),每个载有C组分的载体。
- 如果成员是结构,则结构的基本对齐为N,其中N是其中任何一个的最大基本对齐值 成员,并向上舍入到vec4的基本对齐方式。该 然后,为该子结构的各个成员分配偏移量 递归地应用这组规则,其中基本偏移量 子结构的第一个成员等于对齐的偏移量 结构。该结构可以在末端具有填充物;基地 子结构后的成员偏移量向上舍入到 下一个结构的基础对齐的多个。
- 如果成员是S结构的数组,则根据规则(9),数组的S元素按顺序排列。
醇>
对于您的情况,第3点适用。因此,您需要在第二个向量开始之前填充另一个浮点数。