Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Problemas con CelShading y Animaciones

Iniciado por fiknius, 17 de Noviembre de 2009, 12:22:19 AM

« anterior - próximo »

fiknius

Hola a todos,

Hace poco tiempo puse un post con problemas con el CelShading en mallas estaticas y gracias a vosotros consegui solucionarlo, por eso acudo otra vez a vosotros, oh gran consejo de sabios.

Esta vez el problema ha sido al intentar aplicar ese CelShading a mallas animadas, y creo que el principal problema es que la Matriz del mundo que le estoy pasando al Shader esta mal. El codigo sin Shader es este:

            if (mesh.SkinInformation != null)
            {
                Matrix[] offsetMatrices = mesh.OffsetMatrices;
                MyFrame[] frameMatrices = mesh.FrameMatrices;

                for (int iattrib = 0; iattrib < mesh.NumberAttributes; iattrib++)
                {
                    BoneCombination boneCombo = mesh.BoneTable[iattrib];
                    for (int i = 0; i < mesh.NumberInfluences; i++)
                    {
                        int matrixIndex = boneCombo.BoneId[i];
                        if (matrixIndex != -1)
                        {
                            Matrix tempMatrix = offsetMatrices[matrixIndex] * frameMatrices[matrixIndex].Combined;
                            m_pD3DDevice.Transform.SetWorldMatrixByIndex(i, tempMatrix);
                        }
                    }
                                           
                    m_pD3DDevice.RenderState.VertexBlend = (VertexBlend)boneCombo.BoneId.Length - 1;
                    if (mesh.GetMaterials().Length > 0)
                    {
                        m_pD3DDevice.Material = mesh.GetMaterials()[boneCombo.AttributeId].Material3D;
                        m_pD3DDevice.SetTexture(0, mesh.Textures[boneCombo.AttributeId].GetD3DTexture());
                    }
                    else
                    {
                        m_pD3DDevice.Material = new Material(); 
                        m_pD3DDevice.SetTexture(0, null);
                    }
                    mesh.MeshData.Mesh.DrawSubset(iattrib);
                }
            }

y se ve perfectamente la animacion.

Cuando la malla es estatica, cambiaba esto:
m_pD3DDevice.SetTransform(TransformType.World, matWorld);
por esto:
effect.SetValue("xWorldMatrix", "MATRIX", matWorld);
que es una funcion que le pasa al Shader la matriz de mundo para que genere la escena.

Pero ahora con la malla animada, creo que deberia cambiar esto:
m_pD3DDevice.Transform.SetWorldMatrixByIndex(i, tempMatrix);
lo que no se, es porque otra cosa tengo que cambiarlo, se supone que establece varias matrices, lo que no se es como mezclarlas para que quede una Matriz y pasarsela a:
effect.SetValue("xWorldMatrix", "MATRIX", matWorld);

A alguno se os ocurre como podria hacerlo.
Gracias.




XÑA

Device.SetTransform sólo funciona para Fixed pipeline, es decir, sin utilizar shaders. Al utilizar shaders esto ya no tiene sentido, por lo que tienes que utilizar el SetValue.

Pero las animaciones por hueso son un montón de matrices, no sólo una, por eso tienes que usar algún tipo de 'indice'. Así que eso que quieres que es juntarlo todo en un SetValue, no puede hacerse.

fiknius

Oohh me lo temia, entonces tengo que cambiar el Shader ¿no?

Sabes algun sitio donde puedo investigar este tema, la idea es poder usar CelShading con modelos fijos y con estáticos, vamos con todos los elementos visibles del juego. ¿No hay alguna manera de tener la Matriz de Mundo despues de todas las transformaciones necesarias por la animacion?

Gracias.

fiknius

#3
Hola a todos otra vez,

Si no estoy equivocado, hay que hacer una especie de blender con las Matrices de mundo para que cuando se ejecute el DrawSubset pinte los vertices adecuadamente. El problema es que no se que operaciones tengo que hacer para ese Blender. He probado a ir multiplicando las matrices que se van generando en este bucle:

for (int i = 0; i < mesh.NumberInfluences; i++)
{
  int matrixIndex = boneCombo.BoneId[i];
  if (matrixIndex != -1)
  {
     [b]Matrix tempMatrix = offsetMatrices[matrixIndex] * frameMatrices[matrixIndex].Combined;[/b]
     m_pD3DDevice.Transform.SetWorldMatrixByIndex(i, tempMatrix);
  }
}


pero no vale.
No se que operaciones hace internamente el Device para combinar esas Matrices, pero creo que si pudiera reproducirlas en el Shader seria la solucion a mi problema.
¿Alguna idea?
Gracias.






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.