Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Vertex Buffers E Index Buffers

Iniciado por deadLock++, 28 de Febrero de 2005, 02:13:39 PM

« anterior - próximo »

deadLock++

 En una época cuando sólo hacía uso de vertex buffers (y no Index Buffers), los objetos grandes (con muchos vértices) se procesaban de a partes en ellos. Para esto aplicaba un algoritmo que MS recomendaba, lockeando el VB de a partes y todo marchaba bien; podía procesar objetos de n vértices en vertex buffers de capacidad arbitraria y de una manera muy eficiente.

Ahora, utilizando Index buffers estoy ante un dilema, para procesar los índices de un objeto debo sí o sí enviar TODOS sus vértices y meterlos dentro de un vertex buffer lo suficientemente grande ya que podría ser posible que el primer triángulo que describan los índices hagan referencia al primer y último vértice del objeto.  (grrr)

Esto es un gran problema para mi ya que estoy creando una aplicación que construye mallas a partir de heightmaps, donde la cantidad de vértices de la malla es especificable, podría tener tantos vértices como al usuario le parezca adecuado.

Redimensionar el vertex buffer cada vez que el usuario lo especifique no me parece una buena idea, pero tal vez no me quede otra solución.

¿Como debería proceder?


Haddd

 Las tarjetas no leen primero el VB, lo procesan y luego pintan. Lo que hacen es que al pintar, cogen el vértice. Así que el tamaño del VB da igual, siempre que resida en memoria de vídeo.

De todas formas, yo dividiría el terreno en quads y mandaría esos quads por separado.


zupervaca

 lo unico que logro entender del post es que quieres generar terrenos mediante un mapa de alturas y que en tiempo de ejecución se podra cambiar el nivel de detalle del terreno resultante, para hacer esto siempre que generes el mapa de alturas tendras que redimensionar el buffer de los vertices (sea el de directx o no) como tu dices ya que si quieres usar index buffer este cambiara, ahora una vez generado ya puedes usar optizaciones para su renderizado como dice haddd

otra solucion es realizar el terreno a una maxima calidad que mas te guste y luego realizar un lod de ella y asi no tendras que redimensionar la malla "tu" y le dejas el peso a las directx con sus funciones de mallas (no se si existiran aun)

saludos

deadLock++

 El tema es el terreno estará entero en pantalla y quiero mostrarlo en el nivel de detalle que especificó el usuario.

Quiero minimizar el uso de memoria a costa de tardar más tiempo en el dibujado del mesh. Por lo que si el terreno posee 50.000 vértices preferiría poder tener un vertex buffer de 5000 y procesarlo por partes a tener que crear un VB de 50.000 vértices.

Si no hago uso de Index buffers todo está bien, proceso el terreno de a partes. Sólo tenía la curiosidad de como poder utilizar Index buffers sin tener que crear un vertex buffer de un tamaño tan grande.

AgeR

 Una solución podría ser tener una lista de vertex buffers, como ya tendrás, y aplicar a cada índice un desplazamiento. Creo que no me explico bien...
Ejemplo
vb0 : v0 v1 v2 v3 v4
vb1 : v5 v6 v7 v8 v9

guardamos por ejemplo los vertices consecutivos en ib...
ib : 0+0 0+1 0+2 0+3 0+4 5+0 5+1 5+2 5+3 5+4

hmmm sigo sin entenderme a mí mismo...
Básicamente que para obtener el vb en el que se encuentra un determinado índice, basta con obtener el divisor y resto más pequeños. El VB sería el divisor, y el resto la posición de ese vértice en el VB.

Espero no haberlo liado más  :huh: Tampoco sé si es eso lo que pretendes realmente.

deadLock++

 Eso estaría bien si yo supiese que un subconjunto N de índices sólo hiciera referencia a un subconjunto M conocido de vértices. Pero la realidad es que no lo sé.

Es cierto que podría procesar el array de índices para obtener el vértices mínimo y máximo referenciado (para luego armar subconjuntos de vértices y colocarlos de a turnos en un VB) pero esto me parece que sería un lío, además de no ser una solución general porque un mesh determinado podría tener índices que tomaran vértices no sólo no adyacentes sino muy distantes entre sí, obligándome a crear VB casi tan grande como el completo.

zupervaca

 
CitarSi no hago uso de Index buffers todo está bien, proceso el terreno de a partes. Sólo tenía la curiosidad de como poder utilizar Index buffers sin tener que crear un vertex buffer de un tamaño tan grande.

Me parece que lo que quieres saber es como usar el index buffer, te explico:

el index buffer es un array de enteros que sirve de indice al vertex buffer, para aprovechar las ventajas del index buffer y no repetir vertices tienes que mirar si hay vertices en la misma posicion espacial (x,y,z), si hay dos en el mismo sitio significa que ese vertice se puede eliminar y que puedes aprovechar el primero que creaste indicandolo su indice en el index buffer

ten en cuenta que muchas veces aunque esten en la misma posicion puede que tengan diferentes coordenadas de textura por ejemplo con lo que ese vertice no podra reaprovecharse

no estoy seguro si es esto lo que quieres tener claro por que no se que me pasa pero ultimamente no entiendo bien el lenguaje humano  :huh:






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.