Estoy rehaciendo y ampliando algunas partes de mi motor, y me ha surgido la siguiente duda: cómo ordenaríais vosotros los polígonos a renderizar, por textura o por material?
Hasta ahora mi motor utilizaba una o dos texturas por objeto, dependiendo del tipo. Ahora quiero contener en un Material los datos de color, etc y los punteros a texturas que pueda tener un objeto.
Lo que no tengo claro es si ordenar los polígonos por su textura difusa, o directamente por material. El tema es si ordenando por textura difusa y activando/desactivando el resto de pasos (bumpmap, lightmap, etc) se ganaría algo en rendimiento, o sería preferible tener los vértices ordenados directamente segun su material y cambiar las texturas y texturestages necesarios para cada grupo de vértices.
Tres párrafos, y no se si me he logrado explicar bien :? .
En principio, y dada mi ignorancia, diria que dibujes de golpe todos los poligonos de la misma textura. Para no tener que cambiar de una textura a otra. Aunque no se si eso es importante. Pero luego me hablas de material, y que me aspen si se lo que es eso.
En términos quakeros, que es lo tuyo :p, material son los "shaders" de quake3, vamos, la combinación de texturas, renderstates y blending states de una superfice determinada.
A día de hoy, con shaders propiamente dichos, suele ser mejor ordenar por pixel shader y después por textura, ya que el coste de seleccionar un shader es mucho más alto. Le supone a la GPU mucho más trabajo de inicialización que seleccionar una textura nueva.
Con la fixed pipeline sigue siendo mejor ordenar por textura.
De todas formas cada motor es un mundo, lo mejor es probar y medir tiempos.
Yo agruparia por material. De hecho así lo hago yo en mi motor.
Llamemos material a:
- Combinación de shaders, variables y elementos ( texturas )
- Configuración de:
- Vertex States.
- Fragment States.
- Material Properties.
Luego tambien hay que tener en cuenta cosas como alphas y tal. U optimizar dentro de la ordenación de material haciendolo por texturas. Puede ser una buena idea.
Como dice senior lo suyo es hacer pruebas de stress.
Un saludo.
En codepixel han puesto un par de tutos sobre motores bastante interesantes. En el segundo, "Driver gráfico" hablan sobre cómo ordenar. Creo que lo hacen por material:
http://www.codepixel.com/
Hi,
estoy de acuerdo con Senior Wapo.
Por si te ayuda, en la web de Tom Forsyth hay un articulo sobre el coste de los cambios de estado. Actualmente seria la ultima entrada titulada: "Renderstate change costs". La web es: http://home.comcast.net/~tom_forsyth/blog.wiki.html
Un saludo,
Rubén
muy sencillo, primero por material, despues para los del mismo material, ordenas por textura, y despues por los que esten mas próximos a cámara (para que rellenen el zbuffr lo antes posible)