Acerca de los gráficos 3D en palabras simples

Parte 1. Introducción


Hola mi nombre es baldurk He estado trabajando como programador de gráficos durante varios años, por lo que aunque de ninguna manera soy un experto, parece que ya entiendo mucho sobre todo lo relacionado con el trabajo con gráficos.

La idea de esta serie de publicaciones ha estado flotando en algún lugar en la periferia de mi mente, y surgió nuevamente después de leer un artículo interesante con un análisis del último Deus Ex .

Me parece que los gráficos, y especialmente la complejidad que logra en los juegos modernos, es un tema interesante. Muy pocas personas sienten curiosidad por profundizar en todos sus detalles, pero creo que hay temas que interesan a todos. Creo que la mayoría de las personas que jugaban a juegos tenían curiosidad acerca de cómo se obtenían estos o esos efectos, o con qué tecnología lograron crear gráficos tan sorprendentes en algún juego nuevo.


Hay muchos componentes necesarios para crear incluso un juego 3D simple, sin mencionar un proyecto como Watch Dogs.

Solo tengo una idea general de lo que debe considerarse en este artículo, pero dependerá de qué temas causen interés. Sin embargo, la idea principal es crear una descripción general de lo que está sucediendo dentro del juego moderno sin asustar a ninguno de los lectores. Asumiré que no tienes conocimiento de matemáticas y programación. Si conoce la diferencia entre la CPU y la tarjeta gráfica, y distingue la RAM del disco duro, esto será suficiente, y explicaré el resto.

Este artículo se desarrollará de acuerdo con su video tutorial Chip & Ironicus Let's Play of Watch Dogs , para estructurar ligeramente la presentación. El juego es bien conocido por sus gráficos (y las opiniones al respecto pueden ser completamente opuestas), y hay muchos aspectos que se pueden considerar con ejemplos separados. Quizás hablaré sobre otros juegos.

Comenzaré explicando los conceptos básicos que son más o menos los mismos para cada juego, pero también analizaré algunas de las técnicas y efectos visuales de Watch Dogs.

Usaré una herramienta llamada RenderDoc , que escribí en mi tiempo libre. Se utiliza para depurar problemas con gráficos: la herramienta le permite descomponer un marco gráfico en partes, y gracias a esto veremos cómo se junta.


Esta animación muestra parte de un marco que se está creando gradualmente en el proceso de renderizarlo con una tarjeta gráfica.

La mayoría de la gente sabe que los gráficos por computadora (y los gráficos de cualquier otro video) consisten en una serie de cuadros fijos, cada uno de los cuales se muestra durante una cierta fracción de segundo. En el cine, tradicionalmente usado 24 cuadros por segundo (cuadros por segundo, FPS), en televisión la frecuencia es aproximadamente la misma, aproximadamente 24-30 cuadros. En los juegos, los FPS pueden ser cambiables porque se hace mucho trabajo en cada cuadro. Una caída de frecuencia por debajo de 30 no es deseable, aunque ocurre con bastante frecuencia. Por lo general, el límite superior para juegos de consola es de 60 FPS. Los desarrolladores buscan implementar una frecuencia de 30 o 60, que depende de los objetivos del juego. En una PC, con una pantalla con una alta velocidad de cuadros, puede alcanzar 90, 120 o incluso más. La razón de estos números específicos es la sincronización vertical (vsync), que discutiremos a continuación.

Mentalmente, podemos ver esta tarea desde el lado opuesto: en lugar de ver qué tan alta es la frecuencia de FPS, observamos el poco tiempo asignado a cada cuadro. Si queremos que el juego funcione con una frecuencia de 30 FPS, entonces solo tenemos 33 milisegundos para completar todo el trabajo necesario para el marco. A 60 FPS, el tiempo es la mitad, unos 17 milisegundos. Incluso para una computadora, este período de tiempo no es muy grande, dada la cantidad de trabajo que hay que hacer. Para darle una idea de las cantidades, entonces, según estimaciones aproximadas, la bala se mueve aproximadamente 1 metro por milisegundo.

Hablaremos principalmente de PC porque esta plataforma está abierta, y no puedo hablar de consolas sin temor a violar los acuerdos de confidencialidad (NDA). De todos modos, básicamente hablaré sobre lo que no es muy diferente en las consolas, pero si algo aún difiere, lo enfatizaré. Para plataformas móviles, la mayoría de las diferencias entre el hardware / consolas de PC y el hardware móvil no son relevantes para el tema de mi artículo.


Honestamente, puse esta imagen aquí para que entiendan que el artículo no solo tendrá texto.

Es esta tarea la que nos interesa: no nos preocuparemos de cómo se realizan todos sus cálculos de IA o de cómo se realiza la simulación física para mover objetos. Los límites de la disciplina llamada "programación de gráficos" son bastante borrosos, pero diré que la programación de gráficos comienza cuando tenemos toda la información necesaria para construir un marco: sabemos lo que sucede, todas las texturas y modelos están en la memoria (no en el disco ), las animaciones ya están animadas, se cuenta la física y solo tenemos que dibujar un cuadro terminado para mostrarlo en la pantalla.

