glscalef对法向量的影响

时间:2013-03-06 10:35:55

标签: opengl graphics rendering scale mesh

所以我有一个.3ds网格,我导入到我的项目中并且它非常大,所以我想使用glscalef缩小它的大小。然而,我在着色器中使用的渲染算法使用法线向量值,因此在缩放后,渲染算法不再完全正常。那么如何解决这个问题呢?是否还有正常的glscalef?

3 个答案:

答案 0 :(得分: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;
}

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

答案 1 :(得分:0)

要变换法线,需要将它们乘以变换矩阵的逆转置。对于这种情况有几种解释,最好的可能是here

答案 2 :(得分:0)

正常由MV ^ IT转换,模型视图矩阵的逆转置,阅读红皮书,它解释了一切。