Los voxels han servido como sistema de iluminación en el mundo de Roblox durante los últimos cuatro años. Pero tarde o temprano llega un momento de cambio en todo. Es por eso que los desarrolladores se preguntaron qué hacer a continuación.
La iluminación es complicado, por lo que hay que tener cuidado al elegir las nuevas tecnologías, ya que hay muchos factores a considerar. Para facilitar la toma de decisiones, Roblox ha creado un prototipo de dos sistemas futuros: los llamados voxels y los mapas de sombras. Para comprender las limitaciones de ambos, primero es importante comprender cómo funcionan.
Nota: Las capturas de pantalla del artículo están organizadas de modo que los vóxeles siempre se muestren a la izquierda y los mapas de sombras a la derecha.
Implementación: voxels
Aunque este sistema en particular ha funcionado en el juego durante mucho tiempo, la opción considerada aquí ha sufrido muchas mejoras.
Los datos mundo se convierte en un conjunto de cuadrículas de vóxel: cada rejilla se centra alrededor del carácter y puede ser tamaños de voxel de 1 a 16 (5 rejillas en total). Cada vóxel contiene información de ocupación que varía de 0 a 100%. Luego, los datos de iluminación se calculan para cada vóxel en cada malla en función de esta información de plenitud y fuente de luz / dirección. Todo lo anterior ocurre en la GPU ya que la central no es lo suficientemente rápida para actualizar tantos voxels con una densidad tan alta.
El sistema almacena todos los datos en vóxeles, en particular, para cada vóxel disponible hay datos sobre:
- Plenitud (múltiples valores que describen qué tan lleno está cada vóxel);
- Tragaluz (qué parte del cielo es visible desde el vóxel);
- Sombra del sol (cuánto del sol está oscurecido por el vóxel);
- Colores del objeto / cono de luz (aproximación del color / cono del efecto de las fuentes de luz locales sobre el vóxel).
Esta información se utiliza posteriormente para calcular el color de cada píxel a una resolución determinada. Las resoluciones de pantalla y vóxel se pueden ajustar de forma independiente entre sí. Partes de la malla de vóxeles se pueden actualizar cuadro por cuadro a medida que se mueven las luces / objetos.
Implementación: mapas de sombras
Este método utiliza la rasterización para calcular la mayoría de los efectos de sombra. Se realiza en tres etapas. Primero, para cada casta de sombras, actualizamos el mapa de sombras, lanzando múltiples castas de rayos desde la fuente de luz a la escena y recordando los resultados de la intersección. Luego construimos una estructura de aceleración espacial en la que incrustamos cada objeto de luz visible, que es esencialmente una cuadrícula de voxel frustocónica (también conocida como cuadrícula de froxel).
La cuadrícula cubre toda la parte del mundo del juego visto por la cámara. En cada froxel, escribimos una lista de todos los objetos de luz que lo cruzan. Finalmente, para calcular la influencia de todas las fuentes de luz, al renderizar la escena, para cada píxel buscamos un froxel que contenga este píxel, iteramos sobre todas las fuentes de luz, y para cada luz calculamos su influencia por separado usando los mapas de sombras construidos en la primera etapa.
El sistema almacena datos en dos estructuras:
- Atlas de sombras (todos los mapas de sombras de luz visible empaquetados en una textura grande);
- Light mesh (una malla de froxel que transforma efectivamente un punto de la cámara en una lista de luces).
El color de cada píxel se calcula de forma dinámica y no se almacena explícitamente. Partes del atlas de sombras se pueden actualizar cuadro por cuadro a medida que se mueven las luces / objetos.
Rendimiento: voxels
La técnica de vóxeles se presta mejor al escalado: para degradar la calidad de salida, podemos reducir el número de cuadrículas de vóxeles o actualizar menos vóxeles por cuadro (lo que da como resultado un "retraso de luz", una actualización más lenta de la exposición a la luz de los objetos en comparación con la actualización de los propios objetos).
Los vóxeles tienen tres características de complejidad: complejidad geométrica, complejidad de la luz y recuento de píxeles. La complejidad geométrica solo afecta el costo de la voxelización, por lo que agregar más objetos no introducirá demoras. La complejidad de la luz solo afecta el costo de computarla, que no depende de la complejidad geométrica ni del número de píxeles. Finalmente, el color del píxel final se calcula a partir del número de vóxeles / luces / objetos, por lo que podemos escalar la resolución sin afectar la calidad de la iluminación.
El rendimiento del vóxel se calcula como O (G) + O (L) + O (P), donde G es el número de triángulos (complejidad geométrica), L es el número de luces, P es el número de píxeles.
Desafortunadamente, el rendimiento máximo de vóxeles no es óptimo, ya que el número de vóxeles aumenta a medida que N3 y las GPU no son ideales para los métodos de actualización requeridos y no pueden mantener una buena gestión del rendimiento. Con suficiente investigación sobre la computación GPU, la pérdida de rendimiento se puede compensar, pero el costo base puede seguir siendo bastante alto en este momento.
Rendimiento: cartas de sombra
Las tarjetas de sombra son más compatibles con la GPU, ya que están diseñadas en función de la rasterización. El costo de actualizar el atlas de sombra se puede reducir parcialmente almacenando en caché / retrasando las actualizaciones (lo que lógicamente conduce a una latencia adicional). La optimización de la representación de la geometría (incluido el nivel de detalle de la malla) también reduce el costo del método.
Sin embargo, actualizar las sombras en escenas complejas sigue siendo costoso, ya que el costo depende tanto de la cantidad de detalles geométricos como de la cantidad de luces que proyectan sombras. Dentro de un edificio, en el caso de una luz en movimiento, es necesario volver a renderizar todo el edificio en cada fotograma para actualizar la información de sombra para esa luz. Una gran cantidad de proyecciones de luz en movimiento en el edificio conduce a una disminución del rendimiento: no podemos actualizar todas las luces en el marco a la vez, lo que genera artefactos visuales.
Además, este método no permite separar el parámetro de resolución de la cantidad de luz: para cada píxel, tenemos que recalcular la influencia de todas las fuentes de luz que lo cubren. Este paso tampoco se puede almacenar en caché, lo que genera problemas de rendimiento a altas resoluciones en escenas muy iluminadas: 20 luces superpuestas en una habitación 4K pueden requerir 160 millones de estimaciones de luz.
El rendimiento del mapa de sombras se calcula como O (GL) + O (LP), donde G es el número de triángulos (complejidad geométrica), L es el número de luces, P es el número de píxeles.
Evaluación del desempeño
Para mayor claridad, ambos métodos se utilizaron para niveles de juego especialmente seleccionados. Tenga en cuenta que estos son preexistentes implementaciones de nivel y no está diseñado específicamente para la evaluación del desempeño.
París (sombras de sol, muy pocas fuentes de luz sin sombra)
- Voxels: actualización de sombras - 6 ms, renderizado de escenas - 1,5 ms;
- Mapas de sombras: actualización de sombras - 1 ms, renderizado de escenas - 2,4 ms;
- El costo de calcular la sombra del vóxel base es mayor porque es más difícil de procesar para la GPU.
Cuevas (muchas fuentes que proyectan sombras)
- Voxels: actualización de sombra - 7 ms, representación de escena - 0,9 ms;
- Mapas de sombras: actualización de sombras: 10 ms, representación de escenas: 2,1 ms;
- Debido a la gran cantidad de geometría y luces en movimiento, la actualización de mapas de sombras es costosa.
Occidental (muchas fuentes de proyección de sombras)
- Voxels: actualización de sombras - 8 ms, representación de escenas - 1 ms;
- Mapas de sombras: actualización de sombras - 15 ms, renderizado de escenas - 2,5 ms;
- Con luces en movimiento y muchos triángulos, actualizar el mapa de sombras es caro.
1000 fuentes de luz sin sombra
- Voxels: actualización de luz - 20 ms, representación de escena - 0,5 ms;
- Mapas de sombras: actualización de luz - 0.5ms, renderizado de escena - 5ms;
- La cantidad acumulada de luz y superposición de vóxeles en este caso ralentiza la actualización de vóxeles. Además, puede ver que en la etapa cercana, no se realiza la aproximación de "una luz en cada vóxel".
Rendimiento: conclusión
Los mapas de sombras se escalan bien para la carga de trabajo, pero hay dos cosas a considerar:
- El costo de cada pixel se eleva a medida que aumenta la resolución, haciendo de esta una solución práctica sólo a resolución media (1080p); ir más allá de 1080p requiere una GPU muy buena.
- El costo de renderizar sombras aumenta muy rápidamente en el caso de geometría compleja de muchas luces dinámicas. Esto se puede compensar con una mejor selección, pero en esta etapa sigue siendo un problema fundamental.
Al mismo tiempo, por el contrario, el rendimiento del vóxel depende mucho menos del contenido del nivel, pero tiene un costo base mucho mayor. Esto puede compensarse con algoritmos de GPU mejorados y vóxeles reducidos.
Requisitos de memoria
Los requisitos de memoria para mapas de sombras y vóxeles dependen de la calidad requerida.
En el caso de los vóxeles, se almacenan en memoria varias texturas para cada etapa, por lo que su tamaño total depende del número de etapas y del tamaño de cada una de ellas. Actualmente hay 4 etapas (con tamaños de vóxeles 1..8) de 128x64x128 vóxeles cada una, lo que suma 128 MB de VRAM usada. Sería posible iniciar otras 2 cascadas (0,5 vóxeles y 16 vóxeles) o reconfigurar las existentes, lo que aumentaría este valor a 192 MB. Por el contrario, puede reducir el número de cascadas (eliminando algunas cascadas cercanas) en sistemas con memoria limitada, y luego el impacto mínimo en la memoria puede ser de aproximadamente 64 MB con dos cascadas (4..8) y aproximadamente 96 MB con tres (4 .. dieciséis).
En el caso de los mapas de sombras, se utilizan un atlas de mapas de sombras y una cuadrícula de froxel. Esto último depende en parte de la resolución. El tamaño del atlas de sombras, a su vez, se puede reducir si es necesario reducir la calidad de las sombras para mejorar el rendimiento / la memoria. El sistema actual utiliza 73 MB de memoria de video, la mayor parte (64 MB) está ocupada por el atlas de sombras. Puede reducirlo y así limitar el número de luces oscurecidas o la calidad de las sombras. También puede considerar algunas opciones para mapas de sombras que requieren más memoria para admitir la translucidez, lo que significa que ocuparán más espacio (hasta 130 MB o más). Es probable que el impacto mínimo en la memoria del sistema se logre reduciendo el tamaño del atlas de sombras y utilizando su versión más simple, que ocupará unos 25 MB.
En comparación, el sistema de iluminación actual tiene dos modos: alta (PC) y baja calidad (móvil). La versión para PC ocupa ~ 40 MB (24 MB de RAM, 16 MB de VRAM); móvil - ~ 11 MB (6 MB de RAM, 5 MB de VRAM).
De hecho, ambos métodos son bastante cercanos en términos de impacto en la memoria, pero los mapas de sombras son algo más escalables para el mismo rango de luz / sombra.
Compatibilidad móvil
La audiencia del juego es cada vez más móvil, lo que significa que al comparar las implementaciones seleccionadas, también se deben tener en cuenta diferentes dispositivos de juego. En los dispositivos de gama alta, debería haber suficientes capacidades de API para implementar ambos métodos, pero, por supuesto, es posible que no sean tan prácticos en términos de memoria y rendimiento.
El sistema de iluminación de voxel existente es ideal para dispositivos móviles: admite muchas funciones de iluminación complejas (sombras de luz, tragaluz, etc.) y realiza la mayoría de los cálculos complejos en la CPU, lo que proporciona requisitos mínimos para el rendimiento y el conjunto de funciones de la GPU. ... Dado que este sistema aún necesitará ser compatible con dispositivos móviles y PC de bajo costo en el futuro previsible, han surgido varias opciones para admitir una gran cantidad de dispositivos:
- Mantenga el sistema existente en forma móvil, el nuevo solo será PC / consola. Esto significa que un gran segmento de la base de usuarios no tendrá acceso al nuevo sistema.
- ( , ), /.
- low-end , , .
En todos estos casos, es necesario responder a la pregunta sobre la compatibilidad de los contenidos, porque una de las principales promesas de la plataforma es “descargar el contenido una vez y ejecutarlo en cualquier lugar”. Todavía tenemos que trabajar en esto. Al principio, parece que la nueva solución de vóxel es mejor en el sentido de que proporciona consistencia de calidad / comportamiento del sistema antiguo al nuevo, mientras que los mapas de sombras representan una transición más abrupta a otra calidad, pero al mismo tiempo es más probable que se lleven bien con capacidades limitadas en dispositivos móviles.
Calidad: fuentes de luz
La solución del mapa de sombras proporciona información confiable en términos de simulación de fuentes de luz: en la captura de pantalla a continuación con 1000 luces en el caso de mapas de sombras, puede ver reflejos especulares perfectamente reproducidos, modelados con BRDF, que nos da los reflejos de luz que queremos.
La solución de vóxel es fundamentalmente peor porque se aproxima al efecto de la luz en cada vóxel como si viniera de una sola fuente. A partir de esto, puede ver que la calidad de la reflexión especular se deteriora:
entonces, en el caso de vóxeles en el área con reflejos especulares, los colores se fusionan en una proporción de 1: 1, creando una luz amarilla en lugar de verde y rojo, aunque no hay luces amarillas en la escena. Por el contrario, una solución de mapa de sombras simula con precisión la combinación de colores.
En algunos casos, obtenemos resultados muy poco concluyentes, aunque se pueden mejorar en el futuro:
en el ejemplo anterior, puede ver reflejos de espejo curvos, alargados y distorsionados, y en algunos voxels debajo de uno de los objetos no hay información de luz en absoluto. La misma captura de pantalla para mapas de sombras da un resultado mucho mejor.
Calidad: sombra
La cualidad definitoria de los mapas de sombras es la precisión, mientras que las sombras de vóxeles son suaves. Los mapas de sombras proporcionan sombras bastante nítidas con el menor detalle posible, pero lo suficientemente precisas para crear una sombra convincente para el personaje. Por otro lado, el algoritmo de vóxel es muy bueno para crear sombras realmente suaves, sin embargo, las sombras de pequeños detalles no se registran en absoluto o tienen una forma irregular.
Por esta razón, actualmente se usa una variante del mapa de sombras para representar sombras de personajes; sin embargo, es más una muleta, aplicada solo al sol que proyecta sombras de personajes. No se tienen en cuenta otras fuentes de luz.
Además, una técnica clave para acelerar los vóxeles es el uso de cascadas. Sin embargo, esto significa que los datos de plenitud se vuelven más gruesos a medida que nos interesa la distancia desde el punto de la escena. En este caso, la calidad de la sombra también se deteriora a medida que aumenta la distancia entre la fuente y el receptor de la sombra:
en la captura de pantalla anterior, el tamaño del vóxel más pequeño sería suficiente para generar una sombra de alta calidad desde el puente, pero el puente está demasiado lejos de la superficie del agua, por lo que sus vóxeles resultan ser demasiado toscos incluso cuando siempre que los voxels cerca de la superficie del agua sean bastante buenos.
Calidad: tragaluz
Una función importante en la canalización de vóxeles es el cálculo del coeficiente del tragaluz, que determina qué parte del cielo es visible desde el vóxel actual. Se utiliza para mezclar iluminación interior y exterior y es muy eficaz para mejorar su calidad. En la captura de pantalla a continuación, el exterior de la casa debería ser mucho más brillante que el interior, incluso en áreas que están en la sombra. La solución de vóxel calcula y reproduce bien este coeficiente, pero en el caso de un mapa de sombras, está ausente, por lo que no hay posibilidad de atenuar las sombras.
Calidad: precisión geométrica
Vale la pena señalar las diferencias fundamentales en la representación geométrica entre los vóxeles y los mapas de sombras.
Los vóxeles asumen que todos los objetos soportados por el motor de luz pueden ser "voxelizados", es decir, para cada vóxel en el mundo del juego, hay una forma rápida de calcular la cantidad de intersección entre el objeto y el vóxel. Esto funciona bien para formas primitivas, pero los objetos complejos como CSG y MeshParts ya son un problema serio. Ahora, la descomposición aproximada y un conjunto de otros trucos para una voxelización efectiva ayudan en parte con esto, pero esto a menudo conduce a artefactos visibles. Al mismo tiempo, los mapas de sombras usan la misma representación poligonal que está involucrada en el renderizado, por lo que pueden representar perfectamente las formas de todos los objetos:
Calidad: fugas de luz
Si bien la forma de la sombra es extremadamente importante, quizás sea aún más importante que los píxeles invisibles se manejen correctamente. Cuando varias aproximaciones violan esto, se producen las llamadas fugas de luz (franjas visibles), que causan la mayoría de los problemas en entornos de alto contraste, por ejemplo, dentro de un edificio con sol exterior brillante. Aquí hay un ejemplo de una fuga de luz:
esta es una sección delgada e iluminada del piso justo contra la pared. Los mapas de sombras conservan mucho mejor la oclusión de la luz y combaten este problema.
Hay varias fuentes de fugas de voxels. Algunos de ellos pueden mitigarse manteniendo la plenitud anisotrópica: por ejemplo, ahora la memoria almacena 3 valores por vóxel, lo que indica “cuánta materia hay en la proyección del vóxel a lo largo del eje” para los tres ejes. Desafortunadamente, aunque esto ayuda a que los detalles sutiles proyecten sombras independientemente de su grosor, no solucionará todas las fugas. La única forma de garantizar el bloqueo completo de la luz en este aspecto es hacer que la pieza sea dos veces más gruesa que el vóxel. Además, la fuga crece con el tamaño del vóxel, lo que significa que se vuelve más notorio a niveles de calidad más bajos y / o a mayores distancias.
Los mapas de sombras no están completamente sellados, pero las fugas en ellos son un problema mucho menor; por ejemplo, en esta implementación, un objeto con un grosor de 0.4 voxel no transmitirá luz visible (con un grosor de 0.2 voxel, puede transmitir parte de la luz, pero también de esta puede deshacerse de él en el futuro).
Calidad: conclusión
Las cartas de sombra son excelentes en la mayoría de los aspectos de calidad. La única área que se hunde significativamente es el cálculo de la relación del tragaluz. Esto puede requerir un método híbrido que use voxelización para el tragaluz, lo que introduce algún problema en la tubería de voxel, o tal vez haya soluciones alternativas a este problema. También sería bueno poder admitir sombras suaves, lo que se puede hacer con algunas extensiones del algoritmo del mapa de sombras.
Los vóxeles proporcionan una calidad aceptable, pero en comparación con los mapas de sombras, pierden mucho, especialmente en la fidelidad de las sombras y los reflejos especulares. Tendremos que resolver de alguna manera estos problemas para poder implementar una iluminación de voxel que pueda proporcionar hermosas sombras del jugador, porque el uso de la solución actual proporciona solo las del sol, lo que parece incompatible con la visión futura del mundo en el juego.
Visibilidad: translucidez
La renderización de sombras es un tema bastante bien investigado para los objetos opacos, pero la translucidez es otra cuestión. Dado que en el caso de un sistema de vóxeles, la luz viaja a través de las células de vóxeles en función del valor de plenitud, no es demasiado difícil mantener las sombras semitransparentes que pueden dar las sombras de baja frecuencia (suaves) de los efectos de partículas y otros objetos semitransparentes en la escena, incluido el auto-sombreado para Los efectos de partículas en sí mismos:
A continuación se muestra un video de este efecto en movimiento:
Actualmente no se admite la translucidez de los mapas de sombras. Esto significa que si queremos soportar partículas u otros objetos transparentes que proyectan sombras, debemos buscar otra solución. Hay algunas investigaciones sobre representaciones alternativas de mapas de sombras que podrían servir para este caso de uso, pero queda por ver qué tan efectivo es.
Visibilidad: vegetación
Si bien los mapas de sombras no hacen un trabajo particularmente bueno con la translucidez, pueden mostrar detalles finos en los objetos (como la vegetación), independientemente de si están modelados con geometría o texturas. Los vóxeles no son lo suficientemente pequeños para servir en este caso de uso. Además, en este caso, no es fácil acceder a la información sobre la textura, porque requiere un modelado preciso de la superficie de la malla, no del volumen. Es dudoso que alguna vez sea posible obtener hermosas sombras de la vegetación usando vóxeles, mientras que los mapas de sombras pueden proporcionar esto incluso con contenido existente, como se muestra en esta captura de pantalla:
Visibilidad: autoiluminación
Debido a la forma en que se implementan los vóxeles, es relativamente fácil inyectar luces de forma y cantidad arbitrarias en la malla sin afectar el rendimiento de otras partes de la tubería. Sin embargo, aunque agrega muchas luces a los mapas de sombras, la creación de luces con formas irregulares tiene algunos problemas arquitectónicos y de rendimiento. En particular, es mucho más fácil darse cuenta de la verdadera auto-luminosidad con vóxeles: el material de neón se usa actualmente para "emitir luz", pero en realidad no emite luz a otros objetos cercanos.
Sí, puede agregar luces adicionales, pero sería bueno hacerlo todo automáticamente. Los mapas de sombras no son muy útiles para esto, pero los vóxeles admiten la voxelización de cualquier forma por necesidad y, por lo tanto, es bastante fácil admitir la emisión de luz de objetos auto-luminosos con ellos.
Visibilidad: iluminación global
La iluminación global (GI) se refiere al cálculo de efectos de iluminación secundarios, como la luz de una lámpara que rebota dos veces en las paredes para proporcionar iluminación adicional en áreas donde los rayos de luz directa no pueden llegar.
GI en Roblox es extremadamente complejo, y la mayoría de las decisiones al respecto tienen que sacrificar algo de iluminación dinámica, geometría dinámica, rendimiento y escenas a gran escala. Cualquiera de estos sacrificios es inadmisible.
No está claro qué soluciones de IG serían prácticas dadas las estrictas restricciones de contenido. Hasta ahora, la IG basada en vóxeles parece ser más prometedora que otros enfoques.
Por supuesto, tener GI basado en vóxeles no significa que la iluminación directa se calcule con ellos: la mayoría de las investigaciones GI basadas en vóxeles en la actualidad implican el uso de mapas de sombras para calcular la luz directa y mejorar los resultados con vóxeles.
Resumen
Con base en el análisis anterior, compilaremos una tabla resumen de la efectividad de ambas soluciones. Las celdas en cursiva sugieren que una mayor investigación puede mejorar esta área. La calificación en la tabla es la siguiente: Terrible <Pobre <Normal <Bueno <Excelente.
Por lo tanto, los vóxeles son excelentes para modelar la iluminación indirecta, pero no tanto cuando se trata de iluminación directa. Al mismo tiempo, consumen muchos recursos, lo que se correlaciona mal con la tarea de mantener una amplia gama de dispositivos.
Esto llevó a la decisión de crear un sistema de mapas de sombras para iluminación directa. La solución al problema del lucernario y la iluminación global aún no se ha encontrado de forma inequívoca, pero lo más probable es que resulte una especie de híbrido de ambos sistemas.