Estou aprendendo sobre mapeamento normal. Entendi que os valores RGB são convertidos em XYZ, mas minha pergunta é como ele é convertido e por que o mapa normal é azul e roxo?
11
Como um mapa normal cobre vetores de -1 a 1, faz sentido estender esse intervalo para 0-> 1, para que tudo possa caber dentro do intervalo de RGB.
Geralmente, aplicamos uma transformação no normal para convertê-la em algo que podemos ver.
vec3 colour = vec3(0.5) + normal * 0.5;
A cor azul é porque os mapas normais devem ser usados em relação ao normal primitivo (triângulo / etc) com uma direção padrão (0,0,1) para indicar nenhum desvio do triângulo normal. Normalmente, o sombreador de fragmento precisa girar esse normal em relação ao normal por pixel atual em tempo de execução.
vec3 colour = vec3(0.5) + normal * 0.5;
está convertendo RGB para XYZ?vec3 normal = (colour - vec3(0.5)) * 2.0;
Apenas os mapas normais do espaço tangente são principalmente azuis. Isso ocorre porque a cor azul representa um normal de (0,0,1) que seria um normal inalterado quando o triângulo se encontra no plano x e y, ou seja, perpendicular à superfície. A tangente, xe bi-tangente, y (também denominada bi-normal) são codificadas nos canais vermelho e verde e formam-se para criar um espaço tangente normal para um ponto na superfície do triângulo.
Se um mapa normal do espaço tangente codificasse uma cor apenas em vermelho (1.0, 0.0, 0.0), isso geraria um espaço normal tangente paralelo à superfície do triângulo. Isso nunca é visto, porque isso significaria que o triângulo só seria aceso a 90 graus da superfície e visualizaria o vetor em que ponto você não seria capaz de ver o triângulo.
Os mapas normais do espaço mundial codificam a unidade normal sobre uma esfera; portanto, pode haver cores principalmente diferentes uma vez codificadas de [-1, 1] a [0, 1] por canal.
Uma comparação pode ser vista aqui:
Na prática, os mapas normais são geralmente codificados em um formato de 2 canais, como o BC5, que na verdade só armazena xey com o z sendo reconstruído, pois sabemos que é um vetor unitário. Isso permite que você mantenha maior precisão com mais bits sem aumentar o tamanho do arquivo.
fonte