¡Saludos guerreros de Calradia!
La iluminación es un aspecto extremadamente importante de cualquier juego moderno. La mala iluminación puede hacer que los modelos y texturas más detallados parezcan monótonos y sin vida, mientras que una buena iluminación ayuda a reunir los diferentes elementos visuales en la pantalla para proporcionar un esmalte más realista y estéticamente agradable. Esto es algo de lo que somos muy conscientes, y es lo que llevó a la introducción de la Iluminación Global (GI) en nuestro motor de juegos hace algún tiempo (que mencionamos brevemente en ese momento en nuestro blog de Motor 1.4).
Recientemente, hemos estado trabajando para mejorar y optimizar en gran medida esta característica del motor, por lo que queríamos tomar el tiempo para ampliar esto y discutir sobre IG con un poco más de detalle, cubriendo nuestros requisitos, cómo funciona el sistema y tocando algunos de los dificultades que enfrentamos al implementarlo.
Entonces, ¿qué es GI? En pocas palabras, GI es un sistema que modela cómo la luz rebota de las superficies a otras superficies, o en otras palabras, la iluminación indirecta. Esto permite que la luz emitida por una fuente, por ejemplo, una antorcha, interactúe con los objetos circundantes de una manera más natural con parte de la luz absorbida por el objeto y el resto reflejado en otros objetos. El resultado final es una representación mucho más realista de cómo actúa la luz en el mundo real.
En Bannerlord, decidimos optar por una solución GI que pueda manejar diferentes entornos de iluminación, pueda ejecutarse en un amplio espectro de hardware, tenga poca memoria y uso de disco duro y requiera menos trabajo manual por escena. Con estos requisitos, decidimos usar una solución estática que hornea la transferencia de iluminación en puntos de sonda predefinidos.
Para nuestra implementación, nos inspiramos en múltiples técnicas. El algoritmo de iluminación central utiliza la técnica de Transferencia de radiación precalculada para la representación en tiempo real en entornos de iluminación dinámicos de baja frecuencia(Sloan, et al, 2002). Además de esto, implementamos un rastreador de rayos fuera de línea en el juego para garantizar que la iluminación sea correcta con la verdad básica. Después de eso, modificamos algunas ecuaciones para que el juego no se vea afectado negativamente (por ejemplo, aumentar la luz ambiental de las antorchas).
Con los métodos basados en sondas, como el que usa nuestro motor, un problema importante es la pérdida de luz, que puede reducir drásticamente la calidad visual. Para resolver estos problemas de fugas, utilizamos el algoritmo de mapa de sombras descrito en la diapositiva Sondas de campo de irradiación y luz con visibilidad (Morgan McGuire, 2017). Sin embargo, la parte más difícil y lenta fue implementar un proceso que pueda automatizar la colocación de la sonda, la ubicación del mapa de sombra de fuga de luz y el proceso de horneado.
En primer lugar, no queríamos colocar sondas en todas partes, ya que esto ahorraría enormes cantidades de memoria y el uso del disco duro, que era uno de nuestros requisitos iniciales de diseño. Por lo tanto, para lograr el resultado visual deseado sin perder de vista el uso del hardware, nuestro proceso de horneado automático utiliza la malla de navegación para encontrar las posiciones que los agentes pueden tomar. Luego, desde estas posiciones, se proyectan rayos para encontrar los puntos visibles en la escena. Para todos estos puntos, el proceso automático coloca las sondas en forma de cuadrícula. Después de esto, el proceso automático asigna la funcionalidad del mapa de sombras a las que podrían introducir fugas. Por ejemplo, una sonda externa que afecta tanto el interior de una casa como el exterior generará un mapa de sombras para evitar fugas. Finalmente, la función de transferencia de iluminación se calcula para cada sonda colocada.
¡Este proceso de horneado automático se puede ejecutar a través del editor o nuestro sistema de integración interno, ahorrando una gran cantidad de tiempo para nuestros diseñadores de escena! Y la buena noticia es que esto también estará disponible para los modders y es tan simple como hacer clic en un botón en el editor de escenas. Además, el tiempo de edición adicional se optimiza con muchas operaciones de edición avanzadas como lazo y operaciones de selección geométrica y accesos directos en el editor.
Estamos bastante satisfechos con los resultados finales. Nuestra implementación de GI ciertamente mejora las imágenes del juego al agregar algo de profundidad visual a las escenas y hacer que los entornos sean más realistas, ¡y todo con un impacto mínimo en el rendimiento!