Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Problema Con Quadtree/octree

Iniciado por Miki, 10 de Enero de 2004, 12:53:32 PM

« anterior - próximo »

Miki

 Haber como lo digo...
Tengo un escenario abierto (una ciudad) de unos 150.000 polys. Le aplico un sistema de particionado, en tal caso me decanto por el Quadtree. El factor de ramificación es de 3000 faces por nodo más o menos. Bien, antes del render me hago una colección de los nodos que veo, y finalmente pinto. Pero si os fijais, esto no es muy optimo, ya que la ciudad en cuestión alberga unos 100 materiales (100 texturas por tanto). Lo que realmente me interesa es dibujar a "cachos" según un orden de material, y porsupuesto aprovechando el quadtree. Osea, si estoy viendo 15 nodos en un momento dado, cojo los polys del material 1 de esos 15 nodos, y los pinto del tirón, luego los del material 2, y también.....y así hasta que no me keden faces visualizadas. ¿Alguién sabe como se pude hacer esto de una forma OPTIMA?

Salud!

Kriller

 Pues por ejemplo puedes tener la lista de cada nodo del quadtree ordenada por textura, o incluso mejor que cada nodo tenga una lista distinta para cada textura (o sea, cada lista contiene los polígonos que utilizan una textura determinada). Así, como tú dices, suponiendo que tienes n texturas, cuando vayas a renderizar recorres n veces todos los nodos visibles; en cada pasada preguntas a cada nodo por los polígonos con la textura i=1..n y los renderizas.

Miki

 Sí Kriller, eso fue lo primero que pensé: tener un array de indexbuffer en cada nodo, en el k cada set del array es un indexbuffer referente a las faces de un material determinado. Pero si te fijas estoy = de jodido, ya que es muy posible que se vean más de 20 nodos a la vez, y eso significa mucho swap de material (osea, textura) =mente. Sería muy óptimo si la ramificación del quadtree fuese pekeña (una sola subdivisión por ejemplo), pero para el caso necesito algo más potente. Claro, lo que tmp puedo hacer es crear indexbuffers en tiempo de ejecución "recolectando" todas las faces de un material determinado de cada uno de los nodos, sería algo bastante costoso....
Bueno, espero más sugerencias. Gracias

CoLSoN2

 creo haría es tener cada nodo ordenado por materiales. Osea una lista de vertexbuffers, cada uno usando solo 1 material. Cuando compruebas cuales se van a renderizar, los añades a una queue y cuando tengas ahí los vertexbuffers de todos los nodos a renderizar, los ordenas por materiales y renderizas.
Manuel F. Lara
Descargar juegos indie  - blog sobre juegos indie y casual
El Desarrollo Personal.com  - blog sobre productividad, motivación y espíritu emprendedor

Loover

 Bueno, y que el añadir/quitar de esa queue sea con nodos ya reservados de antemano para evitar los new/delete a cada frame. ¿No?
IndieLib Libreria 2.5d utilizando aceleración por hardware para la programación de juegos 2d.
Indie Rover The monkeys are reading!

_Grey

 Si las soluciones que te plantean no te sirven, creo que solo te queda optimizar los materiales, usando , por ejemplo, una gran textura para almacenar varias. Pero si tienes 20 materiales, nada te salvara de cambiar 20 veces por lo menos de material.

Kriller

 Miki, no sé si te entiendo, es que igual me he explicado yo mal. El caso es que tal como te digo que lo hagas NO haces cuarenta mil swaps de textura, sólo haces tantos swaps como texturas renderices en un frame (o sea, el mínimo que puedes hacer).

Lo explico con un poco de pseudocódigo. Suponiendo que tienes n texturas:

1) Determinar los nodos del quadtree visibles
2) Para TexturaActual=1 hasta n hacer
3)   Cambiar a la textura TexturaActual
4)   Para NodoActual=1 hasta NumNodosVisibles hacer
5)     Determinar polígonos de NodoActual que utilizan la textura TexturaActual
6)     Renderizar esos polígonos
7)   Fin para
8) Fin para

El paso 5) sería muy rápido porque en cada nodo ya tienes separados en diferentes listas los polígonos según utilicen una textura u otra. Y por supuesto, antes de hacer nada en cada iteración del bucle exterior (o sea, antes de cambiar de textura) habría que comprobar si TexturaActual es utilizada en alguno de los nodos visibles.

Espero haberme explicado y que te resuelva el problema...

ProD

 Bueno... yo tengo implementado un Octree y la verdad es que va bastante bien... lo que yo hago es crearme un VB y un IB en cada hoja del octree, es decir, la que tiene la geometria, lo que hago es una lista de Batches por cada nodo, luego recorro el octree y los meto en una lista de render, al final recorro esta lista y voy pintando cada lista de batches. No se si será el mejor método.. pero va bastante bien

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






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.