Normals vs mapas normales

17

Estoy usando el importador de activos Assimp ( http://assimp.sourceforge.net/lib_html/index.html ) para analizar modelos 3D.

Hasta ahora, simplemente he extraído los vectores normales que están definidos para cada vértice en mis mallas. Sin embargo, también he encontrado varios tutoriales en mapas normales ...

Según tengo entendido para los mapas normales, los vectores normales se almacenan en cada texel de un mapa normal, y los extrae de la textura normal en el sombreador.

¿Por qué hay dos formas de obtener los valores normales, cuál se considera mejor práctica y por qué?

KaiserJohaan
fuente

Respuestas:

31

Respuesta corta

Los mapas normales y las normales son dos cosas diferentes: las normales son una propiedad geométrica de cualquier malla / superficie, su uso no es exclusivo para los cálculos de sombreado e iluminación, sino que tiene muchos otros usos, por ejemplo, en física. Los mapas normales son texturas que codifican vectores normales alternativos utilizados en gráficos de computadora para simular protuberancias.

Respuesta larga

Las normales en geometría una normal es un vector o una línea que es perpendicular a un objeto dado (por ejemplo, plano normal, vértice normal). Las normales en los gráficos se usan generalmente para los cálculos de luz, como el cálculo de la reflexión difusa a través de una superficie tomando el producto de punto entre la dirección de la luz y las normales de la superficie. Las normales se calculan generalmente en función de las propiedades geométricas de la malla (caras / vértices), tomando el producto transversal de cualquiera de los dos bordes no paralelos que se encuentran en el mismo plano.

En OpenGL, las normales se especifican por vértice (por lo tanto, se denominan atributos de vértice), aunque pueden calcularse solo para cada cara en este caso, debe especificar la misma normal para cada vértice en una cara. OpenGL puede interpolar las normales a través de cada vértice de una cara (triángulo) para que pueda calcular la luz reflejada por píxel, no por vértice, y así obtener un resultado más preciso .

Mapeo normal : por otro lado, es una técnica en gráficos de computadora que codifica Normals en un mapa de textura, por lo que cada normal se codifica por texel. Por lo general, se usa para simular la iluminación de golpes y abolladuras (por ejemplo, mapeo de baches, mapeo de paralaje).

Dado que las normales se calculan en función de las propiedades geométricas de la malla / superficie, los mapas normales le proporcionarán normales alternativas que pueden simular las protuberancias para agregar detalles a la superficie sin agregar más polígonos.

Los mapas normales generalmente se generan usando un modelo 3D mucho más detallado, luego calculando los normales basados ​​en este modelo y codificándolo en un Mapa Normal.

¿Por qué necesitamos ambos?

Bueno, hablando solo de renderizado, las normales y los mapas normales generalmente se usan juntos para lograr el efecto de iluminación final, un buen ejemplo podría ser un sombreador de relieve, donde necesita el mapa de normalidad normal para lograr el efecto de iluminación de relieve, y aún necesitará el geométrica normal para calcular lo que se llama espacio tangente . El espacio tangente se usa generalmente para proporcionar reutilización para mapas normales.

Tenga en cuenta que lo normal se considera un atributo geométrico de la superficie y tiene muchos más usos que solo los cálculos de luz. Los mapas normales, por otro lado, generalmente se usan para efectos superficiales.

Extender la respuesta para explicar por qué los espacios tangentes son importantes:

Respuesta corta: los espacios tangentes se utilizan para hacer mapas normales independientes de la geometría subyacente.

[EDITAR] Imagen añadida para representar el mapa normal en el espacio tangente y el mapa normal en el espacio mundial.

ingrese la descripción de la imagen aquí

Respuesta larga: la imagen a continuación muestra el plano UV y la normalidad que define el espacio tangente, al generar un mapa normal ya sabremos que el espacio utilizado siempre tendrá la orientación Normal en la dirección Z (es por eso que los mapas normales se ven azulados) , esto nos ayudará a ignorar la curvatura de la superficie **,.

El espacio tangente nos da la ventaja de que nuestra codificación de mapas normales no está vinculada a una malla normal específica. Supongamos que codificamos nuestro mapa normal en el espacio mundial u objeto, luego cada normal que codificamos tendrá una dirección basada en cómo las normales de malla originales varían en el espacio mundial, sin mencionar que su mapa normal se verá afectado por las transformaciones del modelo.

ingrese la descripción de la imagen aquí

En las dos imágenes anteriores está bastante claro que el espacio de tangentes hace mapas normales (derecha), independientemente de la geometría subyacente porque todas las normales están codificadas en casi la misma dirección con una pequeña variación para simular el efecto de los golpes.

** la curvatura de la superficie se define por la cantidad en que un objeto geométrico se desvía de ser plano o recto en el caso de una línea, pero esto se define de diferentes maneras según el contexto.

Representación espacial tangente

concepto3d
fuente
1
Si puede encontrar una imagen que represente cómo una textura normal por sí sola no se puede usar consistentemente sin un campo normal y tangente definido por vértice, ¡será la mejor respuesta en este problema desconcertante para la mayoría de los programadores gráficos principiantes!
teodron el
Buena respuesta, pero OpenGL no interpola las normales en cada cara. Debe hacerlo usted mismo y proporcionar la normal interpolada a OpenGL (o al código de su sombreador).
Anastasios G
1
@AnastasiosG Creo que está hablando del comportamiento predeterminado de los datos variables, ya que se interpola a través de un triángulo cada vez que se computa un fragmento para una primitiva específica. Sé que había una bandera que podría usar para decirle a OpenGL que use una normal específica de las 3 normales de vértice posibles de un triángulo, pero ese no es el comportamiento predeterminado, como sé.
Teodron
1
@AnastasiosG Pensé que ese detalle no le haría ningún favor a la respuesta, ya que no se trata de cómo usar OpenGL. Pero si eso ayuda, en la era de la tubería fija necesitabas glShadeModel (GL_SMOOTH) para decirle a openGL que interpolara. En la era de canalización programable, usted define las variables como variables o de entrada / salida en el sombreador para que OpenGL pueda interpolar.
concept3d
Me gustaría agregar que los mapas de relieve son simplemente normales (geométricas) que se suben / bajan según una textura en blanco y negro. :)
Entalpi