Agrego que consideraré un juego en 3D con una representación bastante tradicional, como Watch Dogs: muchos de los principios básicos se aplican a los juegos en 2D, pero es un poco más difícil demostrar conceptos sobre ellos. También explicaré (especialmente a los programadores gráficos) que me esfuerzo principalmente por comprender, por lo tanto, tal vez, usaré explicaciones bastante dudosas si me permiten alcanzar mi objetivo.

Parte 2. En qué consiste el marco


La mayoría de las veces miraremos solo un cuadro y hablaremos sobre los bloques de construcción que el juego usa para crear un cuadro terminado. También en esta parte habrá varias nuevas fotos hermosas.

Hay varias formas de ensamblar un marco a partir de bloques de construcción. La imagen final que ve el jugador no se representa instantáneamente. Se dibujó de inmediato hace muchos años, pero los motores gráficos modernos casi siempre usan algún tipo de preprocesamiento. Antes de mostrar el cuadro terminado en la pantalla, el motor de gráficos dibuja muchas imágenes intermedias de varios tipos que ayudan a calcular la imagen final.

Estas imágenes dependen en gran medida del tipo de motor y de las técnicas que el programador de gráficos necesita aplicar. Por ejemplo, si quiere que la luz del sol cree las sombras correctas, entonces se necesitará un tipo de imagen para las sombras. También puede necesitar los reflejos correctos en el automóvil conducido por el jugador, y para esto, también, necesita otra imagen con reflejos.







Varios ejemplos de imágenes intermedias utilizadas en la construcción del cuadro Watch Dogs.

En este artículo, no consideraré cada una de las imágenes utilizadas en el marco de Watch Dogs, sino solo las básicas, para que pueda aprender algo. Esta es un área en la que la investigación gráfica se realiza constantemente y surgen nuevas técnicas. Las innovaciones también surgen en niveles más pequeños, pero cuando el marketing le informa sobre alguna nueva función gráfica, generalmente se refiere a tales mejoras.



Cada una de estas imágenes intermedias también está construida a partir de fragmentos aún más pequeños. Cada objeto en la escena o un grupo de objetos relacionados se crea por separado como un modelo con textura . Al desarrollar un juego, los artistas construyen estos modelos en un editor 3D y crean todos los recursos necesarios para ellos. Luego, estos modelos se colocan en el mundo usando el editor de niveles y gradualmente se construye una ciudad virtual a partir de ellos.

Probablemente, casi todo el mundo lo sabe, y si ha visto el desarrollo de gráficos 3D en tiempo real en los últimos 20 años, sabe cuánto más complejos se han convertido hoy en día. En las primeras etapas de la formación de gráficos, el mapeo de texturas era un proceso costoso y, si era posible, se eliminaba pintando objetos con el mismo color. Las texturas se dejaron solo para elementos como ojos o caras que realmente necesitaban detalles.

El modelo 3D consiste completamente en triángulos interconectados que forman la forma del objeto. Cada triángulo tiene tres puntos llamados vértices, y dado que los triángulos están conectados entre sí, los vértices pueden ser compartidos por varios triángulos. Volveremos a esto más tarde porque los vértices y los triángulos son lo suficientemente importantes. También vale la pena recordar que algunos objetos, por ejemplo, personajes o árboles, deben estar animados antes de renderizar. El modelo se crea en forma estática estándar y se aplican animaciones en cada cuadro. Volveremos a esto también.


Este es un modelo 3D de la cabeza de Aiden Pierce después de la animación. Los triángulos son visibles porque están dibujados planos y no suavizados, como suele ser el caso.

Para agregar más detalles al modelo 3D, las texturas se superponen. Las texturas son archivos de imagen plana regulares, generalmente de tamaño cuadrado o simple, como rectángulos con una proporción de 2: 1. Las texturas se superponen en el modelo 3D mediante un proceso más complejo, que analizaré con más detalle a continuación, pero conceptualmente es similar al proceso de envolver un regalo. En lugar de un simple patrón repetitivo de envoltorios de papel, la imagen coincide exactamente con el tamaño del envoltorio. Si vio modelos de papel para ensamblar con pegamento, entonces el principio es el mismo.

Esta analogía es más apropiada de lo que piensas, porque estas texturas generalmente se crean al "desenrollar" un modelo 3D en un espacio en blanco plano, como se hace con un modelo de papel, después de lo cual se dibuja una textura sobre él. Esta implementación a menudo se realiza automáticamente, pero en el caso de objetos particularmente complejos se puede hacer manualmente.


Esta es la textura correspondiente al modelo de cabeza de Aiden Pierce que se muestra arriba. Hay partes para dientes y lengua. Tenga en cuenta que el área sobre su frente no tiene textura porque está permanentemente cubierta por la gorra de béisbol legendaria Aiden Pearce ™.

Nota


Al desplegarse, algunas partes del objeto que requieren más detalles aumentan, mientras que otras disminuyen.

