在 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));