Understanding Shading/Entendiendo el Texturizado

Es muy común en el rubro que los artistas conozcas metodologías casi de memoria al momento de crear shaders. Pero en muchas ocasiones no hay un entendimiento real de lo que se produce. En cambio, si realizan constantemente un "copy/paste" de parametros por que saben que "asi se ven bien", o peor, utilizan solo shaders de libreria por que no saben fabricarlos.
En esta ocasión pondré un poco de luz al tema de los shaders aclarando ciertos conceptos básicos. En este caso hablaré desde la teoría, y haré una breve introducción a los principios imprescindibles para el correcto entendimiento y creación de shaders. Quiero añadir que para realizar esta guía me base mucho en bibliografía de Jeremy Birn, Lighting TD en Pixar.

Esto quiere decir que cada concepto a desarrollar es valido para cualquier tipo de soft 3d. Sea, Max, Maya, Blender, XSI, Modo, C4D, etc. No importe que uses para modelar en 3d, porque después de todo, al igual que en la fotografía:

"El principiante se fija en la cámara, el maestro en el lente, el experto en la luz"

Y en 3d resulta igual. No importa el programa que uses, y para alcanzar mejores resultados, en ocasiones, tampoco termina siendo útil cambiar de motor de render  . Lo que importa al final de todo, es un entendimiento real y conceptual del funcionamiento interno y teórico de un shader y la iluminación de la escena. Comprender los principios de reflexión, comprenden una pieza clave para el desarrollo de materiales realistas, y por consiguiente, piezas 3d mas impactantes.

Como bien lo define Jeremy Birn en su libro "Digital Lighting & Rendering", una de las etapas críticas en el refinado arte del 3d es el texturizado de una pieza (shading).  Se define así a la etapa donde mediante diversas técnicas y principios se generan estos shaders para materializar piezas 3d para su posterior renderizado.


Los shaders son la recreación digital de los materiales de cada pieza y como estos responden a la incidencia de la luz en la escena. Partiendo de esa base comenzamos por analizar uno de los elementos clave del shader. 

Reflexión.

Existen en lineas generales 3 tipos de reflexiones que varían sobre si mismas en ciertos espectros de intensidad.


Difusse:

Es aquella que aporta un aspecto "mate" al material. Por tanto no muestran ningún reflejo o destello.

Glossy (Lustre)

La reflexion de tipo glossy, es en cambio, suave y sus rayos divergentes tienen cadencia a la distancia, perdiendo así intensidad.

Specular

Una reflexión de tipo especular, por el contrario, es vibrante y parecida a un espejo.





La mayoría de las superficies muestran cierta combinación de transmisión lumínica difusa, glossy y especular. Incluso materiales de acabado mate, presentan en ciertos niveles, una mezcla de las 3 reflexiones. 

Recordemos que la aparición y forma de los reflejos en determinadas superficies esta condicionada por la incidencia de la luz. Por tanto algunos materiales desde determinados ángulos y bajo ciertas condiciones lumínicas pueden parecer que no poseen reflejos. Pero esto es erróneo. Basta con girar alrededor y buscar como incide en este la luz y podremos ver como aparecen y desaparecen reflejos.



ALGORITMOS DE RENDER

Cuando comenzamos a trabajar con un shader, debemos entender que el control del color principal del material esta dado por la reflexión difusa (Difusse). El ojo percibe y distingue el color de las cosas por la reflexión difusa de las mismas y no por sus reflejos u otros componentes. (Es importante no confundir ni mezclar el termino REFLEXIÓN (propiedad de la luz) con el término REFLEJO.)

Por tanto, si analizamos la estructura standard de los shaders de cada Soft 3d, todas poseen un parámetro llamado Diffuse. Este no es mas que un multiplicador de la reflexión difusa. Podemos comprobarlo reduciendo a la mitad su valor inicial, y no solo su color cambiara, sino su brillo (capacidad reflexión de luz).

Si seguimos analizando la estructura standard de un shader, también nos toparemos con nuestro parámetro Reflection/Specular. En principio, los reflejos especulares deben tomar la forma de la fuente de luz que los provoca; sin embargo, la mayoría de los "destellos especulares" no son mas que reflejos glossy, Si la luz de origen es una luz de punto procedente de un punto infinitamente pequeño en el espacio, entonces la reflexión especular perfecta de este punto seria otro punto infinitamente pequeño. Probablemente mucho mas pequeño que un pixel. Por esto suele suceder que la mayoría de los shaders nos proveen de la capacidad de ajustar el tamaño del destello especular en sus parámetros. Finalmente, cuando se ha cubierto el tamaño del reflejo mínimo, la luz especular se extiende para transformarse en una reflexión de tipo lustrosa (glossy) de la fuente lumínica.