Muy a menudo hablan de varias "máscaras" de modelos, especialmente en el caso de personajes personalizables. Hoy, lo que se llama una "piel" generalmente se refiere a pequeños cambios en el modelo, un nuevo cinturón o un sombrero diferente, pero inicialmente este término surgió porque se utilizó el mismo modelo, pero la textura cambió (o "piel", literalmente se traduce como "Skin") para crear un personaje que se vea diferente. Incluso hoy, con la ayuda de tales texturas, puede crear una gran variabilidad de NPC u objetos, lo que ahorra tiempo y dinero; no necesita crear muchos modelos 3D únicos. La ropa diferente que Aiden puede usar a menudo son texturas diferentes del mismo modelo.


Aquí hay un breve fragmento de la rotación de la cabeza del modelo 3D. Superpuesta solo textura, y nada más.

En el marco que estamos considerando, hay aproximadamente 1700 objetos renderizados en la parte principal de renderizado. Algunos de ellos serán los mismos modelos: objetos como flores en macetas y botes de basura nunca se crean por separado, este es un modelo o varios modelos colocados en diferentes lugares. Sin embargo, la cantidad aproximada de objetos dibujados para completar el marco es cercana a 4700 ; esto nos da una idea de cuánto trabajo adicional se necesita hacer además de renderizar todos estos modelos.

Veamos otro ejemplo de un objeto: una gorra de béisbol que usa Aiden.



Este es un modelo de gorra de béisbol con textura y textura. Se puede ver que la textura está construida de partes separadas que están conectadas al modelo.

Nota


La visera y la parte principal de la gorra de béisbol en la textura no se tocan, porque el escaneo puede ser bastante complicado y, si es necesario, puede realizarse en varias partes diferentes. A veces, texturizar un modelo de forma compleja sin problemas visibles y costuras requiere una buena cantidad de habilidad.

Los mismos principios que vimos con la cabeza de Aiden se aplican a la gorra. De hecho, si ignoramos la textura específica y los números necesarios para realizar el desenvolvimiento, entonces el principio es siempre el mismo.

Para mostrar qué puede salir mal durante el desarrollo y demostrar cómo puede divertirse al programar gráficos, podemos realizar un pequeño experimento. Dado que la mayoría de las texturas tienen un tamaño cuadrado estándar, y el método de envolver y desplegar texturas en el modelo también es el mismo, ¿por qué no jugar un poco con ellas? ¿Qué sucede si aplicamos la textura de la cabeza de Aiden a un modelo de gorra de béisbol?


Ya no es muy similar a la gorra de béisbol legendaria de Aiden Pierce.

Donde había un logotipo en la textura de la gorra de béisbol, la oreja y los dientes se encuentran en la textura de la cabeza. Donde había una visera, solo había cabello en la textura de la cabeza. La superposición es exactamente la misma, pero se usa una textura diferente. Por supuesto, este ejemplo será un error en el juego, pero piense en lo que se puede hacer si anima la textura o la hace parpadear; en los juegos, estas cosas se usan para varios efectos que ahora puede notar. En particular, el juego Saint's Row 4 utiliza similares para efectos especiales de "simulación".

También será útil pensar en las consecuencias de esto: los juegos combinan muy cuidadosamente pares de modelos y texturas, es decir, los modelos más únicos deben coincidir con sus propias texturas únicas.

Por supuesto, esta regla no es absoluta: en algunos casos, para ahorrar espacio, la textura es un patrón repetitivo estándar que se puede usar para muchos objetos. Conjuntos de objetos vinculados, por ejemplo, quioscos de prensa, pueden usar la misma textura para diferentes periódicos, y cada periódico ocupa una pequeña fracción de la textura.

Sin embargo, esto significa que para construir la imagen final, todos los bloques de construcción deben estar presentes, es decir, como resultado, se pueden obtener muchos modelos y texturas requeridos. En la siguiente parte, hablaremos sobre por qué algunos aspectos, como la reflexión, son muy difíciles de implementar correctamente. También hablaré sobre cómo los juegos usan pequeños trucos para ahorrar tiempo y recursos.

Parte 3. Lo que no necesitas dibujar


A menudo, la programación de gráficos es la tarea de equilibrar una docena de restricciones diferentes para obtener el compromiso perfecto. En la última parte, vimos que cada vez que se dibuja una escena, se ensambla a partir de muchos bloques de construcción pequeños: personas, automóviles, señales de tráfico, edificios. Todo lo que está en la pantalla está formado por componentes individuales que deben dibujarse. Hay varias operaciones de equilibrio sutiles que discutiremos aquí.

El procesador central y la tarjeta gráfica trabajan juntos para representar el marco. El resto del juego se ejecuta en la CPU, por lo que decide qué objetos se deben dibujar en el marco actual, dónde está mirando la cámara y qué animaciones se juegan. Una tarjeta gráfica es un "caballo de batalla" que realiza todo el trabajo complejo involucrado en la representación de píxeles, razón por la cual es un dispositivo especializado separado.

Resulta que tanto la CPU como la tarjeta gráfica tienen limitaciones en la velocidad o cantidad de cálculos, pero estos son diferentes tipos de restricciones.

En general, la CPU está más interesada en su propia parte del trabajo: ¿cuántos objetos necesitamos dibujar en total? ¿Qué tan diferentes son estos objetos? ¿ Son 100 luces idénticas o 100 arbustos / plantas / árboles? ¿Están animados estos objetos, se mueven dinámicamente y cuáles de ellos son estáticos o inmóviles?

