Bien, tengo un problema con el vertex shader má simple:El rectángulo con color. Este shader NO tiene que transformar, sólo dibujar un rectángulo con u ncolor(lo utilizo para las sombras)
He aquí el código:
float sx,sy;CXCUADROPLANOVERTEX2 vpv[4];float color[4]={ .5,.5,.5,.5 };
sx = (FLOAT)Video.Ancho();
sy = (FLOAT)Video.Alto();
sx--;
sy--;
BYTE *dest;
vpv[0].x=0;vpv[0].y=sy;vpv[0].z=0;vpv[0].w=1;
vpv[1].x=0;vpv[1].y=0;vpv[1].z=0;vpv[1].w=1;
vpv[2].x=sx;vpv[2].y=sy;vpv[2].z=0;vpv[2].w=1;
vpv[3].x=sx;vpv[3].y=0;vpv[3].z=0;vpv[3].w=1;
Video.m_VBCuadro->Lock(0,0,(BYTE **)&dest,0);
memcpy(dest,vpv,16*4);
Video.m_VBCuadro->Unlock();
Video.Device()->SetVertexShaderConstant(8,color,1);
Video.Device()->SetStreamSource(0,Video.m_VBCuadro,16);
Video.Device()->DrawPrimitive(D3DPT_TRIANGLESTRIP,0,2);
Y aquí el Shader:
static const char sPosRHWUnColor[] =
"vs.1.0 //Shader version 1.0 n"
"mov oPos, v0 n"
"mov oD0 , c8 //Diffuse color = vertex color n";
static DWORD PosRHWUnColor[] =
{
D3DVSD_STREAM(0),
D3DVSD_REG(0, D3DVSDT_FLOAT4 ),
D3DVSD_END()
};
La cuestión es...¡que no hace nada! No me dibuja el rectángulo para hacer la sombra.
¿Alguien puede ayudarme?
Por lo que veo, lo que quieres es poder especificar los vértices en coordenadas de pantalla (tal como ocurre con el D3DFVF_XYZRHW), ¿no?.
Si es así, no estoy seguro pero es posible que D3D espere las coordenadas de vértice en clip-space, es decir, espacio en el cual, la esquina superior izquierda tiene las coordenadas (-1,1) y la inferior derecha las coordenadas (1, -1). Para probar si es así, define tu quad de la siguiente forma:
{ -1, -1, 0, 0xff000000, }
{ -1, 1, 0, 0xff000000, }
{ 1, -1, 0, 0xff000000, }
{ 1, 1, 0, 0xff000000, }
a ver si ocupa toda la pantalla o no...¡ah! y en el vertex shader transforma los vértices por la matriz identidad...si no dudo que salga algo por pantalla.
Si esto funciona, entonces deberás crear una matriz que al multiplicar el vértice definido en screen-space lo convierta a clip-space...pero vamos no lo he probado así que no sabría decirte...
Saludos
Bien, Berserker, tenías semi razón! Como bien has dicho, debo colocar los vértices en clip-space. Pero lo que no necesito es utilizar la matriz identidad. Funciona ahora todo correctamente. Muchas gracias!
¡ah que no hay que multiplicar por la matriz identidad!...pues mucho mejor...4 instrucciones que te ahorras :sonriendo:. Claro que pensándolo bien pues tiene su lógica ya que multiplicar un vertice por la matriz identidad dará el vértice mismo :riendo:
Y nada, que me alegro de que funcione
Saludos
Dracula... no sería mejor que te pasaras a Cg? es solo una opión :sonriendo:.
Bueno, lo estoy pensando, pero como todavía mi nivel de shaders es muy bajo, estoy utilizando los de DX. Aunque creo que optaré muy pronto por los Cg.