Minecraft es un juego que se basa en gran medida en un mapa de altura y utiliza esa información de mapa heigt para inundar el mundo de luz. Según tengo entendido, el punto más alto en el mapa de altura es el final del área influenciada por la luz solar. Todo lo que está arriba está iluminado por la luz solar, todo lo que está debajo solo está influenciado por la luz cercana en un radio de 8 bloques.
Por lo tanto, si tiene una isla flotante en la cima de su mundo, todo lo que se encuentre debajo se verá esencialmente como una cueva. Cuando dos luces influyen en el mismo punto, la luz más brillante gana (no estoy seguro de eso).
De cualquier manera, hay un par de problemas con el modelo de iluminación de minecrafts: en primer lugar, si su mundo no tiene un mapa de altura, es más difícil descubrir qué se supone que emite exactamente la luz solar y qué no. Una forma simple sería asumir que el mundo es (en mi caso) una roca flotante y luego atravesar cada eje desde ambas direcciones y descubrir dónde comienza y termina la roca. Pero esto no elimina completamente el problema, ya que no se supone que las abolladuras en la roca estén en la oscuridad.
Minecraft en sí almacenará en caché la información de la luz en sus fragmentos junto con la información sobre el material de un bloque. Por lo tanto, solo si se modifica el mundo, la iluminación debe actualizarse. Desafortunadamente, ese proceso sigue siendo bastante lento en las actualizaciones y en los cambios rápidos de luz, uno puede ver el retraso de la iluminación. Eso es especialmente cierto si cambian muchos bloques (TNT, puesta de sol, etc.) y no está ejecutando la computadora más rápida (o Java en Mac).
Desde mi comprensión aún limitada de la iluminación de gráficos en 3D, un mundo como Minecraft no debería ser el mayor problema. ¿Cómo abordarías el problema?
Creo que los requisitos básicos para la iluminación en un mundo vóxel serían
- actualizar lo suficientemente rápido como para que pueda suceder en un solo cuadro. Uno podría hacer la iluminación en el dispositivo de gráficos y descargar la información de luz cambiada a la RAM principal.
- la información de la luz debe estar disponible rápidamente para la lógica principal del juego, por lo que no se basa completamente en el dispositivo gráfico: razonamiento: la luz afecta el crecimiento de la hierba, el desove de monstruos, etc.
- las actualizaciones ligeras tendrían que ser locales para un fragmento o tener algún otro límite para que uno no tenga que volver a encender todo el mundo, que podría ser de gran tamaño.
La idea principal sería hacer que las actualizaciones ligeras sean rápidas, no necesariamente más bellas. Para las mejoras generales del rendimiento de la representación de la luz, se podría agregar fácilmente SSAO además de lo que debería dar como resultado mundos mucho más agradables.