Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Ayuda con el "skinning" de una malla

Iniciado por PIM, 07 de Noviembre de 2012, 02:31:28 AM

« anterior - próximo »

PIM

Hola queridos amigos de esta estupenda web. Solicito su amable ayuda con un problema que tengo. Resulta que estoy probando con la técnica de la animación esqueletal, con el formato collada. Funciona bien pero el problema es el modo en que deben ser "unidos" los vértices a los huesos mediante la siguiente fórmula:

Vr += {[(v * BSM) * IBMi * JMi] * JW}

   i: Número de huesos que influencían a v.
   BSM: Bind-shape matrix
   IBMi: Inverse bind-pose del hueso i
   JMi:  matriz de tranformación de i
   JW: "Peso" que influencía un hueso i sobre un vértice v.

La cuestión es que como se darán cuenta, es necesario recorrer CADA UNO de los vértices que conforman el modelo para calcular la nueva posicion del vértice según se mueva el hueso. Esto significa que si el modelo está conformado por 10, 000 vértices el proceso será muy lento.  :grrr:

Aquí mi duda.

1.- ¿Existe otro método de "unir" los vértices a los huesos sin la necesidad de recorrer cada uno de los vértices?, no sé otra fórmula o algo por el estilo.

He logrado dibujar un modelo que tiene 2000 vértices a 60 cuadros por segundo, pero noto que se lleva gran parte de la capacidad del CPU. Por lo que incorporar otras cosas a la escena está difícil. Quiero destacar que he hecho la prueba en una pc con un procesador pentium III y una tarjeta NVIDIA GeForce 6200, No sé cómo funcionará en una máquina más nueva.

Me han comentado que lo mejor sería usar los vertex shaders (GLSL) para tener un rendimiento mucho mayor, sin embargo lo he dejado de lado, precisamente por si hay otro método que no requiera de la acelaración gŕafica de la GPU.

También tengo la duda si el "skinning" se hace así solo con Collada o también con otro tipo de archivos 3D que contengan animacion por huesos.

Les agradezco mucho sus respuestas.
;)


[EX3]

Cita de: javier_macross en 07 de Noviembre de 2012, 02:31:28 AM
Me han comentado que lo mejor sería usar los vertex shaders (GLSL) para tener un rendimiento mucho mayor, sin embargo lo he dejado de lado, precisamente por si hay otro método que no requiera de la acelaración gŕafica de la GPU.
Desde luego es más optimo hacer trabajar la GPU para estos temas que hacerlo a pelo contra la CPU. Las GPUs están diseñadas precisamente para estas tareas entre otras muchas y prácticamente hoy día la mayoría de motores, si no todos, se centran el uso de shaders tanto para operaciones al pixel como de geometría por ser más eficiente.

Salu2...
José Miguel Sánchez Fernández
.NET Developer | Game Programmer | Unity Developer

Blog | Game Portfolio | LinkedIn | Twitter | Itch.io | Gamejolt

blau

Si quieres que vaya bien debes ayudarte con la gpu...

Date cuenta que bones no se suelen tener muchos... lo normal para shader 2.0 es tener menos de 72, si usas shader 3.0+ puedes tener más... pero tampoco demasiados más... entre 100 y 160...

Lo unico que debes calcular en la cpu son las matrices de transformacion del bone... en el shader lo que haces es transformar los vertices...

lo normal en un vertex shader es que te llegue la posición en espacio objeto, y lo transformas con tu matriz de mundo...

si haces el skinning ahí, se tiene asumido como norma que a cada vertice no le pueden afectar más de 4 bones, luego te llegará 4 indices de bones y los 4 pesos que intervienen en la mezcla... entonces ya sólo te queda acceder a las matrices y realizar la transformacion de tu vertice...

Yo soy más de xna... y hay muchos ejemplos de como hacerlo tanto para vs 2.0 en el que se pasan las matrices por parametros.. como para vs 3.0+ que se pasan las matrices en un vertex buffer... en openg gl no tengo ni idea de como se hace pero supongo que será similar...


PIM

Sí creo que tienen razón. La duda que tengo es que, ya teniendo todos los datos y sólo faltándome calcular la nueva posición del vértice con respecto al hueso, al pasar el bucle (for(i=0;i<numero_de_vertices;i++)) a la GPU este ¿será más rápido que en la CPU?

Muchas gracias por contestar.
;)

blau

respuesta rápida: SI

La GPU trabaja en paralelo (olvidate del bucle), esta diseñada para realizar cálculos vectoriales... y no hay necesidad de pasar los vértices de CPU a GPU en cada ciclo porque los vértices pueden estar en memoria de GPU y sólo es necesario pasarle a la GPU la matriz de bones, así que SI es más rápida que la CPU...;)

PIM

#5
Cita de: blau en 08 de Noviembre de 2012, 12:59:05 AM
respuesta rápida: SI

La GPU trabaja en paralelo (olvidate del bucle), esta diseñada para realizar cálculos vectoriales... y no hay necesidad de pasar los vértices de CPU a GPU en cada ciclo porque los vértices pueden estar en memoria de GPU y sólo es necesario pasarle a la GPU la matriz de bones, así que SI es más rápida que la CPU...;)

Muchas gracias por tu respuesta. Una duda tengo con respecto a lo que comentas. Si no hay que pasar por el  bucle de vértices, ¿Cómo "subo" los vértices al GPU y, cómo hago para calcular (usando la fórmula de skinning) la posicion final del vértice.

Muchas gracias por tu respuesta y por tu paciencia.
:P






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.