Optimización de gráficos 3D para videojuegos
En el mundo de los videojuegos, la optimización es el arte de aprovechar al máximo los recursos de un sistema, o visto de otra forma, de mejorar el rendimiento de tu juego. Es un vocablo que no debe faltar en el vocabulario de cualquier desarrollador. Se optimiza el código, los gráficos, los sonidos… en general, todo aquello admisible de ser optimizado.
En los juegos 3D, uno de los pilares de la optimización son los gráficos, por lo que la responsabilidad de esta labor recae en los artistas.
Las costuras
La base en la optimización de un modelo 3D reside en el número de polígonos (triangulares) y el número y tamaño de las texturas que utiliza. Por lógica, cuantos menos polígonos y menos texturas mejor. Pero también hay que tener en cuenta lo que yo llamo costuras de un modelo 3D. También se las conocen por splits, vertex splits, seams o descosidos. He oido a nuestro director de tecnología llamarlas cuñas (o falques en valenciano, según él, traducción de “wedge”, termino que vió usar en un artículo sobre gráficos de Microsoft Research).
Una costura se crea cuando dos polígonos:
A. No comparten el mismo grupo de suavizado (smothing groups o shading)
B. No comparten el mismo material.
C. No comparten las coordenadas de mapeado (UVW).
D. Mezcla de los anteriores.
Una vez en el juego, una costura provoca que se dupliquen vértices para calcular las transformaciones. Por lo general, el número total de vértices reales suele ser mayor de lo que pensamos, y suele llegar a duplicarse o triplicarse. Generalmente es más importante evitar las costuras que ahorrar en memoria para texturas.
Buenas prácticas
Evitar las discontinuidades de las coordenadas UVW. En la siguiente imagen se muestra en rojo las costuras producidas por el mapeado de un personaje. Muchas costuras son evitables fusionando zonas y creando un figura continua, aunque suele ser más complicado recrear la textura. La mayoría de paquetes de edición 3D como 3DS Max o Maya disponen de herramientas avanzadas de edición UVW para este fin.
Reducir el número de materiales en una malla sólida. Lo ideal es utilizar un sólo material.
Unificar los grupos de suavizado. Es más complicado si se requieren esquinas definidas. Si se usan pocos polígonos, es más necesario jugar con los grupos de suavizado para evitar aberraciones en el sombreado. En ocasiones, es posible prescindir del sombreado si al objeto no le afecta la luz.
El flat shading es el peor de los casos y el modelo a evitar a no ser que se soporte específicamente. Por el contrario, el normal mapping evita el uso de los grupos de suavizado (y las costuras producidas por estos) y mejora considerablemente el acabado final.
Por último, conviene hacer coincidir costuras. Por ejemplo la costura producida por un grupo de suavizado y por las coordenadas UVW.
Eliminar nodos de geometría innecesarios
Aunque menos importante en la optimización de gráficos, puede llegar a representar un problema si no lo tenemos en cuenta.
Cada elemento de nuestro juego dispone de un nodo (o pivote), gracias al cual podemos acceder a él para moverlo, rotarlo, etc. Es deseable reducir el número de nodos en escena ya que esto afecta al rendimiento, aunque depende en última instancia de cómo funcione nuestro engine. Los programas de edición 3D suelen representan un nodo mediante un eje local.
Para reducir el número de nodos simplemente hay que unificar varias mallas en un único objeto. Por ejemplo, la rueda de un coche debe disponer de su propio nodo ya que debe girar de forma independiente (tendría una relación padre-hija con el resto del vehículo). Por el contrario, un retrovisor no requiere de un nodo propio y simplemente lo “fusionaríamos” con la carrocería (a no ser que deseemos que se desprenda en una colisión).
Bibliografía: GameDeveloper, July 2003
Interesante post, bueno, para los amantes de como optimizar los motores 3D recomiendo hechar un vistazo a las tecnicas de LOD, siglas que significan level of detail, consisten basicamente en técnicas que permiten reducir el número de poligonos de las mayas de nuestros juegos intentando que el resultado final aparentemente no cambie, recomiendo un libro que es una delicia y que explica en detalle todo lo referente al LOD, el titulo es “Level or Detail for 3D Graphics” y podreis encontrar mas informacion en la pagina http://lodbook.com/. Por cierto, y calentito del SIGGRAPH hay unos magnificos papeles de Natasha (creo que son de la desarrolladora de ATI) haciendo referencia a una técnica que puede ahorrarnos tambien un gran número de poligonos en nuestros objetos 3D, la técnica se llama oclussion parallax mapping y se puede encontrar una implementacion de la misma para GLSL en Gamedev. Estoy convencido de que esta nueva tecnica dejara boquiabierto a los que tiene profundos conocimientos en las técnicas de LOD.
Esta bueno todo lo que habla de costura me gusta mucho y espero que sigan asi porque esta muy bueno
Muy buen articulo, me gustaria ver uno sobre deteccion de colisiones con el espacio tan clarito como este.