Parte: 4 — Gráficos, shaders y rendering moderno · Fuente: Godot Docs — Lights and shadows / DirectionalLight3D shadow settings ⏱️ Duración estimada: 55 min · Nivel: Avanzado
Entender cómo Godot 4 genera sombras con shadow mapping (un mapa de profundidad renderizado desde el punto de vista de la luz) y aprender a diagnosticar y corregir los dos artefactos clásicos —shadow acne y peter-panning— ajustando bias, normal bias, resolución del mapa y cascadas (CSM) para sombras direccionales.
Al finalizar, el alumno podrá:
DirectionalLight3D.| # | Tema | Por qué importa |
|---|---|---|
| 1 | Mapa de profundidad desde la luz | Es la base de toda sombra en tiempo real |
| 2 | Comparación de profundidad (depth test) | Decide si un fragmento está en sombra |
| 3 | Shadow acne (auto-sombreado) | El artefacto más común al activar sombras |
| 4 | Peter-panning (sombra despegada) | Efecto secundario de un bias excesivo |
| 5 | PCF y suavizado de bordes | Convierte bordes dentados en bordes suaves |
| 6 | Cascadas (CSM) direccionales | Reparte resolución según distancia a cámara |
| 7 | Resolución del shadow atlas | Define nitidez y consumo de VRAM |
| 8 | Coste y presupuesto de sombras | Sombras son caras: hay que medir |
Orthogonal, PSSM 2 Splits o PSSM 4 Splits controlan cuántas cascadas usa la luz direccional.Necesitas Godot 4.x con el renderizador Forward+ o Mobile (el shadow mapping de alta calidad y las cascadas están más completos en Forward+). Crea una escena con un WorldEnvironment, un plano grande como suelo, varias cajas y una DirectionalLight3D. Activa las sombras en la luz (Shadow > Enabled). Ten a mano el inspector de la luz y del Project Settings > Rendering > Lights and Shadows, donde se define el tamaño del atlas.
Vamos a configurar sombras de calidad y a provocar y corregir los artefactos para verlos con nuestros ojos.
Paso 1 — Escena base. Crea Node3D raíz con un suelo (MeshInstance3D + PlaneMesh de 40×40), tres o cuatro BoxMesh apoyadas encima y una DirectionalLight3D inclinada (rotación X ≈ -45°).
Paso 2 — Activar sombras. En la DirectionalLight3D: Shadow > Enabled = On. Muy probablemente aparezcan rayas oscuras: eso es shadow acne.
Paso 3 — Provocar peter-panning. Sube Shadow > Bias a un valor exagerado (por ejemplo 0.5). El acné desaparece pero las sombras se despegan de la base de las cajas: peter-panning.
Paso 4 — Encontrar el equilibrio. Baja Bias hasta ~0.03–0.06 y sube Normal Bias a ~1.0–2.0. El normal bias corrige el acné en caras inclinadas sin despegar la sombra.
Paso 5 — Cascadas. En Directional Shadow > Mode elige PSSM 4 Splits. Ajusta Split 1/2/3 para repartir resolución (valores por defecto suelen ir bien) y usa Blend Splits = On para suavizar la transición entre cascadas.
Paso 6 — Resolución del atlas. En Project Settings > Rendering > Lights and Shadows > Directional Shadow > Size, prueba 2048 frente a 4096. Observa cómo el borde se vuelve más nítido a mayor tamaño y anota el coste.
Paso 7 — Script para alternar calidad en runtime y comparar rápido:
extends DirectionalLight3D
# Alterna entre un preset "rápido" y uno "de calidad" con la tecla Espacio.
var _calidad := false
func _input(event: InputEvent) -> void:
if event.is_action_pressed("ui_accept"):
_calidad = not _calidad
if _calidad:
shadow_bias = 0.04
shadow_normal_bias = 1.5
directional_shadow_mode = DirectionalLight3D.SHADOW_PARALLEL_4_SPLITS
else:
shadow_bias = 0.5 # exagerado: verás peter-panning
shadow_normal_bias = 0.0
directional_shadow_mode = DirectionalLight3D.SHADOW_ORTHOGONAL
print("Calidad:", _calidad, " bias:", shadow_bias)
Al pulsar Espacio verás alternar el artefacto y la corrección: eso es lo visible de esta clase.
Bias = 0 describe por escrito el patrón de acné y en qué caras aparece más.Bias mínimo que elimina el acné en una esfera; anota el valor.Normal Bias (con Bias bajo) y explica por qué reduce el acné en rampas.PSSM 2 Splits vs 4 Splits a 30 m de cámara: ¿dónde se nota más?2048 y 4096 en la misma escena y calcula el % de diferencia.OmniLight3D con sombra y observa que usa un cubemap, no cascadas.Crea una escena con suelo, al menos cinco objetos y una DirectionalLight3D con sombras configuradas de forma que no haya acné visible ni peter-panning perceptible en el contacto de los objetos con el suelo, usando PSSM 4 Splits.
Criterio de aceptación: en una captura cenital y otra a ras de suelo no se aprecian rayas de auto-sombreado ni separación entre el objeto y su sombra; los valores de Bias, Normal Bias, Mode y Size quedan documentados en un comentario del script de la escena.
| Síntoma | Causa y arreglo |
|---|---|
| Rayas oscuras sobre lo iluminado | Shadow acne por bias insuficiente; sube Bias y sobre todo Normal Bias |
| La sombra flota, el objeto parece despegado | Peter-panning por bias excesivo; baja Bias y compensa con Normal Bias |
| Sombras pixeladas/dentadas | Atlas pequeño; sube Directional Shadow > Size o activa filtrado suave |
| Sombras desaparecen a lo lejos | Max Distance de la sombra direccional demasiado corto; auméntalo |
| Costura visible entre cascadas | Transición dura; activa Blend Splits y ajusta los splits |
| FPS se hunde al activar sombras | Atlas enorme o muchas luces con sombra; reduce Size o limita luces sombreadas |
¿Por qué el acné forma rayas y no manchas? Porque cada téxel del mapa cubre una franja de la superficie; dentro de esa franja la profundidad interpolada oscila por encima y por debajo del valor almacenado.
¿Normal bias reemplaza a bias? No; se complementan. El bias plano corrige caras frontales a la luz y el normal bias corrige caras inclinadas. Se ajustan juntos.
¿Más cascadas siempre es mejor? No: 4 splits dan más nitidez cercana pero cuestan más y pueden mostrar costuras. Usa las que tu escena necesite.
¿Las sombras de OmniLight3D usan cascadas? No; las luces puntuales proyectan a un cubemap y las spot a un solo mapa. Las cascadas son exclusivas de la luz direccional.
Clase 097 - Efectos: bloom, vignette, aberración cromática y CRT