Polls

Afectará la crisis a los videojuegos?
 
Inicio arrow Noticias arrow Algoritmos arrow Inside Geometry Instancing
Inside Geometry Instancing PDF Print E-mail
Written by Javier Loureiro   
Wednesday, 14 May 2008

Ayer ruben penalva descubría que nvidia ha comenzado la publicacion online algunos capítulos del gpu gems 2. Así que me he puesto a leer lo que hay publicado, que me parece muy interesante para la página.

En especial, el capítulo 3, que trata sobre instanciar geometría .  La idea es tener varias formas de instanciar geometría en la memoria de la tarjeta para que sea eficiente y rápido pintar un objeto. ¿Que´problemas tiene esto? Pues fundamentalmente la animación, y los disintos atributos que varían entre objetos.

Por ejemplo, un personaje esta caminando. Si tenemos el mismo personaje muchas veces repetidos, será interesante el enviarlo una sola vez a la tarjeta, y pintarlos todo igual. Pero los personajes están en distintas fases de la animacion (unos estarán con el pie izquierdo, otros con el derecho). Asi que hay que calcular la animación para cada personaje. Pero además, tenemos los distintos pases de sombras, specular, etc, asi que hay que intentar no aplicar la animación continuamente (además el multithreading puede hacer que la animación cambie entre cada render, rompiendo la coherencia de sombras, etc).  Tambien hay que poder cambiar las texturas y los materiales (para rendear un pase de sombras, o el pase difuso).

Asi que nos propone una parte de la abstracción para este tipo de cosas. Una clase "geometry packet" que representa una malla simple de información de bounding, y por otro lado, los atributos que diferencia cada instancia, como la matriz de posición, color, etc. Una instancia es la unión de geometría y atributos.

Despues nos define un GeometryBatch, que basicamente es un trabajo de render. En ella metemos las instancias (union de geometrias y atributos) que vamos  a rendear, llamamos a commit para subirlas la primera vez (este es el trabajo que se hace antes del loop de render, despues del visitor), Despues llamamos a update para cambiar sus parametros entre cada frame, y a render para pintarlas. El artículo entra más en detalle de los bucles necesarios (dependiendo de vuestra implementación, será más o menos sencillo meter este tipo de bucles).

Esta separación cobra sentido en las distintas implementaciones de GeometryBatch.

La static simplemente es mandar la geometria a la tarjeta. Claro, mandamos un fotograma concreto de la animación, asi que en CPU aplicamos la animación y la reutilizamos en las llamadas a render. Podemos mandar todo el ciclo de animación al principio si tenemos memoria suficiente y pintar solo el frame que deseamos.

La dinamic es todo lo contrario. Es calcular el skinning de animación cada frame. Podemos hacerlo con todas las instancias, y despues rendearlas, o intentar hacerlo por grupos: aplicamos skinning a unas cuantas, rendeamos, descartamos, aplicamos skinning a otras, rendeamos, descartamos, y asi.

Vertex  Constants: es aplicar vertex shaders a los vértices, para cambiar sus atributos. Creamos un vertex buffer con las constantes, y un vertex shader busca las correctas para ese momento. La funcion render envía todas las instancias de golpe.

Geometry API de DirectX 9, aprovecha las posibilidades de la tarjeta para acelerar el proceso. Es similar al dinamic, pero aprovecha mejor las capacidades de la tarjeta para liberar el bus de memoria. Todas las instancias se pintan con una llamada de render. Esta es la forma más óptima de pintar instancias, a partir de la geforce 6 (supongo que en DX10 tendremos cosas para mejorarlo más con los geometry shaders).

 

 

Comentarios
Añadir nuevoBuscar
Escribir comentario
Nombre:
Email:
 
Website:
Título:
Código UBB:
[b] [i] [u] [url] [quote] [code] [img] 
 
Security Image
Por favor introduce el código anti-spam que puedes leer en la imagen.

Copyright (C) 2007 Alain Georgette / Copyright (C) 2006 Frantisek Hliva. All rights reserved.



menéameDigg!Del.icio.us!Google!Technorati!Yahoo!
Last Updated ( Wednesday, 14 May 2008 )
 
< Prev   Next >

Lista de Correo

visita la lista de correo de codepixel. Es una lista abierta, asi que podrás subscribirte y preguntar tus dudas de programación, compartir tus opiniones, aportar ideas, y formar parte de la comunidad codepixelera.