Shadows (Sombras)
Global Illumination (Iluminación Global)

Sombras de las Directional light

Una directional light simula típicamente la luz del sol y una sola luz puede iluminar la totalidad de una escena. Esto significa que el shadow map a menudo cubrirá una gran parte de la escena inmediatamente, y esto hace que las sombras sean susceptible a un problema llamado aliasing perspectivo. El aliasing perspectivo significa que los pixeles del shadow map al verse cerca de la cámara se ven muy grandes, comparado aquellos que están lejos.

Sombras en la distancia (A) tienen una resolución adecuada, dónde las sombras cerca a la cámara (B) muestran un aliasing perspectivo.
Sombras en la distancia (A) tienen una resolución adecuada, dónde las sombras cerca a la cámara (B) muestran un aliasing perspectivo.

El aliasing perspectivo se nota menos cuando usted está utilizando soft shadows (sombras suaves) y tiene una alta resolución para el shadow map. Sin embargo, utilizar estas propiedades aumentará la demanda al hardware gráfico por lo que el framerate pueda tener consecuencias.

Shadow cascades

El motivo por el que ocurre el problema de perspective aliasing es que diferentes zonas del mapa de sombras se escalan desproporcionadamente debido a la perspectiva de la cámara. El mapa de sombras de una luz necesita cubrir únicamente la parte de la escena visible por la cámara, definida por el view frustum de la cámara. Si usted se imagina un caso simple donde la luz direccional viene directamente desde arriba, se puede ver la relación entre el tronco y el mapa de sombras.

El extremo distante del frustum está cubierto por 20 pixeles de shadow map mientras que el extremo más cercano está cubierto solamente por 4 pixeles. No obstante, ambos extremos aparecen del mismo tamaño en pantalla. El resultado es que la resolución del mapa es efectivamente mucho menor en áreas sombreadas que están cerca a la cámara. (Tenga en cuenta que en realidad, la resolución es mucho mayor que 20x20 y el mapa usualmente es perfectamente cuadrado en la cámara.)

Utilizar una resolución mayor para el mapa entero puede reducir el efecto de zonas chunky pero esto requiere de más memoria y bando de ancho mientras se renderiza. Aunque, notará del diagrama que una gran parte del shadow map está gastado en el extremo cercano del frustum ya que nunca será visto; también la resolución de las sombras lejos de la cámara está bastante alta. Es posible dividir el área del frustum en dos zonas basadas en la distancia desde la cámara. La zona del extremo más cercano puede utilizar un shadow map distinto en un tamaño reducido (pero con la misma resolución) para que la cantidad de pixeles se nivele de cierto modo.

Estas reducciones por etapas en el tamaño del shadow map se conoce como cascaded shadow maps (a veces llamado “Parallel Split Shadow Maps”). De las Quality Settings, usted puede configurar un cero, dos o cuatro cascades para un nivel de calidad dado.

Entre más cascades usted utilice, menos serán afectadas sus sombras por aliasing perspectivo, pero aumentar el número viene con una sobre-carga de renderizado. Sin embargo, esta sobrecarga es todavía menor a lo que sería si usted utilizar un mapa de resolución alto a través de toda la sombra.

La sombra del ejemplo anterior con cuatro cascades
La sombra del ejemplo anterior con cuatro cascades

Distancia de la sombra

Las sombras de los objetos tienden a notarse menos cuando estos están lejos de la cámara; estos aparecen más chiquitos en pantalla y también, los objetos distantes usualmente no son el centro de atención. Unity le permite a usted tomar ventaja de este efecto al proporcionar una propiedad Shadow Distance en las Quality Settings. Los objeto más allá de esta distancia (desde la cámara) no emiten sombras en absoluto, mientras que las sombras de objetos acercándose esta distancia gradualmente desvanecen.

Set the shadow distance as low as possible to help improve rendering performance. This works because distant objects do not need to be rendered into the shadow map at all. Additionally, the Scene often looks better with distant shadows removed. Getting the shadow distance right is especially important for performance on mobile platforms, because they don’t support shadow cascades. If the current camera far plane is smaller than the shadow distance, Unity uses the camera far plane instead of the shadow distance.

Visualising shadow parameter adjustments

The Scene View has a draw mode called Shadow Cascades, which uses coloration to show the parts of the Scene using different cascade levels. Use this to help you get the shadow distance, cascade count and cascade split ratios just right. Note that this visualization use the Scene view far plane, which is usually bigger than the shadow distance, so you might need to lower the Shadow distance if you want to match the in-game behavior of the Camera with a small far plane.

Dra mode de Shadow Cascades en la vista de escena
Dra mode de Shadow Cascades en la vista de escena

Shadow Pancaking

To further prevent shadow acne we are using a technique known as Shadow pancaking. The idea is to reduce the range of the light space used when rendering the shadow map along the light direction. This lead to an increased precision in the shadow map, reducing shadow acne.

A diagram showing the shadow pancaking principle
A diagram showing the shadow pancaking principle

In the above digram:

  • The light blue circles represent the shadow casters
  • The dark blue rectangle represents the original light space
  • The green line represents the optimized near plane (excluding any shadow casters not visible in the view frustum)

Clamp these shadow casters to the near clip plane of the optimized space (in the Vertex Shader). Note that while this works well in general, it can create artifacts for very large triangles crossing the near clip plane:

Large triangle problem
Large triangle problem

In this case, only one vertex of the blue triangle is behind the near clip plane and gets clamped to it. However, this alters the triangle shape, and can create incorrect shadowing.

You can tweak the Shadow Near Plane Offset property from the Quality Settings to avoid this problem. This pulls back the near clip plane. However, setting this value very high eventually introduces shadow acne, because it raises the range that the shadow map needs to cover in the light direction. Alternatively, you can also tesselate the problematic shadow casting triangles. See the bias section in Shadow Overview for more information.

Shadows (Sombras)
Global Illumination (Iluminación Global)