¿Cómo hacen los juegos modernos el nivel de detalle de geometría para mallas de objetos como personajes, terreno y follaje? Hay dos partes en mi pregunta:
- ¿Cómo se ve la cartera de activos? ¿Los artistas hacen un modelo de alta poli que luego se diezma? Si es así, ¿qué algoritmos de decimación son los más populares? ¿Las mallas LOD a veces se hacen a mano?
- ¿Cómo hacen la transición los motores entre diferentes objetos LOD en tiempo de ejecución? ¿Hay transiciones suaves o progresivas?
La respuesta podría ser "diferentes estudios utilizan diferentes técnicas". Si es así, identifique algunas de las prácticas más comunes. También sería genial si pudiera señalarme documentos / diapositivas que cubran ejemplos específicos.
Respuestas:
Para la geometría LOD, la mayoría de los juegos simplemente cambian entre varias mallas LOD predefinidas. Por ejemplo, "Infamous: Second Son" usa 3 mallas LOD ( Adrian Bentley - "inFAMOUS: Second Son engine postmortem", GDC 2014 ) y "Killzone: Shadow Fall" usa 7 mallas LOD por personaje ( Michal Valient - "Killzone: Shadow fall demo postmortem ", Devstation2013 ). La mayoría de ellos se generan, pero los más importantes (como el personaje principal) se pueden hacer a mano. Las mallas a menudo se generan usando un popular middleware de Simplygon, pero a veces simplemente son generadas por artistas gráficos en su paquete 3D favorito.
Los juegos con una gran distancia de juego también utilizan impostores para el follaje, los árboles y los edificios altos ( Adrian Bentley - "inFAMOUS: Second Son engine postmortem", GDC 2014 ). También emplean LOD jerárquicos, que reemplazan un conjunto de objetos con uno. Por ejemplo, en "Just Cause 2", los árboles se representan primero individualmente como mallas LOD normales, luego individualmente como impostores y finalmente como una única malla de bosque fusionada ( Emil Persson, Joel de Vahl - "Poblando un mundo de juego masivo", Siggraph2013 ) y en Las partes distantes del mundo de "Sunset Overdrive" son reemplazadas por una sola malla generada automáticamente fuera de línea ( Elan Ruskin - "Streaming Sunset Overdrive's Open World", GDC2015 ).
Otro componente de un sistema LOD es la simplificación de materiales y sombreadores. Por ejemplo, "Killzone: Shadow Fall" desactiva el espacio tangente y el mapeo normal para los LOD distantes ( Michal Valient - "Killzone: Shadow fall demo postmortem", Devstation2013 ). Esto generalmente se implementa deshabilitando globalmente un conjunto de características de sombreador por LOD, pero para los motores con gráficos de sombreador, donde los artistas pueden crear sombreadores personalizados, esto debe hacerse manualmente.
Para las transiciones de LOD, algunos juegos simplemente cambian de malla y algunos usan el difuminado para transiciones de LOD suaves: en el interruptor de LOD se procesan dos mallas: la primera se desvanece gradualmente y la segunda se desvanece ( Simon schreibt Blog - "Assassins Creed 3 - LoD Blending" ). Las técnicas clásicas de malla progresiva de la CPU no se utilizan, ya que requieren una costosa actualización de malla y carga en la GPU. La teselación de hardware se usa en algunos títulos, pero solo para el refinamiento de un LOD más detallado, ya que es lento y, en general, no puede reemplazar los LOD de geometría predefinidos.
Los LOD de terreno se manejan por separado para explotar sus propiedades específicas. La LOD de geometría del terreno generalmente se implementa usando mapas de clip ( Marcin Gollent - "Creación y renderizado de paisajes en REDengine 3" ). Los LOD de material de terreno se manejan de manera similar a los LOD de malla o usan algún tipo de textura virtual Ka Chen: "Representación de textura virtual adaptativa en Far Cry 4" .
Finalmente, si está interesado en ver canales de LOD de juegos reales, simplemente navegue a través de la documentación de cualquiera de los motores de juegos modernos: Unreal Engine 4 - "Creación y uso de LOD" , CryEgnine - LOD estático y Unity - LOD .
fuente
LOD (Nivel de detalle) significa administrar objetos en diferentes escalas de visualización, que podrían dividirse en dos partes. Sin embargo, puede usar uno de ellos y eso sería suficiente para la mayoría de los casos.
Mostrar / ocultar capas (grupo de objetos del mismo tipo) dependiendo de la magnitud (escala de visualización).
Método basado en la Geomería Algebraica, llamado Generalización (que es un algoritmo para simplificar polígonos). mira la siguiente imagen
El método más famoso y eficiente para generalizar (simplificar) una malla poligonal se conoce como teorema del poliedro Descartes-Euler (ecuación 4.5, lo siento si me refiero a un libro, eso fue lo mejor que puedo hacer) y es utilizado por la mayoría de las bases de datos espaciales. por ejemplo, módulos PostGIS en PostgreSQL. Simplemente elimina los lados más pequeños de un polígono y forma uno muy redondeado. (Imagen superior)
Para implementar LOD en un juego, debe guardar y administrar la escala de su mapa (escena) durante las operaciones de acercamiento / alejamiento. La escala cambia de cero a infinito y debe dividir esto en un número particular de rangos, por ejemplo, algo como esto:
Luego, debe definir qué tipos de sus objetos (capas) deben ser visibles o invisibles en cada uno de los rangos anteriores. Por ejemplo, un tipo pequeño de objeto como una válvula de hidrante no debería ser visible cuando el usuario está en el cuarto rango porque será muy pequeño a esa escala y no puede ser discriminado, por lo que no importa si omite dibujarlo en el pantalla.
Entonces, cuando un usuario usa acercar y alejar para cambiar la ampliación, se mueve a través de los límites anteriores de uno a otro rango, y su juego usa estas escalas de visualización para administrar el nivel de detalles al mostrar u ocultar objetos en la escena. Esto hace una solución discreta de que los objetos se desvanecen repentinamente durante su operación de alejamiento, sin embargo, teniendo las escalas de visualización y los rangos de aumento definidos cuidadosamente, el usuario no sentirá nada.
El grupo anterior de 4 rangos es solo un ejemplo y necesita encontrar el mejor para su propio caso por prueba y error. No hay una regla para eso.
A veces, los juegos usan sus propios métodos LOD, Subway Surfer por instante, muestra un pequeño rectángulo sin textura para mostrar un edificio a lo lejos, y al acercarse repentinamente obtiene textura, el jugador lo siente. No hablaste sobre tu sistema de proyección, que es muy importante y tampoco sobre qué tipo de juego estás creando.
Sin embargo, suponga que está implementando un juego 3D completo con openGl y desea filtrar algunas mallas antes de transferirlas al hardware gráfico, estoy seguro de que esto lo ayudará a reducir las operaciones de vinculación / desvinculación con objetos de búfer y matrices de vértices (VBO, VAO) mientras lidiando con OpenGl.
En la mayoría de los casos, no es necesario implementar un algoritmo de generalización, y el filtrado de objetos simplemente funciona y lo lleva a la eficiencia (frecuencia de actualización) que necesita, sin embargo, depende totalmente, caso por caso. Aunque es un algoritmo fácil que simplemente elimina los lados pequeños de un polígono, debe definir un umbral que sea producto de la magnitud y un número constante, de modo que los lados más grandes se filtren en un punto de vista mucho más alejado.
La falsificación de la gestión de capa y solo la implementación del algoritmo de generalización de Eulers, proporciona un método muy ordenado y continuo en el que simplemente verifica cada lado y línea contra un umbral predefinido y los muestra solo en caso de que sean lo suficientemente grandes como para ser discriminados en la pantalla.
PD: la ampliación es un número flotante> 0 que es igual a 1 / escala y la escala suele ser <1 ya que una escala 1: 1 significa que tienes longitudes del mundo real en tu juego.
fuente
Iman ya preparó una respuesta completa pero deseo agregarle algo
LOD se puede hacer de dos maneras diferentes
Por ejemplo, mipmaping es bueno, rápido pero pesado y pertenece al segundo grupo en lo anterior
Aquí puede encontrar una buena explicación para el mipmaping y el código de implementación con OpenGl.
fuente