0

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

4

3 回答 3

1

法线向量通过模型视图矩阵的转置逆进行变换。然而,第二个约束是,法线具有单位长度并且缩放模型视图会改变它。所以在你的着色器中,你应该应用一个标准化步骤

#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;
}

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

于 2013-03-06T12:21:32.377 回答
0

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

于 2013-03-06T12:20:36.303 回答
0

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

于 2013-03-06T12:31:51.663 回答