2009-07-09 5 views
1

J'ai misRendertargets multiples dans DX9

m_lpD3DDevice->SetRenderTarget(0,Buffer1); 
m_lpD3DDevice->SetRenderTarget(1,Buffer2); 
m_lpD3DDevice->SetRenderTarget(2,Buffer2); 

et si je rends le pixelshader ne concerne que la première cible de rendu.

structure de sortie Il est

struct PS_OUTPUT 
{ 
    float4 Color0 : COLOR0; 
    float4 Color1 : COLOR1; 
    float4 Color2 : COLOR2; 
}; 

que dois-je faire pour affecter les deux autres cibles trop render?

Répondre

0

J'ai enfin la réponse maintenant. Tout ce que je devais faire était de mettre

ColorWriteEnable = red | green | blue; 

dans le fichier d'effet. Tout le reste était correct. Mais je ne sais pas pourquoi cela a fonctionné.

1

Dans votre pixel shader, assurez-vous de renvoyer la structure non float4. Aussi ne beind la semantion color0 à la signature de la fonction, qui est de ne pas faire:

PS_OUTPUT myPS(VS_OUTPUT): COLOR0 

Je duobt cela copmpile, mais il pourrait confondre le compilateur. Un simple shaders MRT ressemble à ceci:

PS_OUTPUT myPS(VS_OUTPUT) 
{ 
    PS_OUTPUT out; 
    out.color0 = float4(0.5,0.5,0.5,1.0); 
    out.color1 = float4(0.2,0.5,0.8,1.0); 
    out.color2 = float4(0.8,0.5,0.2,1.0); 
    return out; 
} 

Quels sont buffer0,1 & 2? Sont-ils le résultat d'un appel à CreateTexture()? (ou plutôt une surface de cette texture). Si c'est le cas, assurez-vous que la texture a été créée avec l'indicateur d'utilisation de la cible de rendu: D3DUSAGE_RENDERTARGET. Assurez-vous que votre carte peut prendre en charge le rendu sur plus d'une RT. (oublié comment faire - mais je doute qu'il ne les supportera pas.)

Si vous avez créé les tampons correctement, réglez-les correctement, et écrivez correctement les valeurs correctes du pixel shader, puis Je ne vois pas ce qui pourrait mal tourner. Que dit PIX * à propos du MRTS? Sont-ils écrits, et c'est l'affichage de ceux qui ne va pas? Ps: Vous avez fait un appel de tirage, je l'espère? :)

* PIX est une application du Kit de développement logiciel (SDK) DirectX. Si vous ne l'avez pas utilisé auparavant, vous manquez vraiment :)

1

Il existe un masque d'écriture couleur séparé pour chaque cible. Le masque d'écriture par défaut pour la cible 0 est 0xf (tous les canaux sont activés), mais la valeur par défaut pour les autres cibles est 0x0. Surcharger cela dans le fichier d'effets est un moyen (vous vouliez activer l'alpha cependant?), Ou vous pouvez le changer avec SetRenderState. Voir la documentation pour les états D3DRS_COLORWRITEENABLE {1,2,3}.