Estoy aprendiendo sobre el mapeo normal. Comprendí que los valores RGB se convierten en XYZ, pero mi pregunta es cómo se convierte y por qué el mapa normal es de color azul y púrpura.
11
Debido a que un mapa normal cubre vectores de -1 a 1, tiene sentido estirar este rango a 0-> 1 para que todo pueda ajustarse dentro del rango de RGB.
Por lo tanto, generalmente aplicamos una transformación a lo normal para convertirla en algo que podamos ver.
vec3 colour = vec3(0.5) + normal * 0.5;
El color azul se debe a que se supone que los mapas normales deben usarse en relación con la primitiva (triángulo / etc.) normal con una dirección predeterminada (0,0,1) para indicar que no hay desviación del triángulo normal. Por lo general, el sombreador de fragmentos necesita rotar esta normal en relación con la normal por píxel actual en tiempo de ejecución.
vec3 colour = vec3(0.5) + normal * 0.5;
está convirtiendo RGB a XYZ?vec3 normal = (colour - vec3(0.5)) * 2.0;
Solo los mapas normales del espacio tangente son principalmente azules. Esto se debe a que el color azul representa una normal de (0,0,1) que sería una normal sin cambios cuando el triángulo se encuentra en el plano x e y, es decir, perpendicular a la superficie. La tangente, xy bi-tangente, y (también conocida como bi-normal) se codifican en los canales rojo y verde y se forman para crear un espacio tangente normal para un punto en la superficie del triángulo.
Si un mapa normal de espacio tangente codificara un color solo en rojo (1.0, 0.0, 0.0) esto generaría un espacio tangente normal paralelo a la superficie del triángulo. Esto nunca se ve porque significaría que el triángulo solo se iluminará a 90 grados de la superficie y el vector de vista, en cuyo punto no podrá ver el triángulo de todos modos.
Los mapas normales del espacio mundial codifican la unidad normal sobre una esfera, por lo que pueden tener colores principalmente diferentes una vez codificados de [-1, 1] a [0, 1] por canal.
Una comparación se puede ver aquí:
En la práctica, los mapas normales generalmente se codifican en un formato de 2 canales, como BC5, que en realidad solo almacena x e y con la reconstrucción de z, ya que sabemos que es un vector unitario. Esto le permite mantener una mayor precisión con más bits sin aumentar el tamaño del archivo.
fuente