【问题标题】:glscalef effect on normal vectorsglscalef 对法线向量的影响
【发布时间】:2013-03-06 10:35:54
【问题描述】:

所以我有一个 .3ds 网格,我导入到我的项目中,它非常大,所以我想使用 glscalef 缩小它的大小。然而,我在着色器中使用的渲染算法使用了法线向量值,因此在缩放后,我的渲染算法不再完全按照应有的方式工作。那么如何补救呢?法线也有 glscalef 吗?

【问题讨论】:

    标签: opengl graphics rendering scale mesh


    【解决方案1】:

    Normal vectors are transformed by the transposed inverse of the modelview matrix。然而,第二个约束是,法线具有单位长度,并且缩放模型视图会改变这一点。所以在你的着色器中,你应该应用一个标准化步骤

    #version 330
    
    uniform mat4x4 MV;
    uniform mat4x4 P;
    uniform mat4x4 N; // = transpose(inv(MV));
    
    in vec3 vertex_pos;    // vertes position attribute
    in vec3 vertex_normal; // vertex normal attribute
    
    out vec3 trf_normal;
    
    void main()
    {
        trf_normal = normalize( (N * vec4(vertex_normal, 1)).xyz );
        gl_Position = P * MV * vertex_pos;
    }
    

    注意,“归一化”是将一个向量转化为自己的单位长度的共线向量的过程,与表面法线的概念无关。

    【讨论】:

    • 所以在我的着色器中我已经有了代码: normal = (gl_NormalMatrix * normalIn).xyz;其中 normalIn 是我传入的正常值,而“正常”是发送到片段着色器的内容。所以我根本不应该使用内置的 gl_NormalMatrix 吗?我有点假设(我猜错了)gl_NormalMatrix 会在内部自我更新以补偿我的缩放。
    • @user1782677:gl_NormalMatrix 只是 tranpose(inv(gl_ModelviewMatrix)) 仅此而已。你可以使用它,但你必须添加标准化步骤,即写normal = normalize( (gl_NormalMatrix * normalIn).xyz ); 省略 w 分量很重要,因为这会抛出法线向量的长度计算。
    【解决方案2】:

    要变换法线,您需要将它们乘以变换矩阵的逆转置。有几种解释为什么会这样,最好的一种可能是here

    【讨论】:

      【解决方案3】:

      Normal 由 MV^IT 变换,modelview 矩阵的逆转置,看红皮书,它解释了一切。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-12-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多