GLSL - 统一缓冲对象奇怪的行为
GLSL - Uniform Buffer Object weird behaviour
当我更改结构成员的顺序时,我注意到统一缓冲区对象的奇怪行为(着色器中的结构与 cpp 中的结构相同)。这是我的源代码(工作版本):
CPP:
struct Matrices {
// vec3, mat4 - glm library
mat4 projectionMatrix;
mat4 viewMatrix;
vec3 eyePosition;
};
GLSL:
layout (std140) uniform matrices {
mat4 projectionMatrix;
mat4 viewMatrix;
vec3 eyePosition;
};
CPP ubo 一代:
GLuint tmpUBO[2];
glGenBuffers(2, tmpUBO);
uniformBlocks["matrices"].bindingPoint = MATRICES_BINDING_POINT;
uniformBlocks["matrices"].ubo = tmpUBO[0];
glBindBuffer(GL_UNIFORM_BUFFER, tmpUBO[0]);
glBufferData(GL_UNIFORM_BUFFER, sizeof(Matrices), &matrices, GL_DYNAMIC_DRAW);
glBindBuffer(GL_UNIFORM_BUFFER, 0);
CPP 更新 ubo 数据:
glBindBuffer(GL_UNIFORM_BUFFER, uniformBlocks["matrices"].ubo);
GLvoid *p =
glMapBufferRange(GL_UNIFORM_BUFFER, 0, sizeof(Matrices),
GL_MAP_WRITE_BIT | GL_MAP_INVALIDATE_RANGE_BIT);
memcpy(p, &matrices, sizeof(Matrices));
glUnmapBuffer(GL_UNIFORM_BUFFER);
glBindBuffer(GL_UNIFORM_BUFFER, 0);
CPP 将 ubo 绑定到链接和活动着色器:
GLuint bi = glGetUniformBlockIndex(handle, name);
glBindBufferBase(GL_UNIFORM_BUFFER, bindingPoint, ubo);
glUniformBlockBinding(handle, bi, bindingPoint);
这个版本工作得很好,但是当我改变结构成员的顺序时(在 glsl 和 cpp 中),例如:
struct Matrices {
vec3 eyePosition;
mat4 projectionMatrix;
mat4 viewMatrix;
}
当我移动相机或改变视角时,一个或两个矩阵没有更新。
有人知道是什么原因造成的吗?
我在这个网站上找到了答案http://www.opentk.com/node/2926。问题在于着色器中结构变量的对齐方式。
当我更改结构成员的顺序时,我注意到统一缓冲区对象的奇怪行为(着色器中的结构与 cpp 中的结构相同)。这是我的源代码(工作版本):
CPP:
struct Matrices {
// vec3, mat4 - glm library
mat4 projectionMatrix;
mat4 viewMatrix;
vec3 eyePosition;
};
GLSL:
layout (std140) uniform matrices {
mat4 projectionMatrix;
mat4 viewMatrix;
vec3 eyePosition;
};
CPP ubo 一代:
GLuint tmpUBO[2];
glGenBuffers(2, tmpUBO);
uniformBlocks["matrices"].bindingPoint = MATRICES_BINDING_POINT;
uniformBlocks["matrices"].ubo = tmpUBO[0];
glBindBuffer(GL_UNIFORM_BUFFER, tmpUBO[0]);
glBufferData(GL_UNIFORM_BUFFER, sizeof(Matrices), &matrices, GL_DYNAMIC_DRAW);
glBindBuffer(GL_UNIFORM_BUFFER, 0);
CPP 更新 ubo 数据:
glBindBuffer(GL_UNIFORM_BUFFER, uniformBlocks["matrices"].ubo);
GLvoid *p =
glMapBufferRange(GL_UNIFORM_BUFFER, 0, sizeof(Matrices),
GL_MAP_WRITE_BIT | GL_MAP_INVALIDATE_RANGE_BIT);
memcpy(p, &matrices, sizeof(Matrices));
glUnmapBuffer(GL_UNIFORM_BUFFER);
glBindBuffer(GL_UNIFORM_BUFFER, 0);
CPP 将 ubo 绑定到链接和活动着色器:
GLuint bi = glGetUniformBlockIndex(handle, name);
glBindBufferBase(GL_UNIFORM_BUFFER, bindingPoint, ubo);
glUniformBlockBinding(handle, bi, bindingPoint);
这个版本工作得很好,但是当我改变结构成员的顺序时(在 glsl 和 cpp 中),例如:
struct Matrices {
vec3 eyePosition;
mat4 projectionMatrix;
mat4 viewMatrix;
}
当我移动相机或改变视角时,一个或两个矩阵没有更新。
有人知道是什么原因造成的吗?
我在这个网站上找到了答案http://www.opentk.com/node/2926。问题在于着色器中结构变量的对齐方式。