lunes, 24 de marzo de 2014

Modelando con vistas a la tecnología de las subdivisiones cargadas en la GPU.

En esta entrada se voy a exponer el método que está guiando y guiará todo mi modelado 3D.

Expondremos brevemente cuál ha sido el método de modelado usado hasta este momento en el desarrollo de modelos 3d para videojuegos, y cómo afronto yo dicho modelado con vistas a un hipotético futuro en el que se pueden incluir subdivisiones en la GPU.


Introducción

El renderizado para películas e ilustraciones tradicionalmente nunca ha tenido un tope de poligonación. Cuando se desea desarrollar 3D que no va a ser mostrado en tiempo real, se renderiza en una fase y se visualiza el resultado del render en otra. Como se renderiza en un momento y el resultado (video o foto) se visualiza en otro momento distinto, el  renderizado puede tardar todo lo que haga falta. Esto permite a los artistas que trabajan en 3D en tiempo no real, manejar márgenes de polígonos muy grandes.




Para modelar de esta forma los artistas de 3D en tiempo no real llevan usando desde hace años un modificador llamado "subdivisiones" (cada programa de modelado 3D tiene uno, con un nombre derivativo).
Este modificador lo que hace es coger una primitiva hecha con vértices, y suavizar los bordes multiplicando cada cara por 4.




Ahora nos vamos a centrar en el renderizado para videojuegos. Los videojuegos son aplicaciones en tiempo real. La tarjeta grafica está renderizando todo el 3D que sale por la pantalla, al mismo tiempo que lo muestra, no en un momento posterior.

Esto es muy difícil de hacer. Requiere muchísima potencia, y ni las mejores tarjetas gráficas consiguen renderizar en tiempo real más que unas decenas de miles de polígonos.
Esto ha hecho que los artistas 3D de videojuegos tradicionalmente, tuvieran que manejarse con un margen de polígonos mucho mas pequeño en comparación. Ese margen aumenta todos los años con la aparición de tarjetas graficas cada vez más potentes, pero en comparación con el cine, los presupuestos de polígonos son irrisorios.




Por supuesto, en este ámbito, usar el modificador de las "subdivisiones" estaba totalmente prohibido, pues el resultado de aplicárselo a una malla de polígonos es una superficie con una cantidad de polígonos enorme.


Con este problema en mente, los modeladores de videojuegos cada vez que desean hacer un modelo en 3D, deben limitarse a usar técnicas en las que se añaden vértices sobre la topología, manteniéndose dentro de un presupuesto establecido. Las técnicas empleadas simplemente pasan por cortar polígonos para intentar suavizar la superficie tanto como sea posible, y decidir en que áreas los políogonos son necesarios o no.



Areas señaladas con poco y mucho detalle respectivamente, entre otras zonas.



Si tuviéramos que continuar con estos mismos métodos, seguiríamos como hasta ahora. El nivel de detalle seguiría aumentando poco a poco, y solo nos tendríamos que preocupar de manejarnos dentro de los límites que nos marca la nueva tarjeta gráfica o consola del momento.

Sin embargo, esto debería cambiar pronto.

El 10 del 8 de 2012 la empresa Pixar en una ponencia, demostró el uso de un personaje que estaba siendo movido en tiempo real, y que contaba con una malla de 4.2 millones de polígonos.




La empresa Pixar utilizó un algoritmo que  consiste en aplicar subdivisiones sobre los polígonos, si bien esas subdivisiones se mantienen en todo momento ocultas para la CPU, de forma que solo las ve la GPU.

Se ha demostrado en momentos anteriores, que la GPU es capaz de renderizar mallas de polígonos mucho más grandes y detalladas, al ser empleada en detalles de los escenarios conocidos como los static meshes. Básicamente, esto consiste en que si un detalle del escenario hecho con geometría va a mantenerse quieto, puede programarse que sea un tipo de geometría que solamente renderice la tarjeta gráfica. Esto consigue una doble eficiencia: por un lado, geometría mucho más detallada, por otro, menos carga para la CPU.



El algoritmo de Pixar es similar, pero en vez de aplicarse a geometría estática, se aplica a las subdivisiones. Esto significa que, de aplicarse a los juegos esta nueva técnica, ahora los desarrolladores de 3D de videojuegos ya si que podrán emplear "subdivisiones" en sus modelos, consiguiendo de esta forma un resultado en el 3D muy parecido al del cine.

