在 OpenGL 中缩放投影矩阵时的意外行为
Unexpected behaviour when scaling projection matrix in OpenGL
这是我的顶点着色器:
#version 330 core
layout (location = 0) in vec3 vertexPos;
uniform mat4 viewMatrix_;
uniform mat4 projectionMatrix_;
uniform mat4 modelMatrix_;
void main()
{
gl_Position = projectionMatrix_*viewMatrix_*modelMatrix_*vec4(vertexPos, 1.0);
}
我试图通过将模型矩阵缩放为身份的倍数来缩放我的点。
即,
glm::mat4 model = glm::mat4(1.0f)*scale;
shaderProgram_->SetUniformMat4("modelMatrix_", model);
但是我好像一点零钱都没有。如果我添加一个统一的浮点数并将顶点向量位置乘以比例,那么我得到了我想要的效果。
如果比例为 0,顶点会按预期消失。
这是为什么?
这是因为你缩放单位矩阵的 整个 对角线,而实际上你只需要缩放这条对角线上的前 3 个值。
[ s 0 0 0 ] [ s 0 0 0 ]
Need [ 0 s 0 0 ] Not [ 0 s 0 0 ]
this [ 0 0 s 0 ] this [ 0 0 s 0 ]
[ 0 0 0 1 ] [ 0 0 0 s ]
glm::mat4 model = glm::mat4(1.0f)*scale
不会生成有效的缩放矩阵。有效的缩放矩阵将包含对角线前三个元素的缩放值,但最后一个对角线元素的值为 1.0,例如:
s 0 0 0
0 s 0 0
0 0 s 0
0 0 0 1
而您的代码生成一个矩阵,其中所有对角线元素都设置为比例因子,例如:
s 0 0 0
0 s 0 0
0 0 s 0
0 0 0 s <-- check here
然后您看不到太大差异的原因是现在 w 值也被缩放,这意味着整个操作在透视除法后取消。
如果你需要缩放矩阵,我强烈推荐使用
glm::scale(glm::mat4(1.0f), glm::vec3(scale, scale, scale));
这是我的顶点着色器:
#version 330 core
layout (location = 0) in vec3 vertexPos;
uniform mat4 viewMatrix_;
uniform mat4 projectionMatrix_;
uniform mat4 modelMatrix_;
void main()
{
gl_Position = projectionMatrix_*viewMatrix_*modelMatrix_*vec4(vertexPos, 1.0);
}
我试图通过将模型矩阵缩放为身份的倍数来缩放我的点。 即,
glm::mat4 model = glm::mat4(1.0f)*scale;
shaderProgram_->SetUniformMat4("modelMatrix_", model);
但是我好像一点零钱都没有。如果我添加一个统一的浮点数并将顶点向量位置乘以比例,那么我得到了我想要的效果。
如果比例为 0,顶点会按预期消失。
这是为什么?
这是因为你缩放单位矩阵的 整个 对角线,而实际上你只需要缩放这条对角线上的前 3 个值。
[ s 0 0 0 ] [ s 0 0 0 ]
Need [ 0 s 0 0 ] Not [ 0 s 0 0 ]
this [ 0 0 s 0 ] this [ 0 0 s 0 ]
[ 0 0 0 1 ] [ 0 0 0 s ]
glm::mat4 model = glm::mat4(1.0f)*scale
不会生成有效的缩放矩阵。有效的缩放矩阵将包含对角线前三个元素的缩放值,但最后一个对角线元素的值为 1.0,例如:
s 0 0 0
0 s 0 0
0 0 s 0
0 0 0 1
而您的代码生成一个矩阵,其中所有对角线元素都设置为比例因子,例如:
s 0 0 0
0 s 0 0
0 0 s 0
0 0 0 s <-- check here
然后您看不到太大差异的原因是现在 w 值也被缩放,这意味着整个操作在透视除法后取消。
如果你需要缩放矩阵,我强烈推荐使用
glm::scale(glm::mat4(1.0f), glm::vec3(scale, scale, scale));