MICROFACETAS. Principio de reflexión.

Nos basamos en este principio para comprender el "¿por que?" de aquellos materiales que son mas difusos, glossy o especulares. Las micro-facetas simulan las imperfecciones y rugosidades de las superficies a nivel microscópico. Estos detalles o facetas son causantes de que los rayos de luz se dispersen en diversas direcciones y generen cada tipo de reflexión. En los shaders, esta propiedad de la reflexión, puede ser controlada con el parámetro Roughness (Rugosidad). La rugosidad puede condicionar un material para que se vea pulido, o abultado. Suave o áspero.



ESPECULARIDAD

Cuando se trabaja con este parámetro en los shaders, es muy frecuente cometer el error de creer que el destello especular del material se encuentra en el punto mas brillante del diffuse. Y se edita el shader mirando esa previsualización. Esto es incorrecto ya que la posición de los reflejo especulares son independientes de las características de la difusión. Recordemos que la reflexión difusa se basa en la posición de la superficie y el angulo en relación a la luz que esta percibe. Por el contrario, la reflexión especular puede calcularse teniendo en cuenta únicamente el angulo de visión (cámara) y se basa en el ángulo entre la luz, la superficie y cámara.

Por esta razón decimos que los reflejos especulares son un ejemplo claro de efectos dependientes del punto de vista. Tal como el efecto "fresnel" que veremos mas adelante.

Dado este error conceptual, es muy habitual perder tiempo corrigiendo el aspecto de nuestro shader por que la pre visualización del material no coincide con el acabado final que se percibe en nuestro render. 

Resumiento y aclarando ciertas pautas:

EFECTOS INDEPENDIENTES AL PUNTO DE VISTA:

REFLEXIÓN DIFUSA
SOMBRAS

EFECTOS DEPENDIENTES DEL ANGULO Y POSICIÓN DE LA CÁMARA:

REFLEXIÓN ESPECULAR -GLOSSY
REFRACCIÓN
FRESNEL

BUSCANDO EL REALISMO EN NUESTRO SHADER

Usualmente un error muy frecuente, o cliché, son la exageración de los reflejos y destellos especulares. Estos terminan dando como resultado un aspecto y acabado totalmente falso, por el uso indebido de estos parámetros.

Se puede mejorar sustancialmente el aspecto de nuestros materiales si se trabaja con mayor conciencia, el tamaño, cantidad e intensidad de nuestras reflexiones. Y esto se logra solamente con un estudio cuidadoso del mundo real. De no contar con la pieza a mano, tener imágenes de referencia de diversos ángulos nunca esta de mas. 

Por el contrario, se desaconseja totalmente ajustar los destellos especulares basándose en nociones preconcebidas o en parámetros predefinidos, presets, etc.

COLOR ESPECULAR

Por lo general este es un parámetro que queda en la media, en tonos grises.  El color especular solo se emplea en superficies para piezas metálicas. Donde el brillo especular adquiere y refuerza el color del metal en si.

EFECTO FRESNEL

Para ponernos en contexto, este efecto llamado así por el físico francés Augustin-Jean Fresnel. Es una teoría que se basa en la transmisión de luz en forma de ondas. De este modo, se plantea que la cantidad de luz que se ve reflejada desde una superficie depende del angulo de visión.

Esto supone que es imposible ver la reflexión de una pared pintada cuando se la mira de frente. Sin embargo, al mirarla de lado,  se pueden ver claramente los reflejos de alguna ventana y de alguna fuente de luz por que no. Según Fresnel, la mayoría, si no todas las superficies, se vuelven en cierta medida reflectivas cuando se las mira desde el punto de vista adecuado.

  De este modo, activando este parámetro podríamos generar efectos mas realistas de reflexión. Aunque es importante tener en cuenta que posición tiene dicha pieza en relación a la cámara. Recordemos que si la esta en posición frontal a la cámara, difícilmente el efecto fresnel aporte mucho al calculo de luz. Por otro lado, y no una cuestión menor, el efecto fresnel, añade mas tiempo al calculo de luz al momento de renderizar. Haciendo del shader mas real, pero mas lento de procesar. Por lo que hay que ser cuidadoso como se combina con los demás parámetros.

