GLSL法向矢量变换

时间:2018-11-07 15:22:00

标签: opengl glsl

在此glsl着色器样本中,一些顶点法线通过变换转换为视图空间:from sklearn_pandas import DataFrameMapper createTrainingAndValidation(finalDf, 'words') data = finalDf[['between_count','words']] mapper = DataFrameMapper([ (['between_count'], None), ('words',CountVectorizer(ngram_range=(1, 1))) ]) X=mapper.fit_transform(data) print (X) 为什么我们需要进行这种转换?

vec4(vertNormal,1.0)).xyz

1 个答案:

答案 0 :(得分:1)

模型视图矩阵如下:

( 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 )

上方的3 * 3是包含方向和比例的。第四行包含翻译。
对于点的转换,必须考虑整个矩阵,而对于方向矢量的转换,则仅关注方向。

通常,法线矩阵是模型视图矩阵的左上3 * 3的mat3inversetransposed。见

 mat3 norm_matrix;

 vec3 = normalize(norm_matrix * vertNormal);

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

mat4 mv_matrix;

mat3 norm_matrix = transpose(inverse(mat3(mv_matrix));
vec3 N = normalize(norm_matrix * vertNormal);

如果模型视图矩阵是Orthogonal matrix,则可以跳过inversetranspose,因为逆矩阵等于转置矩阵。
参见In which cases is the inverse matrix equal to the transpose?

vec3 N = normalize(mat3(mv_matrix)* vertNormal);

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

vec4 P = mv_matrix * vec4(vertPos,1.0);

,您必须将法向矢量表格模型空间的方向转换为视图空间:

vec3 N = normalize(norm_matrix * vertNormal);