Lo primero que hacemos para reducir la carga tanto como sea posible es dibujar solo lo que es visible en la pantalla. Esto parece obvio, pero la implementación requiere un trabajo cuidadoso. No olvide que construimos cada cuadro desde cero, por lo que en cada cuadro debemos mirar cada objeto y determinar si es visible o no. Esto significa que en cada juego hay un vacío negro en todas partes que sigue al jugador, y cuando no mira objetos y personas, dejan de existir.


En esta animación, giramos la cámara, mostrando el vacío detrás del jugador. Los espectadores atentos notarán que no está completamente vacío ...

Es difícil desarrollar reglas prácticas en este caso, pero en general, puede dibujar alrededor de 1000 objetos en la escena sin preocuparse por la falta de espacio. Sin embargo, si necesita renderizar 5,000 objetos, entonces debería pensar en usar trucos. No olvides que en la mayoría de los juegos donde el jugador puede controlar la cámara, no podemos saber en qué ángulo se verá, por lo que debes ahorrar espacio para maniobrar.

Resulta que hay muchos trucos que te permiten usar casi por completo un recurso válido, y son especialmente importantes en juegos como Watch Dogs. Cuanto más te acerques a los bordes y más calidad visual puedas obtener del mismo número de objetos, mejor se verá el juego.

Incluso si miras lo que está frente a ti en la escena, esto no significa que sea necesario dibujar toda la ciudad. Si hay un gran edificio a la izquierda o a la derecha, todo lo que está detrás se vuelve invisible, por lo que no puede dibujarlo. Del mismo modo, algunos objetos en la distancia se vuelven muy pequeños, por lo que no debemos preocuparnos por dibujar pequeñas plantas y arbustos en la distancia.


Esta animación muestra que si vas por la calle más allá de lo que vemos, entonces no hay nada en las calles laterales, pero a gran distancia los detalles se vuelven más pequeños.

De hecho, todavía hay muchos objetos en esta escena que resultarán invisibles como resultado. Queda mucho por explorar en esta área y se deben aplicar varias técnicas sofisticadas. Siempre tiene que hacer compromisos, pero si puede pasar un poco de tiempo o encontrar una forma muy inteligente de evitar renderizar 100 objetos sin casi ningún esfuerzo adicional, entonces podemos hacer que la escena sea aún más compleja o más densa.

Además, hay otro pequeño problema. En algunos casos, tenemos que dibujar un edificio que apenas es visible en la pantalla y que va mucho más allá. Malgasta recursos. Siempre podemos dividir estos objetos en varias partes, luego cada parte se puede dibujar u omitir, es decir, habrá menos desperdicio. Sin embargo, ahora hemos aumentado el número total de objetos dibujados cuando están en la pantalla, ¡y hemos creado el problema opuesto!

Este ejemplo es uno de los cientos, pero es fácil explicar en él qué decisiones deben tomarse y qué experimentos realizar para encontrar el punto de equilibrio perfecto para cada juego.

Dado que la acción de nuestra toma de Watch Dogs tiene lugar en la ciudad, podemos verla desde arriba para comprender aproximadamente qué se está dibujando exactamente. En esta imagen estática, es especialmente notable que Watch Dogs hace el trabajo trimestralmente.


Ahora nos alejamos para mostrar el área visible frente a la cámara (perdón por la instalación para ahorrar tiempo).


Un área aproximada de visibilidad de la cámara se superpone a la imagen. El ancho de este triángulo depende del campo de visión; a veces, en los juegos, esta es una opción personalizada, a veces un valor constante.


Aquí hay una pantalla de alambre de la escena, el campo de visión de la cámara está limitado al blanco.



Algunos de ustedes ya podrían pensar en un pequeño truco que les permitiría sortear la restricción de representar un cierto número de objetos: ¿por qué no hacer que los objetos sean una combinación muy compleja de todo en un área pequeña, hasta hojas individuales? Entonces dibujar 1000 objetos será más que suficiente.

Pero aquí nos enfrentamos a un conjunto completamente diferente de restricciones: las tarjetas gráficas tienen un rendimiento limitado, y cuanto más complejo sea el objeto, más tiempo tomará dibujar. Es decir, incluso un objeto, si es bastante complejo, puede reducir la velocidad de fotogramas del juego a 20 FPS. Incluyendo esta es la razón por la que dije que el límite en el número de objetos es bastante confuso.

La cantidad de tiempo dedicado a un objeto depende de la complejidad y el detalle de los modelos y texturas, así como de la sofisticación de la iluminación y las sombras. Esta es también la razón por la cual los juegos que intentan implementar gráficos más complejos o sofisticados tienden a usar escenas menos complejas y detalladas: el equilibrio cambia las escalas en una dirección u otra, para que pueda proporcionarse más espacio para maniobrar, sacrificando lo que no es tan importante para el juego .


Este es un tipo de mapa de calor, que muestra en qué partes de la escena hay modelos especialmente complejos. Observe cuántos problemas pueden causar los árboles y la vegetación.

