所以我有一个.3ds网格,我导入到我的项目中并且它非常大,所以我想使用glscalef缩小它的大小。然而,我在着色器中使用的渲染算法使用法线向量值,因此在缩放后,渲染算法不再完全正常。那么如何解决这个问题呢?是否还有正常的glscalef?
答案 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转换,模型视图矩阵的逆转置,阅读红皮书,它解释了一切。