En la misma ponencia, Pixar declaró que el algoritmo pasaba a ser de código abierto y licencia gratuita, de forma que  cualquier empresa de programas de 3D, de modelado o renderizado, podría usar esta técnica sin tener que pagar nada. Actualmente el algoritmo ya está presente de forma experimental en Autedesk Maya, Modo de the Foundry, y se cree que Blender lo implementará en un futuro. En el tema de los motores de videojuegos, los creadores del Motor Unity en este post, han dejado patente su interés por la técnica. En el caso del motor del Unreal, tengamos presente que se ha liberado el código fuente el pasado dia 19, por lo que cualquiera con conocimientos de programación y posibilidades de llevar a cabo el trabajo, podría implementarlo en un momento dado.


Aplicación

Teniendo en cuenta todo lo anterior, me gustaría dejar indicado que todos los modelos en 3D que yo voy a desarrollar, estarán pensados para ser usados en videojuegos, y seguirán las especificaciones técnicamente correctas para ser implementados en videojuegos. (No usar nurbs, no usar polígonos que no sean quads, etc...). Sin embargo, todos mis modelos estarán desarrollados para ser vistos con subdivisiones, en espera de que las citadas subdivisiones de Pixar, (o subdivisiones de GPU) sean aplicadas a algún motor de videojuegos.

Sin embargo, mi criterio tiene en cuenta una serie de restricciones.
No basta por tanto, en hacer un modelo moviendo vértices de la forma tradicional, y después aplicar subdivisiones para que se vea todavía mejor.
El plan es conseguir que sin subdivisiones tenga la mínima cantidad de polígonos posible, y con subdivisiones se vea de la mejor forma posible. Esto da como resultado modelos realmente feos, pero eficientes si no tienen las subdivisiones puestas.

Así:

Han de contarse polígonos sin subdivisiones y con subdivisiones (de GPU).

Es preferible una esfera que sea un cubo con subdivisiones, a una esfera con polígonos de verdad.
De querer esferizarse aun más, se añadirían algunos cortes al cubo original.




En el segundo ejemplo, el tubo de la izquierda esta hecho con la herramienta "tubo", que añade vértices y aristas para dividir la primitiva. Tiene 144 polígonos, que aumentan o decrecen según la redondez que se le quiera dar. Esos polígonos son carga para la CPU.

El tubo de la derecha es un mero rectángulo, como se puede ver por el contorno naranja, que lo muestra sin las subdivisiones aplicadas. Ocupa no más de 44 polígonos para la CPU. El número de polígonos con las subdivisiones controla la finura del borde, pero si esas subdivisiones las carga la GPU, no importaría. Conseguimos un modelo con mucha menos carga y que se ve mejor, de esta forma.





Supongamos pues, que mediante las técnicas antiguas, modelamos un objeto dado (pongamos una piostola, pues en los shooters, a las armas se les conceden presupuestos altos, al ser lo que más cerca está de la pantalla). Con las técnicas antiguas, en la generación actual, la pistola podría presupuestar 12 mil polígonos.

Podríamos contemplar 3 acabados posibles:

-La pistola quedaría modelada con 12 mil polígonos teniendo en cuenta las técnicas de cortado de polígonos clásicas. Esto se consideraría 'malo'.

-La pistola quedaría modelada con 12 mil polígonos teniendo en cuenta las técnicas de cortado de polígonos clásicas, y una vez conseguidos esos 12 mil polígonos, se mejora su aspecto visual dándole subdivisiones. Esto se consideraría 'malo'.

-La pistola se hace con un menor numero de polígonos, digamos 8 o 9 mil, por lo que nos ahorramos polígonos para la CPU. Sin subdivisiones se ve muy mal, pero está hecho de forma que al activar las subdivisiones, se ve mejor. Esto se considera bueno.

La técnica deja mucho margen a la optimización. Yo estoy haciendo mis primeros modelos prácticos con Blender ahora, pero gente que tenga más experiencia podría acabar creando 3D muy optimizado para esta técnica.


Ventajas.

-Presupuestos millonarios para polígonos en tiempo real.
-Innecesidad de técnicas de level of detail. La GPU borra o añade polígonos automáticamente según la cámara esté lejos o cerca.
-Poder usar mapas de desplazamientos en 3D de tiempo real.
-Al quitarle estrés a la CPU, ahora la CPU tiene más poder para centrarse en otras cosas: más personajes en pantalla, más inteligencia artificial, juegos más grandes.
-En 3D para cine: Capacidad de animar un personaje con capas de desplazamientos aplicados, en lugar de aplicarlos en momento de render posterior. Se anima más en contexto.
-En 3D para cine: Mejora exponencial del tiempo de render.

Conclusión: esto supondrá, de aplicarse, otro mundo a nivel de optimizaciones.
Referencia: http://www.youtube.com/watch?v=xFZazwvYc5o

No hay comentarios:

Publicar un comentario