Parte 1: procesamiento de vérticesEn este artículo, veremos más de cerca lo que le sucede al mundo 3D después de que se procesen todos sus vértices. Nuevamente tendremos que sacudir el polvo de los libros de texto de matemáticas, acostumbrarnos a la geometría de las pirámides de truncamiento y resolver el misterio de las perspectivas. También nos sumergiremos brevemente en la física del trazado de rayos, la iluminación y los materiales.
El tema principal de este artículo es una importante etapa de representación, en la que el mundo tridimensional de puntos, segmentos y triángulos se convierte en una cuadrícula bidimensional de bloques multicolores. Muy a menudo, este proceso parece invisible, porque la conversión de 3D a 2D es invisible, en contraste con el proceso descrito en el
artículo anterior , donde pudimos ver inmediatamente la influencia de los sombreadores de vértices y la teselación. Si aún no está listo para esto, puede comenzar con nuestro artículo
3D Game Rendering 101 .
Preparación para dos mediciones.
La gran mayoría de los lectores leen este sitio web en un monitor completamente plano o en la pantalla de un teléfono inteligente; pero incluso si tiene una técnica moderna: un monitor curvo, la imagen que muestra también consta de una cuadrícula plana de píxeles multicolores. Sin embargo, cuando juegas al nuevo Call of Mario: Deathduty Battleyard, las imágenes parecen tridimensionales. Los objetos se mueven por la escena, se hacen más grandes o más pequeños, se acercan y se alejan de la cámara.
Tomando Bethesda's
Fallout 4 como ejemplo, lanzado en 2014, podemos ver fácilmente cómo se procesan los picos, creando una sensación de profundidad y distancia; Esto es especialmente notable en el modo de estructura alámbrica (ver arriba).
Si toma algún juego 3D en las últimas dos décadas, casi cada uno de ellos realiza la misma secuencia de acciones para convertir el mundo 3D de vértices en una matriz de píxeles 2D. Esta conversión a menudo se llama
rasterización , pero este es solo uno de los muchos pasos en todo el proceso.
Necesitamos analizar las diferentes etapas y estudiar las técnicas y cálculos utilizados en ellas. Como referencia, utilizaremos la secuencia utilizada en Direct3D. La imagen a continuación muestra lo que sucede con cada vértice del mundo:
Tubería de conversión de Direct3DEn el
primer artículo [
traducción en Habré] vimos lo que está sucediendo en el espacio mundial (espacio mundial): aquí, usando varios cálculos matriciales, los vértices se transforman y colorean. Omitiremos el siguiente paso, porque en el espacio de la cámara solo los vértices se convierten y ajustan después de moverse, de modo que la cámara se convierte en un punto de referencia.
Los siguientes pasos son demasiado complicados para omitirlos, ya que son absolutamente necesarios para la transición de 3D a 2D: si se implementa correctamente, nuestro cerebro mirará una pantalla plana, pero "verá" una escena con profundidad y escala. Si todo se hace mal, ¡la imagen será muy extraña!
Se trata de perspectiva
El primer paso en esta secuencia es establecer el alcance desde el punto de vista de la cámara. Para hacer esto, primero debe establecer los ángulos del campo de visión horizontal y vertical, el primero a menudo cambia en los juegos, porque las personas han desarrollado una visión periférica horizontal mejor que la vertical.
Podemos resolver esto mirando la imagen con el campo de visión de una persona:
Las dos esquinas del campo de visión (campo de visión, fov) definen la forma de la pirámide de
frustum : una pirámide 3D con una base cuadrada que emana de la cámara. La primera esquina establece el campo
vertical , la segunda
horizontal ; los denotamos con los símbolos
α y
β . De hecho, vemos que el mundo no es así, pero desde el punto de vista de los cálculos es mucho más fácil trabajar con la pirámide de truncamiento en lugar de tratar de generar una cantidad realista de visibilidad.
También debe especificar dos parámetros más: la ubicación de los
planos de recorte (planos de recorte) cercanos (o frontales) y lejanos (posteriores
) . El primero corta la parte superior de la pirámide, pero esencialmente determina qué tan cerca de la posición de la cámara se dibuja todo; este último hace lo mismo, pero determina qué tan lejos de la cámara se procesarán las primitivas.
El tamaño y la ubicación del plano de truncamiento cercano es muy importante porque se convierte en lo que se llama
una ventana gráfica . De hecho, esto es lo que vemos en el monitor, es decir marco renderizado, y en la mayoría de las API de gráficos, la ventana gráfica se dibuja desde la esquina superior izquierda. En la imagen a continuación, el punto (a1, b2) será el origen del plano: el ancho y la altura del plano se miden en relación con él.
La relación de aspecto de la ventana gráfica es importante no solo para mostrar el mundo renderizado, sino también para que coincida con la relación de aspecto del monitor. Durante muchos años, el estándar fue 4: 3 (o 1.3333 ... en decimal). Sin embargo, hoy la mayoría juega en una relación de aspecto de 16: 9 o 21: 9, llamada pantalla panorámica y pantalla ultra panorámica.
Las coordenadas de cada vértice en el espacio de la cámara deben transformarse para que se ajusten en el plano de truncamiento cercano, como se muestra a continuación:
Recorte lateral y superior de la pirámideLa transformación se realiza utilizando otra matriz llamada
matriz de proyección en perspectiva . En el siguiente ejemplo, para realizar las transformaciones, utilizamos los ángulos del alcance y la posición de los planos de truncamiento; sin embargo, puede usar el tamaño de la ventana gráfica en su lugar.
El vector de posición del vértice se multiplica por esta matriz, que nos da un nuevo conjunto de coordenadas transformadas.
Voila! Ahora todos los vértices están escritos de tal manera que el mundo fuente se presenta como una perspectiva 3D, y las primitivas cerca del plano de truncamiento frontal parecen más grandes que las más cercanas al plano lejano.
Aunque el tamaño de la ventana gráfica y los ángulos de ángulo de visión están relacionados, pueden procesarse individualmente. En otras palabras, puede establecer la pirámide de truncamiento de tal manera que obtenga un plano de truncamiento cercano que difiera en tamaño y relación de aspecto de la ventana gráfica. Para hacer esto, se necesita un paso adicional en la cadena de operaciones, en el cual los vértices en el plano de truncamiento cercano deben transformarse nuevamente para dar cuenta de esta diferencia.
Sin embargo, esto puede conducir a una distorsión de la perspectiva visible. Usando el
juego Bethesda
Skyrim 2011 como ejemplo
, podemos ver cómo cambiar el ángulo horizontal de la región de visibilidad
β mientras se mantiene la misma relación de aspecto de la ventana gráfica afecta en gran medida la escena:
En esta primera imagen, establecemos
β = 75 °, y la escena se ve completamente normal. Intentemos ahora establecer
β = 120 °:
Dos diferencias se notan de inmediato: en primer lugar, ahora vemos mucho más en los lados de nuestro "campo de visión"; En segundo lugar, los objetos ahora parecen mucho más lejanos (especialmente los árboles). Sin embargo, el efecto visual en la superficie del agua ahora se ve mal, porque el proceso no fue diseñado para tal área de visibilidad.
¡Ahora imaginemos que nuestro personaje tiene ojos extraños y establezca
β = 180 °!
Tal área de visibilidad crea una escena casi panorámica, pero debe pagarla con una gran distorsión de los objetos renderizados en los bordes. Esto nuevamente sucedió debido al hecho de que los diseñadores del juego no previeron tal situación y no crearon los recursos y efectos visuales del juego para tal ángulo de visión (el valor estándar es aproximadamente 70 °).
Puede parecer que en las imágenes anteriores la cámara se ha movido, pero esto no es así: el único cambio es modificar la pirámide de truncamiento, que a su vez cambió las dimensiones del plano de truncamiento cercano. En cada imagen, la relación de aspecto de la ventana gráfica sigue siendo la misma, por lo que la matriz de escala se aplica a los vértices para que todo encaje en ella.
¿Entonces te quedas o te vas?
Después de realizar las transformaciones en la etapa de proyección, pasamos a lo que se llama un
espacio de recorte . Aunque esto se hace
después de la proyección, es más fácil mostrar lo que sucede si realizamos las operaciones por adelantado:
En la figura anterior, vemos que en el pato de goma, uno de los murciélagos y parte de los árboles, los triángulos están dentro de la pirámide de truncamiento; sin embargo, el otro murciélago y el árbol más alejado están fuera de los límites de la pirámide de truncamiento. Aunque los vértices que componen estos objetos ya se han procesado, no los veremos en la ventana gráfica. Esto significa que
están recortados .
Al
truncar a lo largo de la pirámide (recorte de frustum), todas las primitivas fuera de la pirámide de truncamiento se eliminan por completo, y las que se encuentran en los bordes se convierten en nuevas primitivas. El truncamiento no mejora en gran medida el rendimiento, porque todos estos vértices invisibles ya se han procesado antes de esta etapa en sombreadores de vértices, etc. Si es necesario, se puede omitir por completo el paso de truncamiento completo, pero esta característica no es compatible con todas las API (por ejemplo, el OpenGL estándar no permitirá que se omita, pero esto se puede hacer usando la extensión API).
Vale la pena señalar que la posición del plano de truncamiento lejano en los juegos no siempre es igual a la
distancia de sorteo , ya que este último está controlado por el motor del juego. El motor también realiza un
recorte en la pirámide (eliminación del tronco) : ejecuta un código que determina si el objeto se dibujará dentro de la pirámide de truncamiento y si afectará a los objetos visibles; Si la respuesta es
no , el objeto no se transfiere a la representación. Esto no es lo mismo que el recorte de frustrum porque también descarta primitivas fuera de la pirámide, pero ya han pasado la etapa de procesamiento de vértices. Cuando se eliminan, no se procesan en absoluto, lo que ahorra muchos recursos.
Hemos hecho todas las transformaciones y el truncamiento, y parece que los vértices finalmente están listos para el siguiente paso en la secuencia de representación. Pero, de hecho, esto no es así, porque todos los cálculos realizados en la etapa de procesamiento de vértices y en las operaciones de transformación del espacio mundial al espacio de truncamiento deben realizarse en un sistema de coordenadas uniforme (es decir, cada vértice tiene 4 componentes, no 3) . Sin embargo, la ventana gráfica es completamente bidimensional, es decir, la API espera que la información del vértice contenga solo los valores para
x, y (aunque
se guarda el valor de profundidad
z ).
Para deshacerse del cuarto componente, se realiza una
división en perspectiva , en la que cada componente se divide por el valor de
w . Esta operación restringe
xey al intervalo de valores posibles [-1.1],
yz al intervalo [0.1]. Estos se denominan
coordenadas de dispositivo normalizadas (NDC).
Si desea obtener más información sobre lo que acabamos de explicar y le gustan las matemáticas, lea el
excelente tutorial sobre este tema Song Ho An. ¡Ahora vamos a convertir estos vértices en píxeles!
Dominamos la rasterización
Como en el caso de las transformaciones, veremos las reglas y los procesos utilizados para convertir una ventana gráfica en una cuadrícula de píxeles, utilizando Direct3D como ejemplo. Esta tabla se asemeja a una hoja de cálculo Excel con filas y columnas, en la que cada celda contiene diferentes valores de datos (como color, valores de profundidad, coordenadas de textura, etc.). Por lo general, esta cuadrícula se denomina
imagen ráster , y el proceso de su generación se denomina
rasterización . En el artículo
3D rendering 101, simplificamos este procedimiento:
La imagen de arriba da la impresión de que las primitivas simplemente se cortan en pequeños bloques, pero en realidad hay muchas más operaciones. El primer paso es determinar si la primitiva está orientada hacia la cámara; por ejemplo, en la imagen de arriba con una pirámide de truncamiento, las primitivas que forman la parte posterior del conejo gris no serán visibles. Por lo tanto, aunque están presentes en la ventana gráfica, no necesitan ser renderizados.
Podemos imaginar aproximadamente cómo se ve mirando el diagrama a continuación. El cubo experimentó varias transformaciones para colocar el modelo 3D en el espacio 2D de la pantalla, y desde el punto de vista de la cámara, algunas de las caras del cubo no son visibles. Si suponemos que todas las superficies son opacas, entonces algunas de estas primitivas pueden ignorarse.
De izquierda a derecha: espacio mundial> espacio de cámara> espacio de proyección> espacio de pantallaEn Direct3D, esto se puede implementar diciéndole al sistema cuál será el
estado de representación , y esta instrucción le hará saber que es necesario quitar (
cortar ) los lados de cada primitivo mirando hacia adelante o hacia atrás (o no cortar completamente, por ejemplo, en modo de
estructura alámbrica ) . Pero, ¿cómo sabe qué lado mira hacia adelante o hacia atrás? Cuando examinamos las
matemáticas del procesamiento de vértices , vimos que los triángulos (o más bien los vértices) tienen vectores normales que le indican al sistema en qué dirección está mirando. Gracias a esta información, puede realizar una verificación simple, y si la primitiva falla, entonces se elimina de la cadena de representación.
Ahora es el momento de aplicar la cuadrícula de píxeles. Este es de nuevo un proceso inesperadamente complejo, porque el sistema debe comprender si el píxel está dentro de la primitiva, completamente, parcialmente o nada. Para hacer esto, se realiza el proceso de
prueba de cobertura . La siguiente figura muestra cómo los triángulos se rasterizan en Direct3D 11:
La regla es bastante simple: se considera que un píxel está dentro del triángulo si el centro del píxel pasa un cheque, lo que Microsoft llama la
regla "superior izquierda" . "Arriba" se refiere a verificar la línea horizontal; El centro del píxel debe estar
en esta línea. "Izquierda" se refiere a líneas no horizontales, y el centro del píxel debe estar a la izquierda de dicha línea. Existen otras reglas relacionadas con las no primitivas, por ejemplo, segmentos y puntos simples, y cuando se utilizan
múltiples muestras , adicionales si aparecen condiciones en las reglas.
Si observa detenidamente la documentación de Microsoft, puede ver que las formas creadas por los píxeles no son muy similares a las primitivas originales. Esto se debe a que los píxeles son demasiado grandes para crear un triángulo realista: la imagen de mapa de bits no contiene suficientes datos sobre los objetos originales, lo que provoca un fenómeno llamado
alias .
Veamos el alias con un ejemplo de
UL Benchmark 3DMark03 :
Rasterización de 720 x 480 píxelesEn la primera imagen, la imagen de trama tiene una resolución muy baja: 720 por 480 píxeles. El alias es claramente visible en la barandilla y la sombra proyectada por las armas del soldado superior. Compare esto con el resultado obtenido durante la rasterización con un aumento de 24 veces en el número de píxeles:
Rasterización 3840 x 2160 píxelesAquí vemos que el alias en la barandilla y la sombra ha desaparecido por completo. Parece que siempre debe usar un mapa de bits grande, pero el tamaño de la cuadrícula debe ser compatible con el monitor en el que se mostrará el marco. Y teniendo en cuenta el hecho de que todos estos píxeles deben procesarse, es obvio que habrá una disminución en el rendimiento.
Multimuestreo puede ayudar aquí. Así es como funciona en Direct3D:
En lugar de verificar si el centro del píxel coincide con las reglas de rasterización, se
verifican varios puntos dentro de cada píxel (llamados muestras de subpíxeles o submuestras), y si algunos de ellos satisfacen los requisitos, forman parte de la figura. Puede parecer que no hay ningún beneficio y el alias incluso se mejora, pero cuando se usa el muestreo múltiple, la información sobre qué submuestras están cubiertas por la primitiva y los resultados del procesamiento de píxeles se almacenan en un búfer en la memoria.
Este búfer se usa para mezclar estas submuestras y píxeles para que los bordes de la primitiva estén menos desgarrados. Analizaremos el alias en otro artículo con más detalle, pero por ahora esta información es suficiente para que comprendamos qué puede hacer el muestreo múltiple cuando se usa para rasterizar muy pocos píxeles:
Como puede ver, la cantidad de alias en los bordes de diferentes formas ha disminuido significativamente. La rasterización de mayor resolución es definitivamente mejor, pero la degradación del rendimiento puede incitarlo a usar el muestreo múltiple.
También durante la rasterización, se realiza una
prueba de oclusión . Es necesario porque la ventana gráfica se llenará de primitivas superpuestas entre sí; por ejemplo, en la figura anterior, los triángulos que miran hacia adelante que conforman al soldado en primer plano se superponen a los mismos triángulos de otro soldado. Además de verificar si la primitiva cubre un píxel, también puede comparar las profundidades relativas, y si una superficie está detrás de otra, debe eliminarse del proceso de renderización restante.
Sin embargo, si la primitiva cercana es transparente, la primitiva lejana permanecerá visible, aunque no pasará la prueba de superposición. Es por eso que casi todos los motores 3D realizan comprobaciones de superposición
antes de enviar datos a la GPU y en su lugar crean algo llamado
z-buffer , que es parte del proceso de renderizado. Aquí, el marco se crea de la manera habitual, pero en lugar de guardar los colores de píxeles listos para usar en la memoria, la GPU guarda solo los valores de profundidad. Posteriormente se pueden usar en sombreadores para verificar la visibilidad y con un gran control y precisión de los aspectos relacionados con la superposición de objetos.
En la imagen que se muestra arriba, cuanto más oscuro es el color del píxel, más cerca está el sujeto de la cámara. z-, , , z-. , .
— , , , . , , ,
. , , .
A pesar de que la pantalla rasterizada se presenta en 2D, las estructuras en su interior representan una perspectiva 3D. Si las líneas realmente fueran bidimensionales, entonces podríamos usar una ecuación lineal simple para calcular colores y otras cosas , porque nos movemos de un vértice a otro. Pero debido al aspecto 3D de la escena, la interpolación debe tener en cuenta esta perspectiva; Para obtener más información sobre este proceso, lea el excelente artículo de Simon Young .Entonces, la tarea se completa, por lo que el mundo 3D de vértices se convierte en una cuadrícula 2D de bloques coloridos. Pero aún no hemos terminado.De adelante hacia atrás (con algunas excepciones)
Antes de que terminemos de considerar la rasterización, necesitamos hablar sobre el orden de la secuencia de representación. No estamos hablando de la etapa en la que, por ejemplo, aparece la teselación en la secuencia de procesamiento; nos referimos al orden en que se procesan las primitivas. Los objetos generalmente se procesan en el orden en que están en el búfer de índice (un bloque de memoria que le dice al sistema cómo se agrupan los vértices) y esto puede afectar significativamente la forma en que se procesan los objetos y efectos transparentes., , , ( (occlusion culling)) ( ). "
", .
, , . , .
De izquierda a derecha: el orden en la escena, renderizado de adelante hacia atrás, renderizado de atrás hacia adelante.Es decir, en todos los juegos modernos, ¿el renderizado se realiza de atrás hacia adelante? Cualquiera que sea el caso, no olvide que renderizar cada primitivo individual conducirá a una disminución mucho mayor en el rendimiento en comparación con renderizar solo lo que vemos. Existen otras formas de procesar objetos transparentes, pero en el caso general no existe una solución ideal adecuada para cualquier sistema, y cada situación debe considerarse por separado.De hecho, esto nos permite comprender los principales pros y contras de la rasterización: en los equipos modernos es un proceso rápido y eficiente, pero sigue siendo un reflejo aproximado de lo que vemos. En el mundo real, cada objeto puede absorber, reflejar y, a veces, refractar la luz, y todo esto afecta la apariencia final de la escena mostrada. Dividiendo el mundo en primitivas y renderizando solo partes de ellas, nos hacemos rápidos. Pero un resultado muy duro.Ahora, si hubiera otra forma ...Otra forma es: ¡trazado de rayos!
Hace casi cincuenta años, un informático llamado Arthur Eppel trabajó en un sistema para representar imágenes en una computadora en la que se emitía un haz de luz de la cámara en línea recta hasta que chocó con un objeto. Después de la colisión, las propiedades del material (su color, reflectividad, etc.) cambiaron el brillo del haz de luz. Para cada píxel en la imagen renderizada, había un rayo emitido, y el algoritmo realizó una cadena de cálculos para determinar el color del píxel. El proceso de Eppel se llama fundición de rayos .Unos diez años después, otro científico llamado John Whited , , , , . , ; , , .
(ray tracing) ( ,
, , )
.
De la imagen de arriba, puedes entender cómo funciona el algoritmo Whited. Por cada píxel en el cuadro, se emite un haz desde la cámara y se mueve hasta que alcanza la superficie. En este ejemplo, la superficie es translúcida, por lo que la luz puede reflejarse y refractarse a través de ella. En ambos casos, se generan rayos secundarios que viajan hasta que chocan con la superficie. También se generan nuevos rayos secundarios para tener en cuenta el color de las fuentes de luz y las sombras que crean.La naturaleza recursiva del proceso es que se pueden generar rayos secundarios cada vez que un nuevo rayo emitido se cruza con la superficie. Esto puede salirse rápidamente de control, por lo que el número de rayos secundarios generados siempre es limitado. Después de completar la trayectoria del haz, el color en cada punto final se calcula en función de las propiedades del material de esta superficie. Este valor luego se transmite a lo largo del rayo anterior, cambiando el color de esta superficie, y así sucesivamente, hasta llegar al punto de inicio del rayo primario, es decir, el píxel en el marco.. , , — -, , , , ( ). — , , — , :
: Nvidia RTX, (bounding volumes, BV) — , . .
, BV . , , , ..; , .., . , (
BV hierarchy BVH); BV:
BVH, , , , 3D-.
,
Blender POV-ray ( photon tracing radiosity) :
Puede surgir la pregunta obvia: si el trazado de rayos es tan bueno, ¿por qué no se usa en todas partes? La respuesta radica en dos áreas: en primer lugar, incluso un simple trazado de rayos crea millones de rayos que deben calcularse una y otra vez. El sistema comienza con un solo haz por píxel de pantalla, es decir, con una resolución de 800 x 600, genera 480,000 rayos primarios, y luego cada uno de ellos genera muchos rayos secundarios. Este es un trabajo muy difícil, incluso para las PC de escritorio modernas. El segundo problema es que el trazado de rayos simple no es muy realista y para su correcta implementación necesitas un montón de ecuaciones adicionales muy complejas.Incluso con equipos modernos, la cantidad de trabajo en juegos 3D es inalcanzable para la implementación en tiempo real. En renderizado 3D 101vimos que un punto de referencia de trazado de rayos tarda decenas de segundos en crear una sola imagen de baja resolución.¿Cómo realizó el primer Wolfenstein 3D el lanzamiento de rayos en 1992, y por qué los juegos como Battlefield V y Metro Exodus , lanzados en 2019, ofrecen capacidades de trazado de rayos? ¿Realizan rasterización o trazado de rayos? Poco a poco de ambos.Un enfoque híbrido para el presente y el futuro.
En marzo de 2018, Microsoft anunció el lanzamiento de una nueva extensión API para Direct3D 12 llamada DXR (DirectX Raytracing). Era una nueva tubería de gráficos que complementa las tuberías estándar de rasterización y computación. Se agregó funcionalidad adicional mediante la adición de sombreadores, estructuras de datos, etc., pero no requirió soporte de hardware, excepto el que ya era necesario para Direct3D 12.En la misma Conferencia de Desarrolladores de Juegos, en la que
Microsoft habló sobre DXR , Electronic Arts habló sobre su
Proyecto Pica Pica , un experimento con un motor 3D que usa DXR. La compañía ha demostrado que se puede usar el trazado de rayos, pero no para renderizar todo el marco. La mayor parte del trabajo utiliza técnicas tradicionales de rasterización y sombreadores computacionales, mientras que DXR se usa en áreas específicas. Es decir, la cantidad de rayos generados es mucho menor de lo que sería para toda la escena.
Este enfoque híbrido se ha utilizado en el pasado, aunque en menor medida. Por ejemplo, Wolfenstein 3D
utilizó la proyección de rayos para representar un cuadro, pero se realizó con una columna de haz por píxel, no un píxel. Todavía puede parecer impresionante, a menos que recuerdes que el juego funcionó con una resolución de 640 x 480 [aprox. traducción: en realidad 320 x 200], es decir, al mismo tiempo no se emitieron más de 640 rayos.
A principios de 2018, las tarjetas gráficas como la AMD Radeon RX 580 o la Nvidia GeForce 1080 Ti cumplían con los requisitos de DXR, pero incluso con sus capacidades informáticas, existía la preocupación de que no serían lo suficientemente potentes como para que DXR tuviera sentido.
La situación cambió en agosto de 2018 cuando Nvidia lanzó su última arquitectura de GPU
, llamada Turing . La característica más importante de este chip fue la aparición de los llamados núcleos RT: bloques lógicos separados para acelerar los cálculos de la intersección triángulo-rayo y el paso de la jerarquía de volúmenes delimitadores (BVH). Estos dos procesos son procedimientos que requieren mucho tiempo para determinar los puntos de interacción de la luz con los triángulos que forman los objetos de la escena. Dado que los núcleos RT eran unidades de procesador Turing únicas, el acceso a ellos solo se podía hacer a través de la API propietaria de Nvidia.
El primer juego que admitió esta característica fue Battlefield V de EA.
Cuando probamos DXR en él , nos impresionó la mejora en los reflejos en el agua, el césped y los metales, así como la disminución correspondiente en el rendimiento:
Para ser honesto, los parches posteriores mejoraron la situación, pero aún hubo una disminución en la velocidad de renderizado de cuadros (y todavía lo es). Para 2019, había algunos otros juegos que admiten esta API y realizan el trazado de rayos para partes individuales del marco. Probamos
Metro Exodus y
Shadow of the Tomb Raider , ante la misma situación: el uso activo de DXR reduce significativamente la velocidad de fotogramas.
Casi al mismo tiempo, UL Benchmarks
anunció la creación de una prueba de función DXR para
3DMark :
DXR se usa en la tarjeta gráfica Nvidia Titan X (Pascal) - sí, el resultado es 8 fpsSin embargo, un estudio de juegos con soporte DXR y la prueba 3DMark mostraron que el trazado de rayos incluso en 2019 sigue siendo una tarea muy difícil para la GPU, incluso a un precio de más de $ 1,000. ¿Significa esto que no tenemos alternativas reales a la rasterización?
Las características progresivas en las tecnologías de gráficos 3D para consumidores a menudo son muy costosas, y su soporte inicial para las nuevas características API puede ser bastante fragmentado o lento (como descubrimos
cuando probamos
Max Payne 3 en diferentes versiones de Direct3D en 2012). El último problema generalmente surge porque los desarrolladores de juegos intentan incorporar tantas características modernas en sus productos como sea posible, a veces sin suficiente experiencia.
Sin embargo, los sombreadores de vértices y píxeles, la teselación, la representación HDR y la oclusión ambiental del espacio de la pantalla también fueron técnicas costosas adecuadas solo para GPU potentes, y ahora son el estándar para juegos y se admiten muchas tarjetas gráficas. Lo mismo sucederá con el trazado de rayos; con el tiempo, simplemente se convertirá en otro parámetro de detalle, habilitado por defecto para la mayoría de los jugadores.
En conclusión
Entonces, hemos llegado al final de la segunda parte del análisis, en la que hemos profundizado en el mundo de los gráficos 3D. Aprendimos cómo la parte superior de los mundos y modelos se transfieren desde tres dimensiones y se convierten en una imagen 2D plana. Vimos que debemos tener en cuenta el alcance y nos dimos cuenta del impacto que tiene. Examinamos el proceso de convertir estos verines en píxeles, y terminamos con un breve vistazo a las alternativas al proceso tradicional de rasterización.
Como en el artículo anterior, era poco probable que pudiéramos revelar todos los temas, y nos perdimos algunos detalles; al final, ¡este no es un libro de texto! Pero esperamos que haya aprendido algo nuevo y ahora respete el trabajo de los programadores e ingenieros que utilizaron la informática y la ciencia para implementar todo esto en sus juegos 3D favoritos.