Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Pintando Un Octree

Iniciado por ProD, 02 de Octubre de 2003, 12:19:42 AM

« anterior - próximo »

ProD

 Hola buenas!, pues nada que ya consigo pintar un octree.... pero quisiera saber cual es la forma más adecuada de hacerlo. Yo tengo pensado lo siguiente:

Según voy llegando a los nodos hoja que son visibles, guardar la geometría en una lista. Una vez que ya tengo toda la geometría de los nodos visibles, ordenarla por material y mandarla a un Vertex Buffer dinámico (uso Directx) e ir pintando por material.

Bueno espero alguna sugerencia, algún link que explique algo sobre optimización de octrees, etc.

Muchas gracias.
as ideas son capitales que sólo ganan intereses entre las manos del talento

DraKKaR

 De la forma en que lo dices parece que calcules que geometría pertenece a cada nodo de un octree en tiempo real. Si estos polígonos forman parte de la estructura estática del mapa lo mejor es tenerlo precalculado. Si son objetos dinámicos, detecta intersecciones de caja alineada (nodo de un octree) contra el bounding box del objeto, para saber si está dentro.

samsaga2

 La forma mas normal de hacerlo es (o al menos lo que yo he visto):

Cuando te creas el octree ya ordenas las caras de cada nodo por material y luego a la hora de pintar vas pintando cada nodo mientras vayas calculando si es visible o no. Opino que eso es mas rapido que guardarlo todo en una lista y luego ordenarla.

ALBSIM

  No tienes porque ordenarla, yo en vez de utilzar una lista, utilizo una tabla de dispersión, por lo que, dado el material del polig. lo insertas inmediatamente dentro de la tabla, y al terminar, sólo debes ir recorriendo la tabla, para cada nodo de la tablza tendrás un lista de poligs. que comparten el mismo material, por lo que dibujas todos y los cambios de estado (textura, etc.) sólo los realizas al pasar al siguiente nodo de la tabla hash.

ProD

 Gracias por contestar, ya se que la geometría a pintar es estática... pero no quiero tener Tantos Vertex Buffers como nodos con geometría... por eso digo lo de usar un VB dinámico. La idea de la tabla de dispersión parece interesante... podrias explicarlo con más detalle? muchas gracias de nuevo.
as ideas son capitales que sólo ganan intereses entre las manos del talento

ALBSIM

  Si mira, tu tienes un array (o una lista) en el que cada entrada o índice es un puntero a otra lista de polígonos.
Bien, ahora cada vez que renderices la escena, coges los nodos visibles, y por cada primitiva de los nodos, calculas un índice asociado a dicha primitiva que dependa de su textura, material, shader... (eso lo dejo a tu elección) y con ese índice I introduces el polígono en la lista de polígonos a la que apunta el nodo I de la tabla de dispersión, así en esa lista tendrás todos los polígonos que comparten shader, o textura, o lo que sea. Opcionalmente, dentro de esta lista, sí que puedes ordenarla si los polígonos no tienen iguales todas las características que no influyeron en el cálculo del índice I.
Cuando realizas esta operación para todos los polígonos visibles, únicamente te queda ir recorriend los nodos de la tabla, en cada uno de ellos, que tienen asociado la list de elems. con misma textura por ejemp., si la lista no es vacía (hay poligs.)  cargas esa textura, renderizas toda la lista con la misma textura, y pasas al siguiente nodo de la tabla, así hasta el último nodo.
De esta forma puedes tener un vertex arrays para todos los vértices, las primitivas serán índices a éstos vértices, y las listas de los nodos serían símplemente índices a las primitivas, o directamente índices a los vértices. Así podemos renderizar los poligs. indexados en el array (lista) del nodo.  
Ya se que me explico un rato mal, lo siento.

MChiz

 Ese metodo no te obliga a tener varios vertex buffers. De hecho, yo pinto mi Octree utilizando un vertex buffer y un index buffer. Es un pelin ( solo un pelin ) mas complicado, pero se puede hacer.
De la forma que tu dices, ademas de gastar bastante CPU en algo que, entiendo yo, puede ser estatico y estar precalculado, utilizas un vertex buffer dinamico, que no va a ser igual de rapido que un vertex buffer estatico. No se, tienes algo que ganar por todos lados.

Suerte! Un saludote!! : )

AK47

 Saludos
Es posible meter toda la geometria estatica (por ejemplo el terreno en un juego) en un unico vertex buffer? Yo coincido con Prod, en que es mejor usar un vertex buffer dinamico que lo vas rellenando con los poligonos de los nodos que son visibles, porque asi podras tener escenarios virtualmente ilimitados. Estoy equivocado?  :blink:  

AgeR

 
HRESULT DrawPrimitive(          D3DPRIMITIVETYPE PrimitiveType,
   UINT StartVertex,
   UINT PrimitiveCount
);


Nada te impide tener un solo Vertex Buffer. Puedes construirlo agrupando los polígonos por nodo del octree. Después en cada nodo final simplemente haría falta que guardaras en qué vértice empieza la información correspondiente al nodo (dentro del Vertex Buffer), y el número de vértices que pertenecen al nodo.

Si los quieres ordenados por textura, solo deberías de reordenar los triángulos de cada nodo antes de crear el VB. De este modo también deberías incluir en el nodo del octree una tabla que te dijera de qué a qué triángulo tienen la misma textura.

Espero que alguien confirme o amplíe lo que acabo de decir, ya que soy bastante novatillo y puedo haber dicho alguna barbaridad.  :rolleyes:

Saludos!

AK47

 Hola de nuevo
Yo me refiero a ver si es rentable meter toda la geometria estatica de la fase en un unico vertex buffer, o si es mejor ir enviando los poligonos de los nodos visibles.

MChiz

 Para AgeR:

Estas en lo cierto. Almenos es asi como yo lo hago : )

Para AK47:

Porque deberia ser mas rentable un VB dinamico? Al reves. Es mejor tenerlo en un estatico. Y eso de que los mundos sean virtualmente infinitos... bien los tendras que guardar en algun sitio, no? Aunque no sea en VRAM... sera en RAM normal.

Un saludote!!

AK47

 Reholas
Yo no afirmo sino que pregunto ;)
Si guardas toda la geometria estatica en un VB estatico, no andaras con problemas de memoria en la tarjeta? Si guardas toda la geometria estatica en memoria de sistema y luego lo vas enviando los nodos visibles a la tarjeta mediante un VB dinamico, pues supongo yo que podras manjear mundos mas gordos, no? No he probado nada de esto, asi que por eso lo pregunto :)

MChiz

 Si, por supuest. Podras manejar mundos mas grandes ( tanto como tu memoria RAM te deje ), perdiendo mucho rendimiento. Para estos casos se hacen cargas dinamicas. Si vas a ver un nodo nuevo ( que no tienes en la tarjeta grafica ) lo cargas y lo subes a la tarjeta ( un vertex buffer estatico ). Total, esto solo va a ser un frame, asi que no importa crear el VB estatico. De la otra forma SIEMPRE tienes que estar con los datos de un lado para otro.

Saludoteees!!






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.