4 votes

Le mode "écran" de Photoshop dans DirectX

Edit : Problème résolu ! Voir la fin du message.

Comment implémenter le mode de mélange "Screen" de Photoshop dans DirectX 8 ?

Les informations que j'ai trouvées sur ce sujet ( http://www.ziggyware.com/readarticle.php?article_id=228 ) :

Result = 1 – (1 – destination) * (1 – source)
Result = 1 – (1 – source – destination + destination * source)
Result = 1 – 1 + source + destination – destination * source
Result = source + destination – destination * source
Result = destination + source – source * destination
Result = destination + source * (1 – destination)

Maintenant que nous avons fait le calcul, nous devons simplement définir les modes de fusion :

BlendOperation = Add
DestinationBlend = One
SourceBlend = InvDestColor

Je suppose que les états de mélange de DirectX doivent l'être :

pD3DDevice->SetRenderState(D3DRS_BLENDOP, D3DBLENDOP_ADD);
pD3DDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_ONE);
pD3DDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_INVDESTCOLOR);

Est-ce correct ? (J'ai un résultat erroné)

Exemple de projet : Lien Miroir

Résultat de Photoshop :

http://img192.imageshack.us/img192/7015/photoshopf.jpg

Mon résultat dans DirectX :

http://img193.imageshack.us/img193/2969/directx.jpg

Résolution de problèmes : La formule ne prend pas en compte l'alpha de l'image, pour y remédier vous devez rendre le fond de l'image noir solide avec une opacité de 100%.

2voto

Suma Points 11966

La ligne suivante est fausse :

pD3DDevice->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_ADD);

Votre intention est probablement d'indiquer qu'alpha blender devrait faire ADD, mais le paramètre D3DTSS_COLOROP n'affecte pas le blender final, il définit le combineur de texture à la place. Vous le configurez pour ajouter quelque chose (résultat de l'étape précédente/suivante, ou quelque chose comme ça) à la couleur que vous échantillonnez à partir de la texture, ce qui est faux. D3DTOP_SELECTARG1 ou D3DTOP_MODULATE par défaut devraient faire l'affaire.

Ce que vous devez écrire à la place, c'est :

pD3DDevice->SetRenderState(D3DBLENDOP, D3DBLENDOP_ADD);

0voto

CiscoIPPhone Points 6151

Les calculs semblent corrects, et la façon dont vous avez défini les fonctions DirectX devrait fonctionner.

Mon conseil est le suivant :

  1. Utilisez les mêmes images que celles que vous utilisez dans Photoshop afin de savoir qu'il ne fait pas correctement du blanc pur (possible).
  2. Vérifiez que vous pouvez utiliser d'autres modes de mélange et qu'ils génèrent le bon résultat.

    • Je m'excuse si vous avez déjà fait ces deux choses.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X