Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Problema con...Vertex Shaders

Iniciado por Drácula, 01 de Enero de 1970, 01:00:00 AM

« anterior - próximo »

Drácula

                                Bien, este VertexShader me funciona y al crearlo no me da ningún error:
static const char sPosDiffuseTex1[] =
"vs.1.0                             //Shader version 1.0         n"
"dp4     oPos.x , v0   , c4         //emit projected x position      n"
"dp4     oPos.y , v0   , c5         //emit projected y position      n"
"dp4     oPos.z , v0   , c6         //emit projected z position      n"
"dp4     oPos.w , v0   , c7         //emit projected w position      n"
"mov     oD0    , v5                //Diffuse color = vertex color  n"
"mov     oT0.xy , v7                //copy texcoords            n";

static DWORD PosDiffuseTex1[] =
{
   D3DVSD_STREAM(0),
   D3DVSD_REG(D3DVSDE_POSITION, D3DVSDT_FLOAT3 ),         //D3DVSDE_POSITION,  0  
   D3DVSD_REG(D3DVSDE_DIFFUSE,  D3DVSDT_D3DCOLOR ),      //D3DVSDE_DIFFUSE,   5  
   D3DVSD_REG(D3DVSDE_TEXCOORD0,D3DVSDT_FLOAT2 ),          //D3DVSDE_TEXCOORD0, 7  
   D3DVSD_CONST(0,1),*(DWORD*)&c[0],*(DWORD*)&c[1],*(DWORD*)&c[2],*(DWORD*)&c[3],
   D3DVSD_END()
};


Sin embargo, este...¡no!

static const char sPosTex1[] =
"vs.1.0                             //Shader version 1.0         n"
"dp4     oPos.x , v0   , c4         //emit projected x position      n"
"dp4     oPos.y , v0   , c5         //emit projected y position      n"
"dp4     oPos.z , v0   , c6         //emit projected z position      n"
"dp4     oPos.w , v0   , c7         //emit projected w position      n"
"mov     oT0.xy , v5                //copy texcoords            n";

static DWORD PosTex1[] =
{
   D3DVSD_STREAM(0),
   D3DVSD_REG(D3DVSDE_POSITION, D3DVSDT_FLOAT3 ),         //D3DVSDE_POSITION,  0  
   D3DVSD_REG(D3DVSDE_TEXCOORD0,D3DVSDT_FLOAT2 ),          //D3DVSDE_TEXCOORD0, 5
   D3DVSD_CONST(0,1),*(DWORD*)&c[0],*(DWORD*)&c[1],*(DWORD*)&c[2],*(DWORD*)&c[3],
   D3DVSD_END()
};

Me da un error al crearlo de InvalidCall. He probado modificando la declaración para incluir el diffuse y sí funciona, por lo que creo que es problema de la declaración, pero ...¿porqué?

Otra cosa, cuando lo defino, no me salen muy bien las cuentas a la hora de conocer el nº de v que se relaciona, es decir, si la primera definición ocupa 4 floats ( D3DVSDT_FLOAT3)..¿Porqué me refiero al v5 para referirme al diffuse? ¿No debería ser v4 puesto que v0,v1,v2,v3 están asociados a la posición?

Gracias por vuestra ayuda                                
ltimas mejoras en Merlín: Multitextura.Control y generación automática de LOD.Importa ASE y X. Frustum Clipping por BB.Render añadido de wireframe y del BB.Animaciones por interpolación.Animaciones de textura...
Actualmente:Octree y jerarquías

BeRSeRKeR

                                El problema está en que utilizas la constante D3DVSDE_TEXCOORD0 para especificar el registro de entrada en el que se almacenará la coordenada de textura. Si te fijas, D3DVSDE_TEXCOORD0 vale 7 por lo que siempre estás almacenandola en el registro de entrada v7. Es por ello que en este caso deberías realizar la declaración del vertex shader como:

static DWORD PosTex1[] =
{
D3DVSD_STREAM(0),
D3DVSD_REG(0, D3DVSDT_FLOAT3),
D3DVSD_REG(5,D3DVSDT_FLOAT2),
D3DVSD_CONST(0,1),*(DWORD*)&c[0],*(DWORD*)&c[1],*(DWORD*)&c[2],*(DWORD*)&c[3],
D3DVSD_END()
};

Supongo que de esta forma debería funcionar...

Saludos.
                               
¡Si te buscan en nombre de la ley, huye en nombre de la libertad!!

Drácula

                                Genial! Muchas gracias!!                                
ltimas mejoras en Merlín: Multitextura.Control y generación automática de LOD.Importa ASE y X. Frustum Clipping por BB.Render añadido de wireframe y del BB.Animaciones por interpolación.Animaciones de textura...
Actualmente:Octree y jerarquías