Shadows (Sombras)
Sombras de las Directional light

Shadows (Sombras)

Las luces de Unity pueden emitir Shadows desde un GameObject a otras partes de sí mismo u otros GameObjects cercanos. Los shadows (sombras) agregan un grado de profundidad y realismo a una escena ya que estos traen la escala y la posición de objetos que de lo contrario se verían “planos”.

Una Escena con GameObjects emitiendo sombras
Una Escena con GameObjects emitiendo sombras

Cómo funcionan los Shadows (sombras)?

Considere el caso más simple de una escena con una sola fuente de luz. Los rayos de luz viajan en lineas rectas desde una fuente y podrían eventualmente golpear los GameObjects en la escena. Una vez un rayo ha golpeado un GameObject, este no puede viajar más allá para iluminar cualquier cosa (ie, este “rebota” del primer GameObject y no pasa a través de este). Las sombras emitidas por el GameObject son simplemente áreas que no están iluminadas ya que la luz no pudo llegar a estas.

Otra manera de ver esto es imaginar una cámara en la misma posición que la luz. Las áreas de la escena que están en la sombra son precisamente estas áreas que la cámara no ve.

Una vista de luz de la misma Escena
Una “vista de luz” de la misma Escena

De hecho, esta es la manera cómo Unity determina las posiciones de las sombras desde una luz. La luz utiliza el mismo principio que una cámara para “renderizar” la escena internamente desde su punto de vista. Un sistema de un buffer de profundidad, como se utiliza para las cámaras de la escena, mantiene rastro de las superficies que están más cercas a la luz; las superficies en una linea directa de luz recibe iluminación pero todas las demás están en sombra. El mapa de profundidad en este caso es conocido como un Shadow Map (usted puede encontrar la Página de Wikipedia acerca de shadow mapping útil para información adicional).

Habilitando Sombras

Utilice la propiedad Shadow Type en el Inspector para habilitar y definir las sombras para una luz individual.

Propiedad: Función:
Shadow Type Los ajustes de Hard Shadows producen sombras con un borde afilado. Las Hard Shadows son particularmente realistas comparadas a Soft Shadows pero involucran menos procesamiento, y son aceptables para muchos propósitos. Las soft shadows también tienden a reducir el efecto de aliasing “blocking” del shadow map.
Strength Esto determina qué tan oscuras son las sombras. En general, la luz se dispersa por la atmósfera y se refleja en otros GameObjects, por lo que normalmente no desea que las sombras se ajusten a la máxima intensidad.
Resolution Esta opción establece la resolución de renderizado para el shadow map de la “Cámara” mencionada anteriormente. Si las sombras tienen bordes muy visibles, es posible que desee aumentar este valor.
Bias Utilice esto para ajustar la posición y la definición de su sombra. Consulte Shadow mapping y la propiedad Bias, a continuación, para obtener más información.
Normal Bias Utilice esto para ajustar la posición y la definición de su sombra. Consulte Shadow mapping y la propiedad Bias, a continuación, para obtener más información.
Shadow Near Plane Esto le permite elegir el valor para el plano cercano al renderizar sombras. Los GameObjects más cerca de esta distancia a la luz no emitan sombras.

Cada Mesh Renderer en la escena también tiene una propiedad Cast Shadows y Receive Shadows, la cual debe estar habilitada según se corresponda.

Habilite Cast Shadows seleccionando On en el menú desplegable para habilitar o deshabilitar el shadow casting (emisión de sombras) para el mesh. Alternativamente, seleccione Two Sided para permitir que las sombras se emitan por ambos lados de la superficie (por lo que backface culling se ignora para los propósitos de shadow casting) o Shadows Only para permitir que las sombras sean emitidas por un objeto GameObject invisible.

Shadow mapping y la propiedad Bias

Las sombras para una Luz dada se determinan durante la renderización final de la Escena. Cuando la escena se renderiza en la vista principal de la cámara, cada posición de píxel en la vista se transforma en el sistema de coordenadas de la luz. La distancia de un píxel de la luz se compara entonces con el píxel correspondiente en el shadow map. Si el píxel está más distante que el píxel del shadow map, entonces es presumiblemente oscurecido de la Luz por otro GameObject y no obtiene ninguna iluminación.

Sombreado correcto
Sombreado correcto

Una superficie iluminada directamente por una Luz a veces parece estar parcialmente en una sombra. Esto se debe a que los píxeles que deben estar exactamente a la distancia especificada en el shadow map son a veces calculados como los más alejados (esto es una consecuencia de usar el filtrado de sombras o una imagen de baja resolución para el shadow map). El resultado son patrones arbitrarios de píxeles en la sombra cuando realmente deben estar encendidos, dando un efecto visual conocido como “shadow acne”.

Shadow acne en la forma de artefactos falso de auto-sombra
Shadow acne en la forma de artefactos falso de auto-sombra

Para evitar shadow acne, un valor Bias se puede agregar a la distancia en el shadow map para asegurarse de que los pixeles en el limite pasan definitivamente la comparación como deben, o para asegurar que mientras que hacen en el shadow map, los GameObjects pueden insertarse un poco Poco a lo largo de sus normales. Estos valores son configurados por las propiedades Bias y Normal Bias en la ventana de Inspector Light cuando las sombras están habilitadas.

No configure el valor Bias demasiado alto, ya que las áreas alrededor de una sombra cercana al GameObject que emite a veces se iluminan falsamente. Esto da como resultado una sombra desconectada, haciendo que el GameObject se vea como si estuviera volando por encima del suelo.

Un valor Bias alto hace que la sombra parezca desconectada del GameObject
Un valor Bias alto hace que la sombra parezca “desconectada” del GameObject

Del mismo modo, configurar el valor Normal Bias muy alto hace que la sombra parezca muy estrecha para el GameObject:

Un valor Normal Bias muy alto hace que la forma de la sombra sea muy estrecha.
Un valor Normal Bias muy alto hace que la forma de la sombra sea muy estrecha.

En algunas situaciones, Normal Bias puede causar un efecto no deseado llamado “light bleeding” (sangrado ligero), donde la luz pasa de la geometría cercana a áreas que deben ser sombreadas. Una solución potencial es abrir el Mesh Renderer del GameObject y cambiar la propiedad Cast Shadows a Two Sided. Esto a veces puede ayudar, aunque puede ser más práctico para los recursos y aumentar la sobrecarga de rendimiento al procesar la escena.

Los valores bias para una Luz pueden que necesiten ser ajustados para asegurarse de que efectos no deseados ocurran. Por lo general es más fácil calibrar el valor correcto a ojo en vez de intentar calcularlo.

Para prevenir aún más el acné de la sombra, estamos utilizando una técnica conocida como Shadow pancaking (consulte Directional light shadows: Shadow pancaking). Esto generalmente funciona bien, pero puede crear artefactos visuales para triángulos muy grandes.

Un valor bajo de Shadow near plane offset crea la apariencia de agujeros en las sombras
Un valor bajo de Shadow near plane offset crea la apariencia de agujeros en las sombras

Modifique la propiedad Shadow Near Plane Offset para solucionar este problema. Establecer este valor demasiado alto introduce el acné de la sombra.

Correct shadowing
Correct shadowing
Shadows (Sombras)
Sombras de las Directional light