Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





[DirectX] Shaders y LPD3DXSprite

Iniciado por prospekt, 08 de Agosto de 2014, 01:54:03 PM

« anterior - próximo »

prospekt

Buenas a todos. Estoy realizando algunas pruebas con DirectX y he encontrado un problemilla.
Hasta ahora, siempre que he necesitado shaders los he utilizado en entornos tridimensionales convencionales y no he tenido ningún problema. El problema viene al utilizar la interfaz LPD3DXSprite para renderizar un sprite en dos dimensiones, y es que soy incapaz de hacer que el shader surta efecto, aunque su ejecución si que se realiza sin errores.

El código en el renderer es el siguiente (elimino lo que queda de la stl, que deja el código muy feo), sprite es la interfaz LPD3DXSPRITE.


device->BeginScene();

// La escena esta divida en capas.
for (...) // Por cada capa
{
sprite->Begin(D3DXSPRITE_ALPHABLEND);
for (...) // Por cada nodo de la capa
{
nodo->Draw(sprite);
}
sprite->End();
}
device->EndScene();


El código del método Draw de cada nodo de la escena es el siguiente (sprite es la misma variable que el anterior):


// Cosas de transformaciones, selección del rectángulo a mostrar, etc...
...

sprite->SetTransform(&mat);

effect->SetTechnique("PostProcess");
UINT passes;
effect->Begin(&passes,0);

for (UINT i=0;i<passes;i++)
{
effect->BeginPass(i); // Set the pass
sprite->Draw(texture, &rect, NULL, NULL, 0xFFFFFFFF);
effect->EndPass();
}

effect->End();



Finalmente, el shader tampoco puede ser más simple:


struct PS_INPUT
{
float4 Position   : POSITION;
float2 Texture    : TEXCOORD0;
};

struct PS_OUTPUT
{
float4 Color   : COLOR0;
};

PS_OUTPUT ps_main( in PS_INPUT In)
{
PS_OUTPUT Out;         
Out.Color.r = 1;
Out.Color.g = 1;
Out.Color.b = 1;
Out.Color.a = 1;
return Out;   
}

technique PostProcess
{
pass P0
{
VertexShader = null;
PixelShader = compile ps_2_0 ps_main();
}
}


¿Se me está escapando algo? ¿Es necesario algo más para utilizar shaders con la interfaz LPD3DXSprite?
Twitter: @AIProspekt

prospekt

Me respondo yo mismo, ya que he conseguido solucionarlo.

El problema está en que el renderizado real de los sprites se realiza en realidad en la llamada sprite->End(), por lo que todos los sprites deben utilizar el mismo shader. El orden de llamas sería algo así:


sprite->Begin();

for(...) //Dibujar todos los sprites
    sprite->Draw();

effect->Begin();
sprite->End();
effect->End();
Twitter: @AIProspekt






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.