Hay otro conjunto de técnicas llamado "nivel de detalle" (LOD), que está específicamente diseñado para resolver tales problemas. Similar al hecho de que podemos optimizar el número de objetos, cortando todo lo innecesario, podemos aumentar el suministro de "complejidad", eliminando lo innecesario.

Uno de los trucos es realmente conocido: esto está cambiando la resolución de las texturas. Este tema generalmente se cruza con muchos otros, por lo que trataré de explicarlo de manera accesible.

Las texturas en los juegos generalmente son rectángulos con tamaños iguales a la potencia de dos: 512, 1024, 2048, 4096. Hay muchas razones para esto, pero una de las ventajas de esto es que puedes tomar una textura de tamaño 1024x1024 y crear fácilmente una versión más pequeña con un tamaño de 512x512 .

Por las razones que analizaré a continuación, siempre es necesario que la textura tenga todo tipo de versiones más pequeñas. Es decir, una textura con un tamaño de 1024x1024 tendrá versiones más pequeñas de 512x512, 256x256, 128x128, 64x64, 32x32, 16x16, 8x8, 4x4, 2x2 y 1x1. Sin embargo, una de las ventajas de esto es que si los objetos distantes tienen un tamaño pequeño en la pantalla, aplicarles una textura de 1024x1024 significa desperdiciar recursos. Podemos ahorrar usando versiones más pequeñas de la misma textura.

Del mismo modo, incluso los objetos cercanos pueden considerarse poco significativos y utilizar texturas más pequeñas para ellos.

Nota


Por lo general, cuando un jugador se acerca a un objeto, se usa la textura más grande, pero como la mayoría de la gente ha visto en un juego en particular, esto no siempre sucede y las texturas se ven demasiado borrosas antes de cargar. Esto suele suceder porque las texturas no se pueden cargar desde un DVD o disco duro directamente en la memoria de la tarjeta gráfica para renderizar. La mayoría de las veces esto sucede cuando un jugador cambia abruptamente su posición, por ejemplo, durante la reaparición, cargando un nuevo nivel o un movimiento muy rápido. En todos los demás casos, las texturas generalmente se cargan gradualmente, en el proceso de mover al jugador alrededor del mundo.

También puede aplicar este proceso de simplificación a los modelos utilizados en el juego, aunque es mucho más difícil de hacer. Al crear versiones simplificadas de objetos complejos, puede asegurarse de que a gran distancia no se coman parte de un suministro limitado de complejidad.

Gracias a los objetos simplificados y los modelos recortados, puedes ahorrar mucho dinero y tienes que usar este enfoque en cualquier juego como Watch Dogs. Pero al mismo tiempo, puede ser una gran pérdida de recursos. Es necesario tomar una decisión muy reflexiva y equilibrada sobre cuántas versiones simplificadas de modelos se requieren. Si hay muy pocos de ellos, entonces no podrá ahorrar demasiado, o habrá saltos notables en la calidad al cambiarlos. Si hay demasiados, desperdiciará la memoria y pasará las horas hombre necesarias para crear objetos.


Así es como los objetos y personajes complejos se ven a distancia cuando no se pueden distinguir de sus versiones altamente detalladas.



Espero que ahora tenga una idea de los problemas que los programadores gráficos, artistas y diseñadores de niveles están tratando de combinar los gráficos de la más alta calidad con alta velocidad. En consolas, esta ecuación es un poco más fácil de resolver que en PC, porque el equipo es constante.

En la parte anterior, dije que hablaré sobre por qué es muy difícil implementar correctamente reflexiones y otras cosas similares. La razón es bastante simple: las reservas de productividad y recursos de las que constantemente hablo no cambian dependiendo de si tienes una reflexión o no. Si desea crear una reflexión que pueda mostrar nuevamente toda la escena, debe rehacer todo el trabajo del que hablé. Además, los reflejos dependen en gran medida del ángulo en que los miremos, por lo que para obtener reflejos precisos para cada objeto reflectante, ¡deben ser los suyos!

Esto puede salirse de control muy rápidamente, y generalmente los juegos en los que hay reflexiones se permiten ciertas libertades o suposiciones. Los juegos rara vez crean reflejos en entornos complejos, lo máximo que puede ser es un espejo en el baño, donde no hay tantos objetos, la complejidad de la escena es pequeña y, por lo tanto, puede pagar gastos adicionales. Quizás los verdaderos reflejos en el juego solo estarán en superficies irregulares u onduladas del agua, de modo que incluso una escena muy áspera y poco detallada es suficiente para crear reflejos convincentes.

Por lo general, es difícil evitar por completo las superficies reflectantes, por lo que los juegos usan imágenes pre-renderizadas del entorno inmediato, lo que da un resultado "razonablemente bueno". Pero no resisten un escrutinio cercano, y si observa de cerca los reflejos, verá que esto es una imitación. Existen técnicas modernas que ayudan a crear reflexiones en ciertas condiciones, y tal vez más adelante hablaré de ellas, pero aún se necesitan imágenes pre-renderizadas ("pre-renderizadas").


Esta imagen renderizada se llama "mapa de cubo". No es del todo exacto con respecto al lugar donde se encuentra Aiden, pero está lo suficientemente cerca de él.

