OpenGL / GLSL - 统一块数据值不正确

时间:2013-12-27 21:03:34

标签: c++ opengl glsl shader

我的着色器有一个统一的块:

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)绑定到着色器,它将按预期工作。

发生了什么事?

1 个答案:

答案 0 :(得分:3)

正如您为UBO指定layout (std140)一样,您必须遵守其中定义的alginment规则。该布局首先在OpenGL 3.2 core spec,第2.11.4节“统一变量”中的“标准统一块布局”小节中指定(在核心中):

  
      
  1. 如果该成员是消耗N个基本机器单位的标量,则基本对齐为N。
  2.   
  3. 如果该成员是一个双组分或四组分向量,其组件消耗N个基本机器单元,则基本对齐为2N或4N,   分别
  4.   
  5. 如果该成员是一个三分量向量,其组件消耗N个基本机器单位,则基本对齐为4N。
  6.   
  7. 如果成员是标量或向量的数组,则将基本对齐和数组步长设置为匹配单个数组的基本对齐方式   元素,根据规则(1),(2)和(3),并向上舍入到   vec4的碱基对齐。阵列末端可能有填充;该   数组后面的成员的基本偏移量向上舍入到   下一个基本对齐的多个。
  8.   
  9. 如果成员是具有C列和R行的列主矩阵,则矩阵与C列向量的数组相同地存储   根据规则(4),每个R组件。
  10.   
  11. 如果成员是具有C列和R行的S列主矩阵的数组,则矩阵与S C列的行相同地存储   根据规则(4),每个都有R个成分的载体。
  12.   
  13. 如果成员是具有C列和R行的行主矩阵,则矩阵与具有C的R行向量的数组相同地存储   根据规则(4),每个组成部分。
  14.   
  15. 如果成员是具有C列和R行的S行主矩阵的数组,则矩阵与S R行的行相同地存储   根据规则(4),每个载有C组分的载体。
  16.   
  17. 如果成员是结构,则结构的基本对齐为N,其中N是其中任何一个的最大基本对齐值   成员,并向上舍入到vec4的基本对齐方式。该   然后,为该子结构的各个成员分配偏移量   递归地应用这组规则,其中基本偏移量   子结构的第一个成员等于对齐的偏移量   结构。该结构可以在末端具有填充物;基地   子结构后的成员偏移量向上舍入到   下一个结构的基础对齐的多个。
  18.   
  19. 如果成员是S结构的数组,则根据规则(9),数组的S元素按顺序排列。
  20.   

对于您的情况,第3点适用。因此,您需要在第二个向量开始之前填充另一个浮点数。