OpenGL / GLSL - 统一块数据值不正确
Posted
技术标签:
【中文标题】OpenGL / GLSL - 统一块数据值不正确【英文标题】:OpenGL / GLSL - Uniform block data values incorrect 【发布时间】:2013-12-27 21:03:33 【问题描述】:我的着色器有一个这样的统一块:
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)。
如果我从块中删除“测试”变量并且只将三个浮点数 (0,0,1) 绑定到着色器,它会按预期工作。
发生了什么事?
【问题讨论】:
【参考方案1】:正如您为 UBO 指定了 layout (std140)
,您必须遵守此处定义的算法规则。该布局首先在 OpenGL 3.2 core spec 的第 2.11.4 节“统一变量”中的“标准统一块布局”小节中指定(在核心中):
如果成员是消耗 N 个基本机器单元的标量,则基本对齐为 N。 如果成员是一个二或四分量向量,其分量消耗 N 个基本机器单元,则基本对齐为 2N 或 4N, 分别。 如果成员是一个三分量向量,其分量消耗 N 个基本机器单元,则基本对齐为 4N。 如果成员是标量或向量数组,则设置基本对齐方式和数组步幅以匹配单个数组的基本对齐方式 元素,根据规则(1),(2)和(3),并四舍五入到 vec4的基本对齐。数组末尾可能有填充;这 数组后面成员的基本偏移量向上舍入到 基本对齐的下一个倍数。 如果成员是具有 C 列和 R 行的列主矩阵,则该矩阵的存储方式与 C 列向量数组的存储方式相同 R 个分量,根据规则 (4)。 如果成员是具有 C 列和 R 行的 S 列主矩阵的数组,则该矩阵的存储方式与 S C 列的行相同 根据规则 (4),每个具有 R 个分量的向量。 如果成员是具有 C 列和 R 行的行主矩阵,则该矩阵的存储方式与具有 C 的 R 行向量数组相同 每个组件,根据规则 (4)。 如果成员是具有 C 列和 R 行的 S 行主矩阵的数组,则该矩阵的存储方式与 S R 行的行相同 根据规则 (4),每个向量都有 C 个分量。 如果成员是结构,则结构的基本对齐方式为 N,其中 N 是其任何结构的最大基本对齐值 成员,并四舍五入到 vec4 的基本对齐方式。这 然后为该子结构的各个成员分配偏移量 递归地应用这组规则,其中 子结构的第一个成员等于 结构。该结构的末尾可能有填充;基地 子结构后面的成员的偏移量向上舍入到 结构的基本对齐方式的下一个倍数。 如果成员是 S 结构的数组,则数组的 S 元素按照规则 (9) 按顺序排列。
对于您的情况,第 3 点适用。因此,您需要在第二个向量开始之前填充另一个浮点数。
【讨论】:
以上是关于OpenGL / GLSL - 统一块数据值不正确的主要内容,如果未能解决你的问题,请参考以下文章
使用 glTexBuffer 和 texelFetch 的 OpenGL(带 GLSL)
我的OpenGL学习进阶之旅 C++ 长行字符串多行书写的方法以及如何书写正确的OpenGL Shader着色器代码
我的OpenGL学习进阶之旅着色器GLSL运行时报错 GLSL compile error: Premature end of line
我的OpenGL学习进阶之旅着色器GLSL运行时报错 GLSL compile error: Premature end of line