Watch Dogs hace reflexiones en tiempo real. No investigé este problema en detalle, pero creo que siempre se representan cuando el personaje está en la calle, y se utilizan principalmente para obtener sus reflejos exactos en el automóvil en el que está sentado, para mejorar la imagen y darle una ligera sensación de realidad. . Dado que el jugador siempre está enfocado en su automóvil y su entorno inmediato, el hecho de una reflexión incorrecta sobre otros automóviles es apenas perceptible.

Hay muchas aproximaciones disponibles para acelerar la representación de estas reflexiones. Por ejemplo, se representan muchos menos objetos en el reflejo que en la escena real, unos 350 en total, y muchos de ellos están muy simplificados en comparación con las versiones completas. Sospecho que los objetos complejos, como las personas, se descartan por completo, independientemente de la distancia, pero no he probado esta teoría. Además, no hay sombras en estos objetos, y la iluminación es muy simple: solo la que proviene del sol y el cielo. Los reflejos se representan desde el suelo como en una lente "ojo de pez", es decir, los reflejos de la tierra en sí son imposibles, y lo que está al lado tiene muy pocos detalles.

Pero incluso con todas estas simplificaciones, las reflexiones solo hacen frente a lo que se pretendía. Si conduce por debajo de los rieles, puede obtener el reflejo correcto con una vista sobre el automóvil, que en la práctica no funcionaría.

Esta decisión fue intencional y no fácil de tomar. El stock es un valor constante, por lo que si deja espacio para estas reflexiones, debe sacrificar algo más.


Aquí hay una vista muy "sospechosa" de la escena alrededor de Aiden con una vista inferior, hecha para reflexiones. Puede navegar a lo largo de las dos luces y rieles del tren.



Hay otra parte del trabajo que quiero mencionar aquí: las sombras. Más tarde planeo hablar sobre cómo funcionan las sombras, porque este es un tema interesante, pero ahora lo más importante es recordar que las sombras son muy similares a los reflejos. Cada fuente de luz que proyecta una sombra debería representar una imagen de escena desde su punto de vista. Esta vez no hay muchas formas de simplificar el trabajo: para el cálculo correcto de las sombras, cada fuente de luz debe tener esta imagen.

Nota


, . , «» , . , , .

La fuente más obvia y más importante de iluminación que da sombra es el sol (o la luna, si sucede de noche). Como el sol es enorme, generalmente se representan de 3 a 5 imágenes, y no una, como en el caso de los faros o una linterna.

Desafortunadamente, este es uno de los casos en que Watch Dogs no puede servir como un buen ejemplo. El cálculo de las sombras en el juego es bastante complicado y, me parece, está especialmente optimizado para el caso de proyectar sombras en la ciudad. Por lo tanto, será mejor que cambie a Far Cry 4 y considere el cálculo de las sombras en el ejemplo de un cuadro de este juego.


Aquí hay una escena de Far Cry 4 que estoy usando como ejemplo.


Aquí hay una imagen con información sobre las sombras de esta escena: cada una de ellas requiere una representación completamente nueva de la escena.

Por lo tanto, cuando necesitemos agregar sombras a la fuente de luz, tendremos que renderizar la escena una vez más. Aquí, también puede utilizar algunas de las aproximaciones utilizadas en el caso de los reflejos, solo que son mucho más pequeños. Puede omitir objetos pequeños o distantes, pero tenga en cuenta que estos objetos no parecerán proyectar sombras. Puede hacer que la imagen sea muy pequeña, pero las sombras serán granuladas y con pocos detalles. Por lo general, no es posible usar una versión muy simplificada del objeto, porque entonces parecerá que el objeto proyecta una sombra sobre sí mismo, o aparecen espacios entre el objeto y su sombra.

Otra consecuencia que es muy fácil de perder es la necesidad de crear imágenes sombreadas para cada fuente de luz. En muchos casos, es posible simplificar las fuentes de iluminación combinándolas; en Watch Dogs esto sucede con los faros de los automóviles.

Cuando ambas luces están encendidas, solo se dibuja una fuente de luz, pero tiene una forma especial, por lo que parece dos rayos. Si los faros tienen sombras, entonces esto no es tan fácil de hacer, y será mucho más notable: cuando el jugador pasa por delante del automóvil, entonces la luz saldrá de algún lugar entre los dos faros. Quizás entonces tendrá que separar los faros, pero al mismo tiempo, no solo habrá costos adicionales para calcular las sombras, sino que también tendrá que dibujar una nueva iluminación.



Lo principal que quería enfatizar con todo esto era el compromiso. Ciertamente podemos deshacernos de todas estas aproximaciones, pero tendremos que gastar nuestras reservas de recursos en esto, es decir, sacrificar algo más. Cada desarrollador de juegos debe decidir en qué es importante concentrarse en el juego y qué es lo que más impresionará o molestará más al jugador.

Parte 4. Moviendo los picos


En esta parte, hablaré más sobre los detalles técnicos de la animación de objetos en la escena.

