XNA Demos (III): Simulación de geometría con impostores

descargar_codigo

Aunque hoy en día las GPUs ganan rendimiento a pasos agigantados, la evolución de los gráficos por computador (no olvidemos que muchos de los efectos y técnicas que ahora se usan en tiempo real estaban limitados a un uso precalculado hasta no hace mucho) se adapta a estos cambios y los explota al máximo, y más aún desde el abandono de la FFP y el advenimiento de los shaders.

Una de las limitaciones que más rápidamente se alcanza es la complejidad poligonal de la escena. Teniendo en cuenta que la GPU tiene que transformar la posición de cada vértice a coordenadas de pantalla, interpolar los valores (posición, normal, coordenadas de textura) al resto del triángulo, y por último rasterizar los fragmentos visibles (aplicando los efectos de shader correspondientes), tener una escena de un millón de polígonos y querer moverla con un refresco decente (60+ Hz) sigue siendo un suicidio. Por ello, hay que recurrir a técnicas de simplificación, como puede ser el frustrum culling, para eliminar objetos fuera del campo de visión de la cámara, o, como se muestra en el ejemplo, simplificar el dibujado de los mismos.

Uno de los métodos más empleados es el Level-Of-Detail, o LOD. Ésta técnica consiste en disponer de varias copias de un mismo modelo, en las que se ha ido reduciendo el nivel de polígonos (mediante un programa de modelado) progresivamente. Dependiendo de la distancia del objeto a la cámara, se dibuja una versión con mayor o menor detalle, procurando que el tamaño final del objeto en pantalla compense los posibles errores del modelo (partes deformadas, texturas mal alineadas, etc.).

comparacion_lod

Izquierda: ~10000 polígonos. Derecha: ~4000 polígonos.

Pero cuando el LOD no es suficiente (cientos o miles de instancias de objetos al mismo tiempo) y el mesh instancing tampoco da buenos resultados, se recurre a un “truco”: los impostores. Un impostor es un sprite orientado siempre hacia la cámara (algunas veces con un eje de rotación restringido, para evitar resultados poco realistas debido a deformaciones), y que contiene una imagen del modelo visto desde un ángulo determinado.

tira
Los sprites usados para los impostores del ejemplo.

Dependiendo de la forma y uso de los impostores, podremos generar más o menos proyecciones del model, dependiendo del grado de realismo que queramos alcanzar. En el ejemplo se han generado 8 vistas de 128×128 píxeles, con una diferencia de 45º de rotación entre ellas; dependiendo de la orientación de la cámara, se dibujará una u otra para simular la existencia de un objeto tridimensional en la escena, como muestra el esquema siguiente:

diagrama
Sprite empleado dependiendo de la orientación de la cámara y el objeto.

Por último, queda aclarar que los impostores no siempre son la solución; si la diferencia de altura entre el objeto y la cámara es muy grande, se puede producir (debido a la restricción de ejes en el impostor) una distorsión que arruinaría todo el realismo de la escena:

image
Distorsión de los impostores al verlos desde un ángulo muy inclinado.

3 comentarios en “XNA Demos (III): Simulación de geometría con impostores”

Deja un comentario