Shaders Cell Shading (Toon)

En post anteriores exploramos cómo podemos cambiar las propiedades físicas para simular diferentes materiales utilizando Surface Shaders. Un modelo de iluminación es responsable de tomar estas propiedades y calcular el tono final de cada píxel.

Comenzaremos con uno realmente simple sobre el que podemos construir, un modelo de iluminación de Lambert. Para ello, debemos saber que es la ley de Lambert.

Ley de Lambert

La ley de Lambert trata sobre la iluminancia de una superficie situada a una cierta distancia de una fuente de luz. Determina que la iluminación producida por una fuente luminosa sobre una superficie es directamente proporcional a la intensidad de la fuente y al coseno del ángulo que forma la normal a la superficie con la dirección de los rayos de luz y es inversamente proporcional al cuadrado de la distancia a dicha fuente.


Básicamente se define en que cuanto más lejos esta el origen de la luz, más radiación llegara al objeto final.

Este tipo de iluminación se denomina Soft.

Simple Shader

Entendiendo los modelos de iluminación, la intensidad de la luz que refleja una superficie en un modelo de iluminación Lambertiana depende de la normal de una superficie. Una superficie paralela a una fuente de luz no debe reflejar la luz que recibe, mientras que una superficie ortogonal a una fuente de luz debe reflejarla en su totalidad. Es decir, la intensidad de la luz reflejada por una superficie es la siguiente:

Intensidad de reflexión = Superficie Normal * Dirección de la luz

Crea un nuevo shader y asignalo a un material, aplícalo a una esfera con una luz direccional. Aquí está el código para el shader:

Tenga en cuenta que cuando el valor de puntos es negativo, la luz proviene del lado opuesto del triángulo. Esto no es un problema para las geometrías opacas, ya que los triángulos que no están orientados hacia la parte frontal de la cámara están seleccionados.

/img/c/cellylamb.png
.

Cell Shader

Toon shading, o cell shading, es una técnica de renderización no fotorrealista que hace que los modelos 3D parezcan planos. Volver a crear la apariencia de un shader toon utilizando solo funciones de superficie sería extremadamente costoso. Además, como el shader toon requiere que cambiemos la forma en que se refleja la luz, es un problema, en su lugar necesitamos un modelo de iluminación personalizado.

Para aquellos que no están familiarizados con el shader toon, tenga en cuenta que es una excelente manera de hacer que su juego se vea peculiar sin poner mucha energía en el desarrollo de un estilo artístico original. Yo también soy culpable de esto. Me encanta.

/img/c/cellylamb2.jpg
.

Pero, como puedes ver, ¡también se ve genial!

Para comenzar, crea un nuevo shader y material utilizando nuestro anterior shader Soft como base. Adjunte el material a un modelo 3D; el shader toon funciona mejor en superficies curvas.

Algunas implementaciones del shader Toon utilizan una textura llamada mapa de Ramp para definir la forma en que reasignamos la intensidad de luz de Lambert(NdotL) a otro valor. En la implementación anterior, la variable _CelShadingLevels se usa para ajustar la intensidad de la luz de modo que solo pueda asumir un número dado de valores muestreados equidistantemente de 0 a 1.

/img/c/cellylamb3.gif
.

En esta demostración usé un valor de 5 para la variable de entrada _CelShadingLevels . Puede notar que, como resultado, hay 5 pasos distintos que dividen las 6 bandas diferentes de intensidad de luz.

GitHub
/img/ref.png
.