Los programadores gráficos a menudo hablan de la "tubería gráfica". Los gráficos 3D son un poco como una línea de ensamblaje con un movimiento claramente definido de una etapa a otra, pero no funciona con un solo objeto a la vez.

Todas las tarjetas gráficas modernas tienen aproximadamente la misma cinta transportadora, tienen equipos y software especiales que se flashean directamente "en silicio" para maximizar la velocidad de la cinta transportadora. Por supuesto, hay muchas variaciones entre diferentes fabricantes y familias de tarjetas gráficas, pero generalmente no tenemos que preocuparnos de cómo funcionan a este nivel.

Nota


Si está interesado en cómo funciona todo en un nivel de hardware abstracto, le recomiendo una serie de artículos de Fabian Giesen sobre la cartera de gráficos . Esta serie de artículos es mucho más detallada y requiere mucha más comprensión que mi publicación.

Me saltearé muchos detalles para explicar principios interesantes e importantes. En esta parte, veremos la primera parte de la tubería, que se llama Vertex Shader .

Los sombreadores se generalizaron hace unos 16 años, después del lanzamiento de DirectX 9, en el que aparecían los sombreadores de vértices y píxeles. Para explicar qué son los sombreadores y compararlos con lo que solían ser, hablaré sobre el trabajo que hacen.


La cabeza esquelética de Aiden está con nosotros otra vez.

Permíteme recordarte que en la parte 2, examinamos los modelos a partir de los cuales se crea el mundo del juego. Estos patrones están formados por puntos individuales llamados vértices que están conectados en triángulos. Dije que te contaré más sobre ellos más tarde, y ahora cumplo mi promesa.

Dado que todo en el mundo del juego consiste en vértices, todo lo que debe hacerse con estos modelos debe realizarse con vértices. Cuando se trata de la tarjeta gráfica, todo lo que ve es una larga lista de vértices. Para ella, no existen cosas como ejecutar animaciones, o balancear hojas de árboles, o cualquier otro concepto abstracto.

Veamos un ejemplo simple de lo que tenemos que hacer: mover y colocar objetos en el mundo. Para empezar, tomemos un caso simple, no un personaje.

Al crear objetos en editores 3D como Maya y 3D Studio Max, los artistas siempre construyen desde su propio mundo. Estos objetos no se crean inmediatamente en el entorno de Chicago, sino que sus alrededores se ven como una "habitación blanca vacía" de Matrix. Cada objeto está ubicado en el centro del vacío absoluto.


Aquí hay un semáforo en el juego en algún lugar debajo de los rieles, y se encuentra en su propio mundo.

Al guardar en el disco, el modelo no tiene idea de dónde estará en el mundo y cuándo se descargará y transferirá a la tarjeta gráfica. Esto significa que cuando llega el momento de dibujar objetos, necesitamos moverlo de nuestro propio mundo a la escena que dibujamos. Esto sucede con cada objeto dibujado, e incluso los objetos inmóviles como edificios y puentes también se mueven de su propio mundo a la escena en cada cuadro.


Aquí vemos varios semáforos ya colocados en una escena final parcialmente construida.

Como mencioné anteriormente, las únicas cosas con las que podemos trabajar son los picos. No podemos simplemente decirle a la tarjeta gráfica: "¿Puedes poner este semáforo debajo del puente? ¿Y luego poner otro un poco más lejos? ¡Genial!

Por lo tanto, en lugar de decirle a la tarjeta gráfica qué debe hacer con el objeto en sí, debemos decir qué hacer con todos sus vértices. Resulta que en este caso todo se vuelve muy simple. Si cambiamos todos los vértices exactamente de la misma manera y permanecen inmóviles entre sí, entonces esto es similar a mover un objeto como un todo. Todo lo que necesitamos hacer es descubrir qué "cambio" se llama transformación.

Nota


Los cálculos matemáticos de todo esto no son particularmente complicados, pero están más allá del alcance del artículo. Si ya ha estudiado álgebra lineal, probablemente sepa todo lo que necesita, básicamente todo se reduce a la multiplicación matricial de vectores.

Antes de la aparición de sombreadores de vértices, las posibles opciones para transformar vértices en la tarjeta gráfica eran muy limitadas. Los objetos disponibles estaban en movimiento y girando, así como algunas otras operaciones, pero nada particularmente redundante o complicado.

Los sombreadores de vértices son pequeños programas de computadora que se ejecutan en una tarjeta gráfica. Toman un vértice, realizan las acciones necesarias con él y emiten un vértice de salida. No solo pueden moverlo, sino que también los hacen saltar hacia arriba y hacia abajo, alejarse del pico más cercano, balancearse según el viento, animarse y mucho más.

Tomé uno de los sombreadores de vértices que se usan en Watch Dogs y experimenté un poco para mostrar lo que hace. Este es un trabajo bastante arduo, pero logré encontrar el sombreador de vértices utilizado para los personajes y cambiarlo. Hay otro sombreador de vértices utilizado para la piel, por ejemplo, para caras y manos, pero comprenderá rápidamente el principio.


Hice un cambio muy simple que agrega un doblez al modelo de personaje, pero todo lo demás se usa como de costumbre.

