Foros - Stratos

Programadores => Programación gráfica => Mensaje iniciado por: Drácula en 01 de Enero de 1970, 01:00:00 AM

Título: Estos shaders!!!
Publicado por: Drácula en 01 de Enero de 1970, 01:00:00 AM
                                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?
                               
Título: Estos shaders!!!
Publicado por: BeRSeRKeR en 01 de Enero de 1970, 01:00:00 AM
                                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
                               
Título: Estos shaders!!!
Publicado por: Drácula en 01 de Enero de 1970, 01:00:00 AM
                                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!                                
Título: Estos shaders!!!
Publicado por: BeRSeRKeR en 01 de Enero de 1970, 01:00:00 AM
                                ¡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
                               
Título: Estos shaders!!!
Publicado por: ProD en 01 de Enero de 1970, 01:00:00 AM
                                Dracula... no sería mejor que te pasaras a Cg? es solo una opión :sonriendo:.
                               
Título: Estos shaders!!!
Publicado por: Drácula en 01 de Enero de 1970, 01:00:00 AM
                                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.