Bueno, al final me decanté por hacer una adaptación del algoritmo de 3D game engine architecture a XNA. Dicho algoritmo usa una división del terreno en patches de tamaño 2^n+1. Por tanto un terreno podrá tener dimensiones vertical y horizontal diferentes que sean múltiplo del tamaño de patch elegido. cad patch se gestiona como un quadtree donde cada nodo del quadtree puede tener hasta 9 vértices activos (Lo mínimo es tener 4 vértices y dos triángulos activos). Cada rama del quadtree se va refinando en un modo dependiente de la vista hasta un nivel de detalle diferente. Luego se ven las dependencias entre vértices y se determina si alguna rama requiere de un refinamiento extra para evitar roturas en el terreno.
En el algoritmo propuesto en el libro cada patch tenía su propia lista de vértices e índices que se gestionaba de forma independiente y que cambiaba en cada simplificación del terreno.
El algoritmo me pareció ineficiente por dos motivos:
1.- Utiliza una lista dinámica de vértices e índices que cambia con cada simplificación. Esto supone que o bien tengo vertex e indexbuffer dinámicos o bien utilizo llamadas a drawUserIndexedPrimitive, lo que significa tener que mandar en cada simplificación las nuevas listas por cada patch a GPU, lo que bajaba el framerate una burrada.
2.- Para dibujar el terreno tengo que hacer tantas llamadas a DrawUserIndexedPrimitive como patches visibles tenga el terreno en cada momento.
Para solucionar estos problemas hice ua modificación al algoritmo: guardo todos los vértices del terreno (de máxima resolución) en un VB estático (con lo que sus posiciones, normales y color quedan fijos). Luego lo único que hago dinámico es un indexbuffer global dodne los diferentes patches van añadiendo los índices que necesitan para dibujarse. Este indexbuffer es lo que se modifica en cada simplificación del terreno y es lo único que tengo que mandar a la gráfica cada vez que cambia la simplificación.
De esta forma además sólo necesito hacer una única llamada a DrawIndexedPrimitive para dibujar todo el terreno. Además no necesito reenviar la información de vértices cada vez que el terreno cambia.
Hasta ahora me va fenomenal con un fps constante de 62. Sin embargo ahora me encuentro un problema cuando quiero texturizar el terreno. Mi idea era usar algun tipo de texture splatting, sin embargo ahora mi problema reside en qué valor poner a las coordenadas de textura de mis vértices.
Para seguir funcionando con mi esquema necesito que las coordenadas de textura para los vértices sean fijas (he intentado utilizar coordenadas variables que meto en un vertexstream diferente dinámico y la actualización se hace totalmente ineficiente). Sin embargo no se me ocurre ninguna forma de salir de este inconveniente, porque los vértices que coponen el terreno en cada simplificación son diferentes y cubren zonas distintas.
¿Teneis alguna idea?
Gracias
En el algoritmo propuesto en el libro cada patch tenía su propia lista de vértices e índices que se gestionaba de forma independiente y que cambiaba en cada simplificación del terreno.
El algoritmo me pareció ineficiente por dos motivos:
1.- Utiliza una lista dinámica de vértices e índices que cambia con cada simplificación. Esto supone que o bien tengo vertex e indexbuffer dinámicos o bien utilizo llamadas a drawUserIndexedPrimitive, lo que significa tener que mandar en cada simplificación las nuevas listas por cada patch a GPU, lo que bajaba el framerate una burrada.
2.- Para dibujar el terreno tengo que hacer tantas llamadas a DrawUserIndexedPrimitive como patches visibles tenga el terreno en cada momento.
Para solucionar estos problemas hice ua modificación al algoritmo: guardo todos los vértices del terreno (de máxima resolución) en un VB estático (con lo que sus posiciones, normales y color quedan fijos). Luego lo único que hago dinámico es un indexbuffer global dodne los diferentes patches van añadiendo los índices que necesitan para dibujarse. Este indexbuffer es lo que se modifica en cada simplificación del terreno y es lo único que tengo que mandar a la gráfica cada vez que cambia la simplificación.
De esta forma además sólo necesito hacer una única llamada a DrawIndexedPrimitive para dibujar todo el terreno. Además no necesito reenviar la información de vértices cada vez que el terreno cambia.
Hasta ahora me va fenomenal con un fps constante de 62. Sin embargo ahora me encuentro un problema cuando quiero texturizar el terreno. Mi idea era usar algun tipo de texture splatting, sin embargo ahora mi problema reside en qué valor poner a las coordenadas de textura de mis vértices.
Para seguir funcionando con mi esquema necesito que las coordenadas de textura para los vértices sean fijas (he intentado utilizar coordenadas variables que meto en un vertexstream diferente dinámico y la actualización se hace totalmente ineficiente). Sin embargo no se me ocurre ninguna forma de salir de este inconveniente, porque los vértices que coponen el terreno en cada simplificación son diferentes y cubren zonas distintas.
¿Teneis alguna idea?
Gracias