【发布时间】:2013-03-06 10:35:54
【问题描述】:
所以我有一个 .3ds 网格,我导入到我的项目中,它非常大,所以我想使用 glscalef 缩小它的大小。然而,我在着色器中使用的渲染算法使用了法线向量值,因此在缩放后,我的渲染算法不再完全按照应有的方式工作。那么如何补救呢?法线也有 glscalef 吗?
【问题讨论】:
标签: opengl graphics rendering scale mesh
所以我有一个 .3ds 网格,我导入到我的项目中,它非常大,所以我想使用 glscalef 缩小它的大小。然而,我在着色器中使用的渲染算法使用了法线向量值,因此在缩放后,我的渲染算法不再完全按照应有的方式工作。那么如何补救呢?法线也有 glscalef 吗?
【问题讨论】:
标签: opengl graphics rendering scale mesh
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 = normalize( (gl_NormalMatrix * normalIn).xyz ); 省略 w 分量很重要,因为这会抛出法线向量的长度计算。
要变换法线,您需要将它们乘以变换矩阵的逆转置。有几种解释为什么会这样,最好的一种可能是here
【讨论】:
Normal 由 MV^IT 变换,modelview 矩阵的逆转置,看红皮书,它解释了一切。
【讨论】: