Cómo se renderiza el marco de DOOM Ethernal





Introducción



Doom Eternal no necesita una presentación separada: es un sucesor directo de Doom 2016, desarrollado gracias a la séptima iteración de id Tech, el motor interno de id Software. En un momento, me sorprendió la alta calidad del componente visual de Doom 2016 y la simplicidad y elegancia de las soluciones técnicas. En este sentido, Doom Eternal supera a su predecesor en muchas áreas, y algunas de ellas merecen un desglose detallado. En este artículo analítico intentaré discutirlos todos.



Mi análisis está inspirado en el duro Adrian Courrèges sobre Doom 2016 ( traducción). En mi opinión, estos trabajos brindan un vistazo a los enfoques para resolver algunos de los problemas de reproducción de los proyectos AAA y, por lo tanto, se convierten en excelentes materiales de enseñanza. En este análisis, planeo discutir las características generales y no profundizar demasiado en las complejidades de cada método de renderizado y paso. Además, algunos de los pasajes en Doom Eternal son casi idénticos a sus contrapartes en Doom 2016 y ya se han desmontado en el trabajo de Adrian Courrèges, por lo que puedo omitirlos.



Me gustaría marcar de manera especial la estricta enseñanzala naturaleza del artículo actual. No apruebo de ninguna manera la ingeniería inversa de productos con el propósito de robo de propiedad intelectual u otra intención maliciosa. Si aún no has jugado a Doom Eternal, no tienes que preocuparte: solo he cubierto el comienzo del juego, por lo que no estás en peligro de spoilers.



Entonces empecemos.



Con el lanzamiento de id Tech 7, la transición del motor de OpenGL a Vulkan API permitió a los desarrolladores trabajar de manera más efectiva con las características de la generación actual de GPU, como los recursos sin enlaces.



Un fotograma en Doom Eternal







Arriba podemos ver una sección del juego cerca del inicio: un interior con varios oponentes e iluminación volumétrica. Por analogía con su predecesor, el proceso de renderizado en Doom Eternal está a cargo del renderizado directo , pero si Doom 2016 se ve obligado a renderizar junto con G-buffering de superficies reflectantes, en nuestro caso el buffer no se usa y el renderizado se hace cargo de todas las tareas.



Alejándose de las mega-texturas



Con el lanzamiento del juego Rage, creado en el motor id Tech 5, el mundo se familiarizó con el concepto de implementación de texturas llamadas "mega texturas". Este método se utiliza en Doom 2016 y para cada fotograma genera una denominada "textura virtual" con información sobre las texturas visibles. La textura virtual se analiza en el siguiente cuadro para determinar qué texturas se deben cargar desde el disco. Sin embargo, las megatexturas tienen un problema obvio: tan pronto como la textura entra en el campo de visión, es demasiado tarde para cargarla, por lo que la textura se ve borrosa en los primeros fotogramas después de que aparece. Con el lanzamiento de id Tech 7, los desarrolladores abandonaron este método.



Despellejar a través de la GPU



Por lo general, incluso antes de renderizar cualquier textura y sombreado, el sombreador de vértices evalúa el aspecto. Skinning id Tech 7 se realiza de antemano mediante un sombreador computacional con la escritura de los vértices resultantes en el búfer. Gracias a este enfoque, el sombreador de vértices ya no necesita datos de máscara y, dado que ya no se realiza en cada pasada de geometría, como resultado, los cambios de sombreador ocurren con menos frecuencia.



La diferencia clave entre la creación de capas en un sombreador de cálculo y un sombreador de vértices es escribir el resultado en un búfer intermedio. Al igual que con el sombreador de vértices, para cada vértice, el subproceso del sombreador de cálculo recibe una transformación de cada hueso que afecta al vértice. Luego cambia la posición del vértice con cada transformación ósea y agrega todas las nuevas posiciones según el peso de las pieles almacenadas en el vértice. Como resultado, el sombreador de vértices puede usar el resultado del búfer para interpretarlo como una malla estática.



El enlace proporciona un excelente artículo sobre Compute Shader Skinning por János Turánszki.



También es útil tener en cuenta que Doom Eternal usa un tipo interesante de almacenamiento en caché: Alembic Cachecomparable al video reproducible en retroceso altamente comprimido. Estos cachés almacenan animaciones horneadas para emitir y descomprimir durante la ejecución del programa. Citando el análisis técnico de Digital Foundry , Alembic Cache se aplica a una amplia gama de animaciones, desde escenas cinematográficas a gran escala hasta pequeños tentáculos en el suelo. Este enfoque es especialmente conveniente para animaciones con complejidades de implementación a través de animación de piel, por ejemplo, para simulación de tejidos y orgánicos. Si está interesado en esta tecnología, le recomiendo que consulte la presentación de Axel Gneiting en Siggraph 2014 .



Mapas de sombras



El siguiente paso es el renderizado de sombras y, a primera vista, id Tech 7 y su enfoque predecesor para generar sus mapas no es diferente.



Como puede ver a continuación, las sombras se renderizan en una textura grande con una profundidad de 24 bits y un tamaño de 4096 por 8196 píxeles, variando la calidad en algunos lugares. La textura no cambia entre fotogramas, y según la presentación "Devil is in the Details" en Siggraph 2016, la geometría estática se almacena en caché en el mapa de sombras para evitar volver a dibujarla para cada fotograma. La idea en sí es simple: no necesitamos actualizar las sombras hasta que haya movimiento frente a la fuente de luz, por lo que podemos declarar un mapa de sombras "almacenado en caché": un mapa regular con geometría estática, ya que asumimos que la geometría no cambia ... Si un objeto dinámico se mueve en el cono de vista, el mapa de sombras "almacenado en caché" se copia al principal y la geometría dinámica se vuelve a dibujar encima. Este enfoque permite no volver a dibujar toda la escena en el cono de visión cada vez que se actualiza. Naturalmente, si se cambia la luz, toda la escena tendrá que volver a dibujarse desde cero.



El muestreo PCF 3x3 se utiliza para suavizar los bordes de las sombras al muestrear el mapa. Dado que la luz solar suele cubrir una parte importante del medio ambiente, se utilizan mapas de sombras en cascada para distribuir mejor la calidad.



Por ejemplo, eche un vistazo al atlas de mapas de sombras. Cuanto mayor sea el significado de la luz, mayor será el área en la pantalla o cuanto más cerca esté el objeto de la cámara, mayor será el segmento seleccionado del atlas; esto es necesario para aumentar los detalles. Estas heurísticas se evalúan dinámicamente.







Velocidad de profundidad y pre-pasada



Comenzando con el arma del jugador, las geometrías opacas, estáticas y dinámicas se renderizan secuencialmente a la profundidad del objetivo. Por lo general, para no hacer cálculos innecesarios de sombreadores de píxeles en una posible intersección de geometrías, se realiza una pasada preliminar de procesamiento de profundidad con la adición del resultado al búfer. Dado que volver a dibujar los píxeles a medida que se cruzan crea nuevos cálculos innecesarios y, en última instancia, afecta negativamente al rendimiento, la importancia de este enfoque se vuelve invaluable. Con el paso previo de profundidad, un sombreador de píxeles de iluminación directa puede eliminar píxeles adicionales comparándolos con un búfer de profundidad antes del cálculo real, ahorrando así valiosos recursos.





Jugador Armas





Objetos estáticos Objetos





dinámicos



En la pasada previa, no solo se renderiza la profundidad, sino también el color de destino. En geometría dinámica, la velocidad se representa a través de vectores de movimiento, es decir, la posición de la posición actual se resta de la posición del píxel en el cuadro anterior. Dado que el movimiento se almacena en los canales rojo y verde de un objetivo de renderizado de punto flotante de 16 bits, solo necesitamos conocer el movimiento X e Y. Esta información se utiliza luego en el posprocesamiento para aplicar desenfoque y reproyección del suavizado temporal. La geometría estática no necesita vectores de movimiento, ya que se "mueve" solo en relación con la cámara y su movimiento se puede calcular a partir del movimiento de la propia cámara. Como puede ver en la captura de pantalla a continuación, no hay mucho movimiento en nuestra escena.







Profundidad jerárquica Z



El siguiente paso es generar una cadena mip de búfer de profundidad jerárquica: esta cadena es similar a un mapa mip, pero en lugar de promediar cuatro píxeles adyacentes, toma su valor máximo. Este enfoque se usa a menudo en gráficos para una variedad de tareas, como acelerar los reflejos y descartar la geometría obstruida. En nuestro caso, la cadena mip está descartando iluminación y calcas, de las que hablaremos más adelante. Recientemente, la generación de mip se ha llevado a cabo en una sola pasada, con grabación en varios mip-s a la vez, pero en Doom Eternal, la grabación todavía se realiza por separado para cada mip.







Calcomanías de malla



Hasta ahora, no hemos tenido tiempo de familiarizarnos con diferencias importantes entre los procesos de Doom Eternal en comparación con Doom 2016, pero las calcomanías de cuadrícula encajan en esta categoría. Se trata de pequeñas calcomanías (tornillos, rejillas, protuberancias) que, como las calcomanías normales, pueden afectar cualquier propiedad de la superficie (normal, rugosidad, color). Sin embargo, los artistas asignan una calcomanía de cuadrícula típica durante el desarrollo de la cuadrícula y, a diferencia de la colocación estándar de calcomanías en el entorno, pertenece a su propia cuadrícula. Doom se ha basado en gran medida en las calcomanías en el pasado, y el cambio actual a las calcomanías de malla solo ha aumentado el detalle y la flexibilidad de los gráficos.



Para lograr este beneficio, la siguiente pasada de geometría convierte los ID de cada calcomanía en una textura de ocho bits. Además, al aplicar sombras, tomamos muestras de la textura y, a través de los identificadores, obtenemos la matriz de proyección asociada con cada llamada a dibujar. La matriz proyecta coordenadas de píxeles desde el espacio mundial al espacio de textura, y luego estas coordenadas se utilizan para muestrear la calcomanía y fusionarla con el material de la superficie. Esta técnica es increíblemente rápida en su ejecución y abre un amplio margen para que los artistas trabajen con una variedad de calcomanías. Dado que los ID se representan en una textura de 8 bits, puede haber hasta 255 calcomanías en una sola malla.



La única condición para todo esto es que todas las texturas de las calcomanías estén vinculadas a los procesos al renderizar mallas. Con un proceso de renderizado completamente no relacionado, los desarrolladores pueden vincular todas las texturas de calcomanías a la vez e indexarlas dinámicamente en el sombreador. Dado que los desarrolladores usan este método para implementar algunos trucos más en el juego, hablaremos más sobre el proceso de renderizado no relacionado más adelante.



A continuación podemos ver la malla de textura de la calcomanía. Para mayor comodidad de visualización, los identificadores están coloreados en diferentes colores.







Lanzando luz y calcas



La luz en Doom Eternal es completamente dinámica y hasta varios cientos de fuentes pueden llegar al campo de visión al mismo tiempo. Además, como señalamos anteriormente, las calcas en el juego son de gran importancia, por ejemplo, en el mismo Doom 2016, el número de calcas superó los miles. Todo esto requiere un enfoque especial para descartar el exceso, de lo contrario, el rendimiento no resistirá la severidad de los sombreadores de píxeles.



Doom 2016 utilizó una versión basada en procesador de rechazo de luz de grupo: la luz y las calcomanías se recopilaron en "froxels" en forma de cono, que luego se leyeron durante el sombreado determinando el índice de grupo a partir de la posición del píxel. El tamaño de cada grupo era de 256 píxeles y se dividió logarítmicamente en 24 segmentos para mantener una forma cuadrada. Esta técnica pronto fue adoptada por muchos otros desarrolladores, y se encuentran métodos similares, por ejemplo, en Detroit: Become Human and Just Cause.



Teniendo en cuenta el creciente número de fuentes de iluminación dinámica (cientos) y calcomanías (miles), la agrupación de CPU de la caída de iluminación en Doom Eternal ya no era suficiente, ya que los vóxeles se estaban volviendo demasiado toscos. Como resultado, los desarrolladores idearon un enfoque diferente para id Tech 7 y, a través de sombreadores computacionales ejecutados en varias etapas, crearon un rasterizador de software. Primero, las calcomanías y la luz se unen en un hexaedro (hexágono) y se transfieren a un rasterizador computacional, desde donde los vértices se proyectan en el espacio de la pantalla. Luego, un segundo sombreador de cálculo recorta los triángulos hasta los bordes de la pantalla y los ensambla en mosaicos de 256 por 256 píxeles. Al mismo tiempo, por analogía con el descarte de grupos, los elementos individuales de las fuentes de luz y las calcomanías se registran en froxels,después de lo cual el siguiente sombreador computacional realiza un procedimiento similar para mosaicos de 32 por 32 píxeles. En cada mosaico, los elementos que pasan la prueba de profundidad se marcan en un campo de bits. El sombreador computacional final traduce los campos de bits en una lista de luces que finalmente se usan en el pase de luz. Curiosamente, los índices de elementos todavía se registran en froxels tridimensionales de 256 por 256 píxeles, similar al enfoque de grupo. En lugares con una interrupción significativa en profundidad, se compara el valor mínimo tanto de la nueva lista de luces como de la antigua lista de fuentes agrupadas para determinar la cantidad de luces en cada mosaico.que se utilizan en última instancia en el pase de iluminación. Curiosamente, los índices de elementos todavía se registran en froxels tridimensionales de 256 x 256 píxeles, similar al enfoque de grupo. En lugares con una interrupción significativa en profundidad, se compara el valor mínimo tanto de la nueva lista de luces como de la antigua lista de fuentes agrupadas para determinar la cantidad de luces en cada mosaico.que se utilizan en última instancia en el pase de iluminación. Curiosamente, los índices de elementos todavía se registran en froxels tridimensionales de 256 por 256 píxeles, similar al enfoque de grupo. En lugares con una interrupción significativa en profundidad, se compara el valor mínimo tanto de la nueva lista de luces como de la antigua lista de fuentes agrupadas para determinar la cantidad de luces en cada mosaico.



Si no se ha ocupado de la rasterización tradicional, es posible que una descripción tan completa no le resulte clara. Si desea profundizar en la pregunta con más detalle, le recomiendo explorar los principios generales de cómo funcionan dichos procesos, por ejemplo, Scratchapixel tiene un muy buen análisis del tema .



Este sistema también descarta los denominados "ámbitos" utilizados para consultar la visibilidad del juego. Dado que la rasterización de software para subprocesos computacionales es un proceso largo, es muy probable que la ocupación sea baja y, por lo tanto, agregar algunos fotogramas adicionales casi no tiene ningún efecto sobre el rendimiento. Teniendo esto en cuenta, es probable que la luz se proyecte de forma asincrónica y, por lo tanto, el impacto neto en el rendimiento es mínimo.



Bloquear la luz ambiental en el espacio de la pantalla



La oclusión ambiental se calcula a la mitad de resolución de una manera bastante estándar: primero, 16 rayos aleatorios emanan de la posición de cada píxel en el hemisferio, y luego los rayos que se cruzan con la geometría se determinan utilizando el búfer de profundidad. Cuantos más rayos crucen la geometría, mayor será la obstrucción. Esta técnica se llama Oclusión direccional del espacio de la pantalla, o SSDO, y aquí se puede encontrar una descripción detallada de Yuriy O'Donnell . En lugar del almacenamiento tradicional de los valores de oclusión en una textura de un solo canal, la oclusión direccional se almacena en una textura de tres componentes y la oclusión resultante se define a través del producto escalar sobre el píxel normal.



Dado que el cálculo se realiza a la mitad de la resolución, el resultado es bastante ruidoso. Para mejorar la calidad con un búfer de profundidad, se aplica un desenfoque de doble cara. El bloqueo de la luz ambiental generalmente ocurre a bajas frecuencias, por lo que el desenfoque generalmente no se nota.







Pasaje recto opaco



En este pasaje, muchos de los elementos finalmente encajan en su lugar. A diferencia de Doom 2016, todo aquí se representa directamente a través de varios mega-sombreadores masivos. Supuestamente hay alrededor de 500 estados de procesador y una docena de diseños de descriptores a lo largo del juego. Las armas del jugador se renderizan primero, luego los objetos dinámicos y luego los estáticos. Tenga en cuenta que el orden no es particularmente importante, porque gracias a la preparación de profundidad ya hemos recibido un búfer de profundidad, y puede excluir píxeles que no corresponden a la profundidad de antemano.





Armas del jugador





Objetos dinámicos





Primer conjunto de objetos estáticos





Segundo conjunto de objetos estáticos



Para la mayoría de los motores de juegos AAA, los gráficos de sombreado y las funciones de sombreado estático permiten a los desarrolladores ser creativos con todo tipo de materiales y superficies, y cada material, cada superficie, conduce a su propio sombreador único. Como resultado, nos enfrentamos a una increíble variedad de permutaciones de sombreado para todas las combinaciones posibles de características del motor. Sin embargo, id Tech es muy diferente de otros proyectos AAA: combina casi todos los materiales y características en solo unos pocos mega-shaders masivos. Este enfoque permite que las GPU combinen la geometría de manera más estrecha, lo que a su vez tiene un efecto positivo en el rendimiento. Discutiremos esto más tarde.



Recursos desatados



Vale la pena señalar que todo el proceso de creación de gráficos contiene la idea de "recursos no relacionados". Esto significa que en lugar de vincular el desenfoque, los reflejos y la rugosidad de la textura antes de cada llamada de dibujo, se vincula la lista completa de texturas en la escena a la vez. Se accede dinámicamente a las texturas de la lista en el sombreador a través de los índices pasados ​​al sombreador por constantes. Así, a través de cualquier llamada a dibujar, se puede obtener cualquier textura, lo que abre el camino a muchas optimizaciones, una de las cuales ahora hablaremos.







Fusionar dinámicamente llamadas de sorteo



Además de una arquitectura de recursos completamente desacoplada, todos los datos de geometría se asignan desde un búfer grande . Este búfer simplemente almacena el desplazamiento de toda la geometría.



Aquí es donde entra en juego la tecnología más interesante de idTech 7: fusión dinámica de llamadas de sorteo.... Se basa en una arquitectura de recursos desacoplada y una memoria de vértice generalizada y, en última instancia, reduce significativamente la cantidad de llamadas de extracción y el tiempo del procesador. Antes de que comience cualquier renderizado, el sombreador de cálculo crea dinámicamente un búfer de índice "indirecto" para fusionar de manera eficiente geometrías de mallas no relacionadas en una única llamada de dibujo indirecto. Sin recursos no relacionados, la combinación de llamadas no funcionaría porque funciona con geometrías con propiedades de material no coincidentes. En el futuro, será posible volver a utilizar el búfer de índice dinámico, tanto para la preparación de profundidad como para la preparación de iluminación.



Reflexiones



El sombreador computacional más común utiliza el algoritmo raymarching para crear reflejos en el espacio de la pantalla. El algoritmo emite un rayo desde el píxel al espacio mundial hacia la reflexión, que depende de la rugosidad de la superficie reflectante. Lo mismo sucedió en Doom 2016, donde se registró un pequeño búfer G como parte del pase hacia adelante. Sin embargo, en Doom Eternal ya no hay ningún búfer G, e incluso los reflejos del espacio de la pantalla se calculan no en el sombreador computacional por separado, sino inmediatamente en el sombreador directo . Es interesante saber cómo tal desviación en el sombreador de píxeles afecta el rendimiento, ya que parece que a expensas del aumento de carga en el registro, los desarrolladores estaban tratando de reducir la cantidad de objetivos de renderizado y, como resultado, reducir la carga en el ancho de banda de la memoria.



A menudo, cuando la textura del espacio de la pantalla no contiene la información necesaria, aparecen artefactos de renderizado en los efectos correspondientes. Esto se ve con mayor frecuencia en los reflejos del espacio de la pantalla en los casos en que los objetos reflectantes invisibles no pueden reflejarse. El problema generalmente se resuelve con el enfoque tradicional, utilizando mapas de cubos de reflexión estática como respaldo.







Pero dado que las mega-texturas ya no se usan en Doom Eternal, tampoco hay necesidad de texturas de respaldo.



Partículas



Simulación



En Doom Eternal, parte de la simulación del procesador de partículas recae sobre los hombros de los sombreadores computacionales, ya que algunos sistemas de partículas dependen de la información del espacio de la pantalla, como un búfer de profundidad para simular colisiones. Mientras que otros sistemas de partículas pueden ejecutarse en el marco a la vez y calcularse de forma asincrónica, tales simulaciones requieren datos preliminares de preparación de profundidad. Lo que es característico, a diferencia de la simulación tradicional de shader de partículas, aquí la simulación se realiza mediante la ejecución de una secuencia de "comandos" desde el búfer almacenado en el shader computacional. Cada hilo de sombreado ejecuta todos los comandos, entre los cuales puede haber varias modificaciones de parámetros de eliminación, emisión o partículas. Todo esto parece una máquina virtual escrita en un sombreador. No entiendo mucho sobre las complejidades de tal simulación, pero el enfoque se basaen la presentación de Brandon Whitney "The Destiny Particle Architecture" en Siggraph 2017 . El método de la presentación es muy similar al que describí anteriormente y se usa en muchos otros juegos. Por ejemplo, estoy bastante seguro de que el sistema de simulación de partículas de Niagara funciona de manera similar en Unreal Engine 4.



Encendiendo



De forma similar a Doom 2016 y al método descrito en Siggraph 2016, la resolución de las partículas de iluminación se desacopla de la resolución de pantalla real , dando a los desarrolladores control sobre la resolución de cada sistema de partículas en función de la calidad, el tamaño de la pantalla y el control directo. Para efectos de baja frecuencia, la iluminación se puede proporcionar a una resolución mucho más baja sin casi ninguna pérdida de calidad en comparación con, por ejemplo, las chispas que requieren alta resolución. La iluminación y la dirección dominante de la luz se almacenan en dos atlas de 2048 por 2048 píxeles, ambos disponibles para cada pasada a través de recursos no ligados, como cualquier otra textura. Además, para renderizar partículas, se dibuja una geometría simple mediante el muestreo de estos atlas.





Un fragmento ampliado de un atlas de iluminación.



Cielo y dispersión



Ahora hablaremos de iluminación volumétrica . Su generación consta de cuatro pasadas y comienza creando una textura 3D LUT para la atmósfera del cielo a través del raymarching a través del cielo mismo hacia la fuente de luz.







Desde la primera vez, es posible que no entiendas qué muestra exactamente la textura en la imagen, pero si la giramos 90 grados y la estiramos horizontalmente, todo se vuelve claro: tenemos una dispersión de la atmósfera. Dado que es más variable verticalmente que horizontalmente, la resolución vertical es mayor. La atmósfera está representada por una esfera, por lo que la rotación horizontal generalmente se llama longitud y la rotación vertical generalmente se llama latitud. La dispersión atmosférica es calculada por el hemisferio y cubre 360 ​​grados de longitud y 180 grados de latitud para la parte superior de la esfera. Para cubrir diferentes distancias al observador, la textura LUT contiene 32 segmentos de profundidad y, en lugar de volver a calcular los datos del cielo en cada cuadro, el proceso se distribuye en 32 cuadros.







Gracias a la textura LUT, la siguiente pasada calcula la dispersión de la luz por el "froxel" observado por analogía con una obstrucción de racimo en una escala más pequeña. Puede observar varios segmentos, de cerca a lejos, abajo.







En la tercera pasada, los datos de dispersión de cada celda se multiplican en cada celda subsiguiente en la dirección de la vista y se escriben en una nueva textura 3D.



Como resultado, la iluminación volumétrica se coloca encima de la imagen renderizada mediante el muestreo de la textura 3D recién generada en función de la profundidad de píxeles.





Antes





Después



El cielo "visible" final se representa en un hemisferio si está en la vista. En esta escena, el cielo no se incluyó en la revisión, pero a continuación puede ver un ejemplo de renderizado del cielo en una escena al aire libre.







Transparencia



Al igual que en Doom 2016, la transparencia se representa mediante un pase hacia adelante después de la geometría opaca cuando hay datos de dispersión de luz. Al mismo tiempo, la textura de la escena pierde resolución (muestras reducidas) y se selecciona un nivel de mip adecuado para "simular" la transparencia en función de la suavidad de la superficie. Los datos de dispersión de luz ayudan a crear una dispersión visualmente buena desde el interior de la superficie.



A continuación puede ver un ejemplo de una cadena mip de textura de la escena, donde más superficies transparentes caen en la ventana gráfica.





Para la transparencia, solo los píxeles relacionados con ella se pierden en resolución.



Interfaz de usuario



Normalmente, la última pasada en un marco es la interfaz de usuario. Como suele ser el caso, la interfaz se renderiza en un destino de renderizado LDR (ocho bits) de resolución completa secundaria, y el color se multiplica previamente por el canal alfa. Durante el mapeo de tonos, la interfaz se superpone a la textura HDR. Hacer que la interfaz funcione con el resto del contenido HDR en el marco suele ser complicado, pero en Doom Eternal, el mapeo de tonos escala mágicamente la interfaz y se ve natural en comparación con otro contenido 3D.







Postprocesamiento



Lo primero en el posprocesamiento es el desenfoque : este efecto de dos pasadas lee datos de la textura del color y un búfer de velocidad personalizado. La primera pasada recolecta cuatro muestras en el eje vertical, la segunda - cuatro a lo largo del horizontal. Luego, las muestras de color se mezclan de acuerdo con el movimiento de los píxeles. Para evitar el desenfoque, el búfer de velocidad personalizado debe garantizar que no haya imágenes fantasma y que el arma del jugador esté excluida del proceso.



Luego viene el impacto específico: Esta textura RG (bicolor) 1 por 1 contiene la iluminación promedio de toda la escena y se calcula reduciendo sucesivamente la textura de color y obteniendo la iluminación promedio de un grupo de píxeles. Muy a menudo, esta técnica se utiliza para simular la habituación del ojo humano a un cambio brusco en el brillo ambiental. Además, la iluminación promedio se utiliza al calcular el impacto durante el mapeo de tonos.







Después de todo esto, Bloom está calculado . Este efecto no es suficiente en nuestro ejemplo y no será posible renderizarlo ampliamente, pero es suficiente saber que el cálculo se realiza obteniendo datos de color por encima de cierto límite y disminuyendo gradualmente la resolución de la textura para difuminarlo.



Luego mapeo de tonoscombina todos los efectos. Un solo sombreador de cálculo hace lo siguiente:



  • Aplica distorsión
  • Renders sobre textura Bloom
  • Calcula viñeteado, suciedad en la cámara, aberración cromática, destello de lente y muchos otros efectos
  • Obtiene el valor de exposición basado en la iluminación promedio
  • Permite el mapeo de tonos para distribuir los colores HDR en los rangos correctos tanto para LDR como para HDR a través de un operador de mapeo de tonos personalizado.


Finalmente, la interfaz se superpone en la parte superior.



La textura de distorsión se renderiza incluso antes del pase de posprocesamiento: la geometría como una neblina de fuego de los efectos de partículas se renderiza en un nuevo objetivo de renderizado en un formato con una cuarta parte de la resolución original. En este render, los datos de distorsión se almacenan en los canales rojo y verde, y la oclusión en el azul. Los datos obtenidos se aplican cuando la imagen está distorsionada en el paso de mapeo de tonos.







Conclusión



Nuestro rápido desglose de una toma de Doom Eternal ha llegado a su fin, aunque estoy seguro de que no mencioné algunas cosas que afectan la apariencia del juego. En mi opinión, Doom Eternal es un éxito técnico increíble, e id Software podrá elevar el listón aún más en el futuro. El equipo de desarrollo nos ha demostrado con éxito cómo el pensamiento inteligente y la planificación eficaz han ayudado a crear un juego de alta calidad, y creo que este es un gran modelo a seguir, así como material educativo. Espero con interés los futuros desarrollos de id Software.



Rasgar y rasgar, hasta que esté listo.



Materiales de referencia






All Articles