Holaps
Drakkar, lo que planteas viene a ser el eterno problema, y es algo k ya se ha discutido largo y tendido
por estos parajes. Lo primero que debes tener en cuenta a la hora de implementar un sistema de particionamiento es:
- Voy a usar mapas muy chatos ? Entonces usaré quadtree
- Voy a tirar más de alturas ? Entonces usaré octree
Y por otra parte, debes tener en cuenta que para comparar 2 sistemas (como los que tú mismo has planteado) necesitas que el mapa sea suficientemente grande (unos 100.000 polys) y que posea un gran número de materiales (unos 100-200). Apartir de esas cotas es cuando te empiezas a dar cuenta de que ningún sistema es lo suficientemente rápido XD. No, es coña....
La primera técnica k expones (la que ya tenias implementada) es la óptima, pero necesitas además otros factores a tener en cuenta:
1) Que el vertex buffer no sea demasiado grande, para lo cual (en el caso del quadtree) es conveniente dividir el vertex buffer en 4, uno para cada rama primaria del árbol. Esto es así por lo mismo que no es óptimo usar texturas muy grandes, ya que a la larga causaremos un cuello de botella de 3 pares de cojones. Sería óptimo si en el transcurso de todo el juego/programa solo fueras a seleccionar (con SetStreamSource) un vertex buffer, pero eso es algo que normalmente no va a suceder. En un juego normalito, la media de stream changes per frame oscila entre 100 y 300 cambios, así como los de textura. Lo que planteaba Huevox de usar texturas de 2048x2048 es óptimo para un sistema 2D, como tmb para implementar animaciones de textura sobre un determinado material-superficie.
2) Precalcular TODO en cada nodo, de forma que construyas el index buffer ordenado por:
a) Distancia de nodos con respecto a la cámara,
b) Por materiales, de forma que se lance el menor número de DrawIndexedPrimitives.
c) Además se ordenarán los materiales según sean ópacos o transparentes.
Dicha precomputación te costará alrededor de 20 mb de ram para un mapa de unos 60.000 vertices, 100.000 faces y 100 materiales. Esos 20 mb de ram que pierdes los agradeces después en fps XD
Ah!, ten en cuenta que en tiempo de render tendrás que ordenar los indices de las faces con materiales transparentes, de lejos a cerca.
Por último, y si quieres hilar fino, ten en cuenta que las primitivas MUY TOCHAS joden mucho a la GPU; así que por ejemplo, teniendo un mapa con pocos materiales, si vamos ha hacer 5 llamadas de 20.000 faces cada una, será muy estimulante en un Gf 6800 pero muy jodido para una 4MX. Además debes tener en cuenta el StartVertex, VertexCount, StartFace y FaceCount para que el procesamiento de vertices sea el adecuado (para no saturar el vertex caché de la GPU).
Salud2
Drakkar, lo que planteas viene a ser el eterno problema, y es algo k ya se ha discutido largo y tendido
por estos parajes. Lo primero que debes tener en cuenta a la hora de implementar un sistema de particionamiento es:
- Voy a usar mapas muy chatos ? Entonces usaré quadtree
- Voy a tirar más de alturas ? Entonces usaré octree
Y por otra parte, debes tener en cuenta que para comparar 2 sistemas (como los que tú mismo has planteado) necesitas que el mapa sea suficientemente grande (unos 100.000 polys) y que posea un gran número de materiales (unos 100-200). Apartir de esas cotas es cuando te empiezas a dar cuenta de que ningún sistema es lo suficientemente rápido XD. No, es coña....
La primera técnica k expones (la que ya tenias implementada) es la óptima, pero necesitas además otros factores a tener en cuenta:
1) Que el vertex buffer no sea demasiado grande, para lo cual (en el caso del quadtree) es conveniente dividir el vertex buffer en 4, uno para cada rama primaria del árbol. Esto es así por lo mismo que no es óptimo usar texturas muy grandes, ya que a la larga causaremos un cuello de botella de 3 pares de cojones. Sería óptimo si en el transcurso de todo el juego/programa solo fueras a seleccionar (con SetStreamSource) un vertex buffer, pero eso es algo que normalmente no va a suceder. En un juego normalito, la media de stream changes per frame oscila entre 100 y 300 cambios, así como los de textura. Lo que planteaba Huevox de usar texturas de 2048x2048 es óptimo para un sistema 2D, como tmb para implementar animaciones de textura sobre un determinado material-superficie.
2) Precalcular TODO en cada nodo, de forma que construyas el index buffer ordenado por:
a) Distancia de nodos con respecto a la cámara,
b) Por materiales, de forma que se lance el menor número de DrawIndexedPrimitives.
c) Además se ordenarán los materiales según sean ópacos o transparentes.
Dicha precomputación te costará alrededor de 20 mb de ram para un mapa de unos 60.000 vertices, 100.000 faces y 100 materiales. Esos 20 mb de ram que pierdes los agradeces después en fps XD
Ah!, ten en cuenta que en tiempo de render tendrás que ordenar los indices de las faces con materiales transparentes, de lejos a cerca.
Por último, y si quieres hilar fino, ten en cuenta que las primitivas MUY TOCHAS joden mucho a la GPU; así que por ejemplo, teniendo un mapa con pocos materiales, si vamos ha hacer 5 llamadas de 20.000 faces cada una, será muy estimulante en un Gf 6800 pero muy jodido para una 4MX. Además debes tener en cuenta el StartVertex, VertexCount, StartFace y FaceCount para que el procesamiento de vertices sea el adecuado (para no saturar el vertex caché de la GPU).
Salud2