La animación de arriba muestra que los personajes están de alguna manera extrañamente distorsionados. Esto nos lleva de vuelta al principio "si mueve cada vértice, entonces esto es similar a mover todo el objeto". El cambio realizado en el sombreador de vértices solo funciona para un vértice a la vez, pero dado que todos funcionan con la misma distorsión, el efecto se aplica a todo el objeto.

También puedes hacer cambios en la parte de la transformación, que es responsable de "simplemente moverse a su lugar", para que en lugar de colocar al personaje en el lugar correcto, ella lo levante por encima del suelo. Esto no se simula con la ayuda de la física, por lo tanto, no tiene nada que ver con la gravedad o las colisiones con otros objetos; si queremos, podemos hacer que todos se disparen en el aire.


En esta animación, hicimos que el sombreador de vértices subiera y bajara gradualmente el objeto.

Obviamente, todo esto no es muy constructivo, pero nos da una idea general de cómo funcionan los sombreadores de vértices: si ahora quisiéramos animar las hojas de los árboles para que se balanceen, haríamos lo mismo. Solo que en lugar de subir y bajar, girarían en la dirección del viento. Entonces podemos cambiar la fuerza del viento para que los árboles se balanceen más o menos.


Aquí vemos lo que sucede cuando todo aumenta unas siete veces.

Simplifico un poco, pero básicamente la tarea de la mayoría de los sombreadores de vértices es "mover objetos a su lugar". La excepción son todos los objetos animados: personas, animales, así como objetos como cuerdas que se balancean, ropa que agita, etc.



Animar a las personas está relacionado con la idea de usar un esqueleto y una "piel". Un esqueleto es una descripción simple de un personaje en movimiento. En esta etapa, no nos preocupan las hebillas, los sombreros o los jeans que no están animados, solo los movimientos importantes que son más apropiados para el esqueleto humano son importantes para nosotros.


Aquí se muestra un esqueleto simple de una figura humana. No fue tomado de Watch Dogs, porque el esqueleto es difícil de visualizar fuera del editor 3D.

Imagen autorizada por Attribution-ShareAlike CC BY-SA © MakeHuman team 2001-2014


Esta es una pose instantánea o pose en T que demuestra cómo se ve un personaje sin usar animaciones.

Las animaciones (correr, caminar, saltar) se aplican solo a este esqueleto. Esto hace que todo el proceso sea muy simple, porque necesitamos considerar solo alrededor de cien huesos en lugar de miles y miles de vértices.

Después de crear el esqueleto, cada vértice se une a uno o más huesos en esta postura estática, y esta conexión se llama "desollado". En el momento de Half-Life 1, cuando esta tecnología comenzó a usarse, cada vértice se asoció con un solo hueso. Hoy en día, incluso pueden unir cuatro huesos, mientras que a cada hueso se le da peso, de lo que depende el grado de influencia del hueso sobre el ápice. Gracias a esto, puede obtener una animación más suave, permitiendo que los huesos se crucen en diferentes áreas sin crear ángulos agudos al mover brazos o piernas.


Este es el esqueleto que se muestra arriba con el hueso del muslo girado. Los colores muestran el peso del hueso de la cadera en relación con la parte superior del modelo.

Imagen autorizada por Attribution-ShareAlike CC BY-SA © MakeHuman team 2001-2014

Esta tecnología tiene sus limitaciones, especialmente en lugares donde la ropa y la piel se comprimen o estiran en bisagras, por ejemplo, en los codos y los hombros. Esta es una forma imperfecta, pero muy efectiva de animar. La limitación más grave es que es muy difícil crear animaciones faciales convincentes de esta manera. Puede crear muchos huesos "falsos" en su cara, por ejemplo para las cejas y alrededor de la boca, pero esto será solo una aproximación aproximada de los músculos y la piel.

Otra característica importante de esta técnica es que la comparación de vértices y huesos es muy específica y está relacionada con la forma en que se realiza esta comparación. Es posible usar animaciones para varios modelos diferentes, pero cada modelo individual en el que desea usar el esqueleto debe estar asociado con los huesos. La razón es que las animaciones mueven los vértices de su posición original en relación con sus esqueletos. Si los vértices no están en las posiciones esperadas, surgirán problemas.


Si el modelo no coincide con el esqueleto utilizado por ella, las animaciones serán completamente incorrectas.


Si hacemos que el personaje sea dos veces más ancho, obtenemos un efecto similar a las "donas que comen en exceso" de Drake , pero es notable que las animaciones más cercanas a los pinceles se vuelven incorrectas, porque aquí es donde están más lejos de sus posiciones originales.

La primera animación puede parecerle extraña: tales animaciones de falla ocurren en los juegos con mucha frecuencia. Por lo general, son causadas por animaciones incorrectas aplicadas al esqueleto, o el modelo usa el esqueleto incorrecto. Como en el caso de las texturas y los modelos, el esqueleto, el diseño y el modelo deben compararse con mucho cuidado, de lo contrario, los resultados serán tristes rápidamente.

Espero que tengas alguna idea sobre el propósito de los sombreadores de vértices y entiendas cómo se usan las animaciones para convertir un modelo estático en un personaje vivo.

Source: https://habr.com/ru/post/es430930/


All Articles