Opengl GLSL法向量变换

Opengl GLSL法向量变换,opengl,glsl,shader,Opengl,Glsl,Shader,在此glsl着色器示例中,通过变换将一些顶点法线转换为视图空间:vec4(vertNormal,1.0)).xyz 为什么我们需要做这种转变 #version 430 layout (location=0) in vec3 vertPos; layout (location=1) in vec3 vertNormal; void main(void) { ... // convert vertex position to view space vec4 P = mv_matrix * v

在此glsl着色器示例中,通过变换将一些顶点法线转换为视图空间:
vec4(vertNormal,1.0)).xyz
为什么我们需要做这种转变

#version 430
layout (location=0) in vec3 vertPos;
layout (location=1) in vec3 vertNormal;

void main(void)
{ 
...


// convert vertex position to view space
vec4 P = mv_matrix * vec4(vertPos,1.0); // looks good

// convert normal to view space
vec3 N = normalize((norm_matrix * vec4(vertNormal,1.0)).xyz); // why to vec4 and back to vec3?
...
}

模型视图矩阵如下所示:

( X-axis.x, X-axis.y, X-axis.z, 0 )
( Y-axis.x, Y-axis.y, Y-axis.z, 0 )
( Z-axis.x, Z-axis.y, Z-axis.z, 0 )
( trans.x,  trans.y,  trans.z,  1 )
上部let 3*3包含方向和比例。第四行包含翻译。
对于点的变换,必须考虑全矩阵,而对于方向向量的变换,只需要考虑方向

通常,法线矩阵是模型视图矩阵左上3*3的
mat3
逆矩阵
转置矩阵。看

可以从模型视图矩阵计算法线矩阵:

mat4 mv_matrix;

如果模型视图矩阵是一个矩阵,则可以跳过
逆矩阵
转置
,因为逆矩阵等于转置矩阵。

如果要在视图空间中进行计算,则必须将顶点坐标从模型空间变换到视图空间:

vec4 P = mv_matrix * vec4(vertPos,1.0);
您必须将法向量的方向从模型空间转换为视图空间:

vec3 N = normalize(norm_matrix * vertNormal);

这是错误的。它必须是
N=normalize(mat3(norm\u矩阵)*vertNormal)对于一个和
N=规范化(转置(逆(mat3(norm_矩阵)))*vertNormal)其他。
mat3 norm_matrix = transpose(inverse(mat3(mv_matrix));
vec3 N = normalize(norm_matrix * vertNormal);
vec3 N = normalize(mat3(mv_matrix)* vertNormal);
vec4 P = mv_matrix * vec4(vertPos,1.0);
vec3 N = normalize(norm_matrix * vertNormal);