Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Skin Sin Vertex Shader

Iniciado por Junse, 02 de Marzo de 2005, 12:54:34 PM

« anterior - próximo »

Junse

 Hola estaba leyendo un libro sobre motores 3d y ahi hacian una implementaciòn de un sistema de animacion por bones, en el decian que si no se deseaba realizar un vertex shader para el skin, se debia calcular la malla en el cpu y mandarla toda por el bus (no profundice en el codigo pero creo que lo que hacia es crear un VB para la malla en cada frame).
Ahora mi pregunta que por ahi esta muy errada o mal explicada, pero bueno es la siguiente:
No seria mas rapido que mandar toda la malla por el bus, y si NO se quiere usar vertex shader usar un VB por cada bone (suponiendo que cada vertice tenga solo un peso de influencia), y realizar transformaciones por cada VB de cada hueso?
SI no se entendio, disculpen tratare de ser mas claro, si es demasiado basico disculpen tambien pero es una duda que no puedo sacarme solo.
Desde ya gracias por sus respuestas. :D
PD: se que crear muchos vertex buffer ralentiza mucho, pero en comparacion con mandar toda la data y crear un vertex buffer por vez...  

Haddd

 El problema no está en cada bone, que por cierto sería lentísimo pq tendrías que mandar un montón de DrawIndexedPrimitive.

El problema está en el tamaño. Si utilizas 4 bones, pues consumen un montón de constantes de los shaders.
Si a esto le añades los cálculos para iluminación y demás.....te mueres.

Además, actualmente se suelen dar mútiples pasadas por shader. Eso significa que si , por ejemplo, tengo 2 luces con sombras el shader se ejcutará:

1. Pasada con luz ambiente
2. Pasada para calcular el shadowmap de la luz 1
3. Pasada de la luz 1
4. Pasada para calcular el shadowmap de la luz 2
5. Pasada de la luz 2

Y en cada pasada la GPU tiene que hacer los cálculos de bones...

Esto puede evitarse con algo que se llama deferred lightning. Pero no te lo recomiendo para tarjetas que no tengan al menos 3.0

_Grey

 
CitarNo seria mas rapido que mandar toda la malla por el bus, y si NO se quiere usar vertex shader usar un VB por cada bone(suponiendo que cada vertice tenga solo un peso de influencia), y realizar transformaciones por cada VB de cada hueso?

Hummm...... a ver si lo pillo, te refieres tener un VertexBuffer para cada hueso, no es asi???si separas la malla en varios vertexbuffer's troceas el objeto, es decir cada parte del cuerpo sera tratado como un objeto separado, como en los juegos antiguos, no estoy seguro si te refieres a eso por que me parece una pregunta "rara" pero creo entender eso en tu post. Si te refieres a eso, si puede ser algo mas rapido dependiendo de la maquina, por ejemplo en mi antiguo ordenata tengo una grafica con T&L pero sin shaders de ningun tipo, y seria mas rapido mandarle al hardware grafico que hiciera las trasformaciones por su cuento tratandose de obejtos separados,ten en cuenta tambien que su CPU es un PII 300Mhz :P .
En el libro que dices lo hacen asi por que la malla es un objeto en si, y no trata cada trozo del cuerpo como objetos independientes.

Espero que te sirva, saludos.

zupervaca

 no entiendo muy bien el hilo del post, pero entre todos me he hecho una pequeña idea de lo que puede ser

si tienes un modelo por partes puedes juntarlo luego y enviar toda la malla e indices del tiron y luego realizar varias llamadas a DrawIndexedPrimitive o al a que quieras indicando diferentes offsets de cada objeto y asi no tendras que subir por separado todos buffers, pero en las pruebas que he hecho no se nota la diferencia entre enviarlo todo del tiron y hacerlo poco a poco, es mas, si no tienes el cliping activado la mejor solucion es enivar triangulo por triangulo calculando tu el frustum en vez de ir metiendo todos los triangulos a los buffers si estan visibles y luego enviarlo todo ya que te ahorras varias copias de memoria

no se si me he explicado bien  (nooo)  

zupervaca

 perdonar el segundo post seguido pero es que se me olvidaba que yo estoy haciendo pruebas con una tarjeta grafica gforce2 16mb para portatil con lo que tambien puede que no sea muy fiable ya que es una tarjeta grafica vieja que puede desaprovechar cosas nuevas que vengan

Junse

 Disculpen la demora y gracias por tantas respuestas igual creo que el que mejor lo entendio fue grey
Citar
QUOTE
No seria mas rapido que mandar toda la malla por el bus, y si NO se quiere usar vertex shader usar un VB por cada bone(suponiendo que cada vertice tenga solo un peso de influencia), y realizar transformaciones por cada VB de cada hueso?


, si la malla es entera y lo que me llamaba la antencion era que hacia toda la transformacion en el cpu y despues mandaba todos los datos por el bus (agp o pci si hablamos de anaño :P  ) y ahi creaba un nuevo vertex buffer,  se que la malla al ser entera es mejor mandarla como un solo objeto en su propio vb pero ya que en ese libro no usaban los vs pensè eso  pero si como dice el amigo Haddd, eso consume un huevo bueno ahi esta mi respuesta.
Ahora me queda otra duda quiza mas estupida que la anterior  :( , el la animacion por skin que hace direct3d con los archivos x los hace con vs o mandando toda la data por cada keyframe (otra vez mil disculpas si es todavia mas confuso que antes )






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.