ANISOTROPÍA/anisotropics

Algunas superficies poseen cierta rugosidad que genera la dispersión de modo tal que dan como resultado reflejos anisotrópicos. Siendo tales aquellos que se alargan en dirección perpendicular a surcos propios del material. Es habitual ver este tipo de reflejos anisotropicos en materiales tal como dvds, y algunos tipos de metal pulido.

TRANSPARENCIA Y REFRACCIÓN

"La refracción es un efecto "raytrace" que proporciona una distorsión a la imagen cuando se contempla a través de la superficie transparente.
De la misma manera que ocurre en una lente óptica, cuando se usa refraction en un modelo 3d, los rayos se focalizan de manera diferente dependiendo de la forma y proporciones del objeto."




CALCULANDO EL INDICE DE REFRACIÓN (ior)



Cuando aplicamos un efecto de refración sobre un modelo 3d, no solo se ve condiocionado por la topología de la malla, espesor, etc. Sino tambien por un factor muy importante denominado como "Indice de refracción" o IOR.
¿Y como trabaja este indice? Cuando nuestro valor en el indice de IOR es 1, es igual a nulo. Es decir, que no se percibe ningun tipo de refracción. Solo transparencia. En cambio, al incrementar gradualmente el valor del IOR, la refracción se hace presente. Ahora bien, ¿que es lo que este efecto genera visualmente? Pues en objetos convexos tales como una esfera, la imagen refractada aumenta tal cual una lente o lupa. Y al trabajar con niveles negativos, la imagen refractada, se achica. Que la imagen refractada en un objeto transparente se achique o agrande, es lo que genera esa sensación de volumen y realismo en objetos como jarras de vidrio con formas organicas y demas.





INDICES DE REFRACCIÓN PARA MATERIALES COMUNES.

AIRE(Desde el agua) = 0.75
Aire/Neutro=1.00

Humo=1.02
Hielo=1.30
Agua=1.33
Vidrio=1.44/1.52
Cuarzo=1.55
Ruby=1.77
Cristal= 2.00

Diamante= 2.42




-------------------------------------------------------------------------------------------------

Hasta aquí llegamos. Próximamente subiré la parte 2. En la que hablare un poco sobre principios básicos de iluminación y composición. 

SLds




MODELANDO PARA REAL TIME RENDERING - VIDEOJUEGOS

Ya hace bastante tiempo que recibo todo tipo de preguntas sobre mi metodología de trabajo, para modelado orgánico o poligonal (LowPoly/High Poly). Y el material disponible en Internet suele complicar a aquellos que no son muy amigos del ingles.


Estoy lejos de ser un exponente del refinado arte del modeling, pero decidí aportar en este humilde rincón una pequeña visión o metodología. No mas que algunos consejos para evitar dolores de cabeza a la hora de desarrollarnos artistas 3d en el campo profesional.

Esto nos conduce a mi primer guía explicativa sobre metodologías básicas de modelado orgánico. Es importante remarcar que es simplemente una forma entre millones. Y no existe un standard o estructura universal para seguir. Pero estoy seguro que para aquellos que apenas comienzan a transitar en este duro camino, puede ser un buen primer paso.

 ¿Ojo del águila..? Paciencia, paciencia y luego mas paciencia.

·Es importante volvernos muy tolerantes a la frustración. Al comienzo nuestros modelos van a verse espantosos, demoraremos horas y muy difícilmente logremos que nuestro objeto en cuestión se vea igual que la imagen de referencia. Esto se debe a que nuestro ojo aun no posee el entrenamiento necesario para "replicar" de manera exacta lo que vemos.  Sugiero no detenerse en un todo y comenzar a analizar la pieza en detalles. "zoomear" a un 400% si es necesario y analizar en detalle las curvas, detalles, radios, TODO. Los humanos tendemos a visualizar los elementos como un todo constituido,  "el resultado de la suma de sus partes".

 Ahora, debemos aprender a aislar las piezas y profundizar sus estructuras independientes.  Con el tiempo notaremos mas detalles y seremos mas precisos para replicar un objeto. Estos detalles son los que le brindan el acabado de realismo a una escena. Cordones de vereda, ramas en el suelo, todo!
 
