GLSL нормальное векторное преобразование - PullRequest
0 голосов
/ 07 ноября 2018

В этом примере шейдера 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?
...
}

1 Ответ

0 голосов
/ 07 ноября 2018

Матрица вида модели выглядит так:

( 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 содержит ориентацию и масштаб. 4-я строка содержит перевод.
В то время как для преобразования точки должна учитываться полная матрица, для преобразования вектора направления представляет интерес только ориентация.

Как правило, нормальная матрица представляет собой mat3 и inverse, transposed в верхнем левом 3 * 3 матрицы вида модели. См

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

Если матрица вида модели представляет собой Ортогональную матрицу , то inverse, transpose можно пропустить, поскольку обратная матрица равна транспонированной матрице.
См. . В каких случаях обратная матрица равна транспонированию?

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

Если вы хотите выполнить вычисления в пространстве вида, то вам необходимо преобразовать координату вершины из пространства модели в пространство просмотра:

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

и для просмотра пространства необходимо преобразовать направление пространства модели векторной формы:

vec3 N = normalize(norm_matrix * vertNormal);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...