Logo

¡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






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.
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.