LOW POLY PARA REAL TIME RENDERING

Cuando modelamos para un
engine de videojuegos hay muchos aspectos nuevos a tener en consideración.
Pero que es un “Engine”?

Engine = Motor gráfico que usan los videojuegos. Es el encargado de procesar y ensamblar cada elemento del videojuego. Es un entorno de trabajo orientado a la producción de gráficos en 3d que se renderizan en tiempo real (Realtime).

Nuestro primer punto de partida debe ser entender la diferencia entre como funciona o procesa un engine Real tIme y en función de eso como calcularemos o mediremos la densidad de nuestras mallas.


 
Es importante tener en cuenta que cuando hablamos de simulaciones 3d en tiempo real creadas en un motor gráfico, el renderizado los realiza exclusivamente la GPU (Graphic Process Unit) de la placa de video. 

Esto significa que cada ESCENA, estará atada y limitada por la cantidad de triángulos total que sea capaz de renderizar la GPU.

Ej:  El personaje principal de un videojuego  como el Crysis posee un top de 30k de polígonos y el entorno no excede los 500k de polígonos.

-Optimizando Piezas Orgánicas

Muchas veces se cree que como la pieza es lowPoly, debe ser modelada de tal modo y esto no es así.
Lo correcto sería partir de un modelo HighPoly y optimizarlo apagando iteraciones de turbosmoth.
En otras ocasiones tendremos que partir de una malla HighPoly colapsada. En estos casos donde  la optimizacion sera de manera “destructiva”, es aconsejable crear un edit poly nuevo y trabajar sobre este. La forma correcta es extrayendo los loops y rigs de nuestra malla que no son necesarios. Dejando concentrada la densidad de pelignos, únicamente en zonas curvas y con detalles finos.  Debemos llegar a una topología con su mínimo irreducible de polígonos. Al quitar algunos edge loops es importante ser cuidadosos y no dañar algún smooth group. Esto nos puede generar sombras extrañas en la malla. 
También es importante controlar que no hayan quedado vértices aislados sin conexiones.



 
-Modelando desde cero piezas Orgánicas

Durante el proceso de modelado es muy importante ser cuidadosos en como distribuimos el uso de los stack y de que manera modelamos. Siempre tenemos que tener en cuenta que el Prop highPoly debe ser fácil de llevar a lowPoly.
Lo ideal sería modelar pensando en usar solo 2 iteraciones de turbosmoth sobre el final de la pieza.  A fin de bajar o apagar el turbo y de esa forma subir o bajar rápidamente de un modelo high poly a low poly.
Según la topología del prop la cantidad de pelignos (versión LowPoly) no debería exceder los 300/600 polígonos (600/1200 triangles). Recordamos que tanto Unity como UE4, al igual que los demás Engines de videojuegos, trabajan con geometría basada en triángulos. Esto quiere decir que si nuestro modelo final posee 1000 polígonos, al momento de exportarlo y transformarlo a una malla basada en triángulos, esta se subdividirá y se duplicaran la cantidad de caras.

-Modelando desde cero piezas Poligonales

Cuando modelamos poligonalmente el procedimiento es otro. Nuestra pieza debemos encararla y pensarla de un modo tal que solo realizaremos subdivisiones mediante chamfers en las zonas criticas para generar mayor suavidad y trabajaremos continuamente con smoothgroups para eliminar las caras faceteadas. Lo mas normal es que una malla basada en modelado poligonal posea una densidad mucho menor a una orgánica.
Un Prop  de tipo poligonal (table, book, etc) no debería poseer mas de 300 polígonos/600 triangles, si tomamos como referencia un videojuego NextGen.




 


-Todo es cuestión de pensar en un"Cascarón"
Finalmente cuando llegamos al proceso de optimización debemos analizar que partes de la pieza realmente serán visibles ante la cámara. Esto estará condicionado por el tipo de Prop y la zona donde interactúe. Dependiendo el caso puede que sea necesario remover algunos lados o caras innecesarias del objeto.  Nuestras piezas deben estar modeladas como “cascaras huecas”, y quitar todo aquel excedente que no sea divisado jamás por la cámara del jugador. En muchos casos esto puede ayudar a economizar gran cantidad de polígonos. Es recomendable trabajar con el backface cull activado.

-Acá finaliza la parte I del articulo. Próximamente subiré una segunda parte.