Luz en un mundo vóxel: ¿luces reales o flood fill?
Un jugador coloca una lámpara en su base. ¿Qué pasa a nivel técnico? Esta pregunta inocente nos llevó a una decisión de fondo, y la respuesta es un buen ejemplo de que la solución «más moderna» no siempre es la mejor.
Opción A: luces reales de Unity. Cada bloque luminoso se convierte en una fuente de luz puntual y el motor lo calcula todo. Se ve genial, pero no escala. Un mundo vóxel puede tener cientos de bloques luminosos a la vista; tantas luces puntuales en tiempo real hacen sudar a cualquier GPU, y más aún en la versión para navegador.
Opción B: luz por flood fill (relleno por propagación). El clásico del género: la luz es un valor numérico por bloque que se propaga desde la fuente y disminuye a cada paso. Baratísimo y con todas las fuentes que quieras, pero el resultado se ve plano, porque la luz no tiene dirección. Una pared junto a la lámpara está igual de iluminada que el suelo bajo ella.
Nuestra elección: flood fill con dirección. Nos quedamos con el flood fill, pero le enseñamos a manejar la dirección: la luz sabe de qué lado viene, y las superficies se iluminan de forma distinta según eso. El resultado se hornea en la malla del chunk durante el mallado; en tiempo de ejecución no cuesta prácticamente nada, pero se ve mucho más tridimensional que la clásica luz de bloques.
Desde entonces aplicamos esta lección en todas partes: primero pregúntate cuál es de verdad el problema del género (aquí: muchísimas fuentes de luz, geometría estática) y luego elige la tecnología. Las luces reales resolvían un problema que no teníamos, y habrían creado uno que no podemos resolver.
Comentarios