Opengl GLSL法向量变换
在此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
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);