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
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.
Genial! Muchas gracias!!