badmike95
Messages postés45Date d'inscriptionvendredi 18 novembre 2005StatutMembreDernière intervention20 mai 2012
-
9 mai 2012 à 17:52
badmike95
Messages postés45Date d'inscriptionvendredi 18 novembre 2005StatutMembreDernière intervention20 mai 2012
-
20 mai 2012 à 12:14
Salut à tous,
Je demande votre aide aujourd'hui car je suis confronté à un problème qui m'est difficile de corriger malgré mes diverses tentatives. Mon problème étant difficile à expliquer, je joins plus bas une image qui aidera surement à comprendre.
Pour expliquer la structure de mon code, je génère dans un premier temps deux textures (inférieure et supérieure) qui viennent se superposer une fois générées (avec diverses choses entre, d'où les deux textures).
A l'origine, le problème apparaissait sur les deux textures et rendait ce que je dessinais dans celles-ci plus sombre ou plus clair en fonction de la couleur indiqué lors du nettoyage du device (Noir ou Blanc).
En effet, je ne comprend pas pourquoi les pixels transparent (pas ceux qui le sont totalement) se mélangent avec la texture de fond censé être un "Noir transparent" ou un "Blanc transparent". De plus je précise que j'ai bien évidemment besoin de l'alphablending pour faire des "surcouches" donc je ne peux pas le désactiver pendant la génération de ces textures.
Du coup, j'ai tenté divers paramètres de blending mais aucun n'aboutissent à un résultat positif. Du coup en farfouillant un peu dans la doc du sdk j'ai eu l'idée de faire comme ceci :
' ...
D3DDevice8.SetRenderState D3DRS_ALPHABLENDENABLE, True
D3DDevice8.SetRenderState D3DRS_SRCBLEND, D3DBLEND_SRCALPHA
D3DDevice8.SetRenderState D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA
' Je génère une fois directx initialisé les textures inférieures et supérieures.
D3DDevice8.Clear 0, ByVal 0, D3DCLEAR_TARGET, 0, 1#, 0 ' Ici avec un background transparent noir en exemple.
D3DDevice8.BeginScene
D3DDevice8.SetRenderState D3DRS_ALPHABLENDENABLE, False
' Je dessine ici la texture inférieure générée.
D3DDevice8.SetRenderState D3DRS_ALPHABLENDENABLE, True
' Je dessine ici diverses choses (sans soucis).
D3DDevice8.SetRenderState D3DRS_ALPHABLENDENABLE, False
' Je dessine la texture supérieure générée.
D3DDevice8.SetRenderState D3DRS_ALPHABLENDENABLE, True
D3DDevice8.EndScene
D3DDevice8.Present ByVal 0, ByVal 0, 0, ByVal 0
Cette solution de désactiver puis réactiver l'alphablending marche parfaitement mais le soucis c'est qu'évidemment la texture supérieure n'est plus transparente et laisse apparaitre un fond noir, ce qui nous empêche donc de voir tout ce qui est dessiné avant.
Si j'enlève la désactivation-réactivation de l'alphablending sur la texture supérieure et laisse comme tel pour la texture inférieure, j'obtiens ceci :
A l'évidence, il y a un mélange qui ne devrait pas se faire (celui entre le fond invisible de la texture crée et ce que je dessine). De plus je trouve que désactiver puis réactiver l'alphablending est une méthode impropre et j'imagine qu'il pourrait y avoir une meilleur solution.
J'ai aussi émis la possibilité d'un problème de couleur clé, mais je doute que le problème vienne de là.
Je n'oublie pas de préciser également que toute les textures utilisées sont au format D3DFMT_A8R8G8B8.
Je vous remercie d'avance en tous cas pour toute réponses que vous pourrez m'apporter.
badmike95
Messages postés45Date d'inscriptionvendredi 18 novembre 2005StatutMembreDernière intervention20 mai 2012 20 mai 2012 à 12:14
J'ai finalement trouvé une solution alternative sans pour autant corriger le problème. Au final ça marche mais j'aurais aimé des avis à ce sujet, tant pis le sujet est donc clos.