【问题标题】:Unexpected behaviour when scaling projection matrix in OpenGL在 OpenGL 中缩放投影矩阵时的意外行为
【发布时间】:2021-10-11 07:53:44
【问题描述】:

这是我的顶点着色器:

#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,则顶点会按预期消失。

这是为什么?

【问题讨论】:

    标签: c++ opengl glsl glm-math


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      这是因为您缩放了单位矩阵的整个对角线,而实际上您只需要缩放该对角线上的前 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 ]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-11-01
        • 2019-03-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-04-11
        • 1970-01-01
        相关资源
        最近更新 更多