Transparence avec directX8

Transparence avec directX8 - C++ - Programmation

Marsh Posté le 01-04-2003 à 09:50:26    

Salut,
 
G un petit pb avec directX8 et la transparence.
Je veux superposer deux images l'une sur l'autre. La premiere servant de fond et la seconde de calque.
Le but est qu'une partie de la seconde devienne transparente pour cacher la premiere. Seulement voila je n'arrive pas a la rendre transaprente. Des que je donne ma couleur de transparence alors j'obtient du noire a la place de ma couleur clé  :heink: .
Si quelqu'un peut m'aider je lui en serais infiniment reconnaissant.
Par avance merci :)

Reply

Marsh Posté le 01-04-2003 à 09:50:26   

Reply

Marsh Posté le 01-04-2003 à 11:25:20    

:heink:
 
C'est pas du à un bug qui serait encore la sur les blits sur des surfaces > 16 bits ?
 
Je suppose que tu ne fais pas l'erreur (stupide ?) d'oublier d'afficher ta surface de fond :D

Reply

Marsh Posté le 01-04-2003 à 11:31:05    

Non j'affiche bien ma surface de fond pourtant. La je sais plus koi faire je seche

Reply

Marsh Posté le 01-04-2003 à 15:52:38    

ben ... Sans ton source, je ne peux pas te dire mieux ...
 
désolé ...
 
Edit : d'autant plus que je ne suis pas encore une star en DirectX ...


Message édité par theshockwave le 01-04-2003 à 15:53:14
Reply

Marsh Posté le 01-04-2003 à 17:40:15    

titimanu a écrit :

Salut,
 
G un petit pb avec directX8 et la transparence.
Je veux superposer deux images l'une sur l'autre. La premiere servant de fond et la seconde de calque.
Le but est qu'une partie de la seconde devienne transparente pour cacher la premiere. Seulement voila je n'arrive pas a la rendre transaprente. Des que je donne ma couleur de transparence alors j'obtient du noire a la place de ma couleur clé  :heink: .
 


 
As-tu activé l'alphablending ?
Quel est l'operateur de blending source ?
Quel est l'operateur de blending destination ?


---------------
"Dieu a exploité tous nos complexes d'infériorité, en commençant par notre incapacité de croire à notre propre divinité." - Emil Michel Cioran
Reply

Marsh Posté le 01-04-2003 à 17:55:35    

Tetragrammaton IHVH a écrit :


 
As-tu activé l'alphablending ?
Quel est l'operateur de blending source ?
Quel est l'operateur de blending destination ?


 
My hero ! :love:
 
 
 
 
 
:D


---------------
last.fm
Reply

Marsh Posté le 02-04-2003 à 09:32:48    

Vi je l'ai activer. En fait je prend mon backBuffer sur lekel je recopie mes differentes surfaces avec la fonction CopyRects. Et pi la c le noir complet, mes images sont recopiés mais ma couleur clé est remplacer par du noir.

Reply

Marsh Posté le 02-04-2003 à 09:53:11    

voila ma fonction de rendu
 
void Render()
{
 
 
 g_pD3DDevice->SetRenderState(D3DRS_ALPHABLENDENABLE,TRUE);
 g_pD3DDevice->SetRenderState(D3DRS_SRCBLEND,D3DBLEND_SRCALPHA);
 g_pD3DDevice->SetRenderState(D3DRS_DESTBLEND,D3DBLEND_INVSRCALPHA);
 //g_pD3DDevice->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_MODULATE);
 
    if(g_pD3DDevice == NULL)
    {
        return;
    }
 
 g_pD3DDevice->GetBackBuffer(0, D3DBACKBUFFER_TYPE_MONO, &base);
 
 base->GetDesc(&desc);
 
 if (g_pD3DDevice->CreateImageSurface(600, 450, desc.Format, &fond1) != D3D_OK)
    {
  return;
 
 }
 
 if (g_pD3DDevice->CreateImageSurface(400, 400, desc.Format, &calque) != D3D_OK)
    {
  return;
 
 }
 
 
    //Begin the scene
    g_pD3DDevice->BeginScene();
 
 if (D3DXLoadSurfaceFromFile(fond1, NULL, NULL, "c:\\fic1.jpg", NULL, D3DX_DEFAULT ,
    0, NULL) != D3D_OK)
 {
  return;
 
 }
 
 if (g_pD3DDevice->CopyRects(fond1, NULL, 0, base, NULL) != D3D_OK)
 {
  g_pD3DDevice->CopyRects(fond1, NULL, 0, base, NULL);
 }
 
 if (D3DXLoadSurfaceFromFile(calque, NULL, NULL, "c:\\test.jpg", NULL, D3DX_DEFAULT ,
    0xFFFF00FF, NULL) != D3D_OK)
 {
  return;
 
 }
 
 if (g_pD3DDevice->CopyRects(calque, NULL, 0, base, NULL) != D3D_OK)
 {
  g_pD3DDevice->CopyRects(calque, NULL, 0, base, NULL);
 }
 
    //End the scene
    g_pD3DDevice->EndScene();
     
 fond1->Release();
    //Filp the back and front buffers so that whatever has been rendered on the
    //back buffer will now be visible on screen (front buffer).
    g_pD3DDevice->Present(NULL, NULL, NULL, NULL);
}
 
et la je comprend pas pourquoi ca veut po marcher.

Reply

Marsh Posté le 02-04-2003 à 11:10:28    

titimanu a écrit :

voila ma fonction de rendu

Code :
  1. void Render()
  2. {
  3. (......)
  4. if (g_pD3DDevice->CopyRects(fond1, NULL, 0, base, NULL) != D3D_OK)
  5. {
  6.  g_pD3DDevice->CopyRects(fond1, NULL, 0, base, NULL); // :heink:
  7. }
  8. if (D3DXLoadSurfaceFromFile(calque, NULL, NULL, "c:\\test.jpg", NULL, D3DX_DEFAULT ,
  9.    0xFFFF00FF, NULL) != D3D_OK)
  10. {
  11.  return;
  12. }
  13. if (g_pD3DDevice->CopyRects(calque, NULL, 0, base, NULL) != D3D_OK)
  14. {
  15.  g_pD3DDevice->CopyRects(calque, NULL, 0, base, NULL);
  16. }
  17.     //End the scene
  18.     g_pD3DDevice->EndScene();
  19.    
  20. fond1->Release();
  21.     //Filp the back and front buffers so that whatever has been rendered on the
  22.     //back buffer will now be visible on screen (front buffer).
  23.     g_pD3DDevice->Present(NULL, NULL, NULL, NULL);
  24. }


et la je comprend pas pourquoi ca veut po marcher.


 
Moi je sais pourquoi ca marche pas ... Tu n'as pas lu la doc entièrement : au sujet de CopyRects :
 
Remarks
This method does not support stretch, color key, alpha blend, format conversion, or clipping of either source or destination rectangles. Note that this method will fail unless all the source rectangles and their corresponding destination rectangles are completely contained within the source and destination surfaces respectively. The format of the two surfaces must match, but they can have different dimensions.

 
donc pas de color keying avec du copyrects.
Par contre, tu peux utiliser d'autres fonctions qui se chargeront de faire le color keying pour toi (D3DXLoadSurfaceFromSurface() doit le faire si je ne m'abuse bien qu'elle soit assez lente ... Elle n'aime ni les filtres ni les changements de format de couleur ... J'ai refait moi même la conversion de couleur pour que ca aille plus vite, d'ailleurs ...)
 
Edit : Rajout de tags CPP ... plus lisible :D


Message édité par theshockwave le 02-04-2003 à 11:14:52

---------------
last.fm
Reply

Marsh Posté le 02-04-2003 à 12:06:32    

Justement j'ai lu la doc car dans la fonction DXLoadSurfaceFromFile si tu regarde je me sert du colorKeying et donc le copyrects ne me sert qu'a copier ma surface sur une autre sachant que j'ai deja traiter la transparence.

Reply

Marsh Posté le 02-04-2003 à 12:06:32   

Reply

Marsh Posté le 02-04-2003 à 12:32:08    

titimanu a écrit :

Justement j'ai lu la doc car dans la fonction DXLoadSurfaceFromFile si tu regarde je me sert du colorKeying et donc le copyrects ne me sert qu'a copier ma surface sur une autre sachant que j'ai deja traiter la transparence.


 
Oui, mais ton copyrects ne tient pas compte de la transparence ...
Il faut que tu fasses un D3DXLoadSurfaceFromSurface pour copier l'image contenue dans calque vers ton backbuffer(base), sinon, tu ne tiendras pas compte de la couleur transparente ...
 
Edit : Ce que tu fais, là, c'est que tu charges ton image en tenant compte de la couleur transparente ... C'est à dire que tu ne remplaces pas les pixels de la surface dest si le pixel remplaçant est magenta. Donc ... Il me semble que tu devrais préciser 0 pour le color Keying lors de ta fonction de chargement, mais préciser 0xFFFF00FF dans la fonction D3DXLoadSurfaceFromSurface qui te servira à copier ton calque dans le backbuffer ...


Message édité par theshockwave le 02-04-2003 à 12:37:34

---------------
last.fm
Reply

Marsh Posté le 02-04-2003 à 13:05:05    

tu devrais aussi ajouter un petit base->Release() car le GetBackBuffer ajoute une référence sur le backbuffer ... Enfin ... C'est si tu veux que ce soit propre ! ;)


---------------
last.fm
Reply

Marsh Posté le 02-04-2003 à 13:58:38    

Ok je vois ce que tu veux dire mais j'ai essayer et ca ne marche toujours pas. En fait au lieux de rendre ma surface transparente il remplace la couleur clé par du noir. Si tu as une idée elle sera la bienvenu. Ou si tu as un exemple (meme fait par d'autre méthode) ce serai cool. En fait ce que je veux faire c'est vraiment rendre transparente ma couleur clé.
 
Merci

Reply

Marsh Posté le 02-04-2003 à 14:26:36    

titimanu a écrit :

Ok je vois ce que tu veux dire mais j'ai essayer et ca ne marche toujours pas. En fait au lieux de rendre ma surface transparente il remplace la couleur clé par du noir. Si tu as une idée elle sera la bienvenu. Ou si tu as un exemple (meme fait par d'autre méthode) ce serai cool. En fait ce que je veux faire c'est vraiment rendre transparente ma couleur clé.
 
Merci


:heink:
 
C'est louche ...
 
Tu peux poster la nouvelle version de ton source STP ? (j'ai l'impression d'être chiant, avec ca ... :D)


---------------
last.fm
Reply

Marsh Posté le 02-04-2003 à 14:33:44    

Je parie que tu as laissé ta colorKey lors du D3DXLoadSurfaceFromFile ... Il ne faut pas ! Sinon, effectivement, il n'écrira jamais la couleur 0xFFFF00FF dans ton image, puisque tu lui dis que c'est une couleur transparente ...
 
Il faut que tu utilise la color key uniquement au moment où tu poses le calque sur le backbuffer ...


---------------
last.fm
Reply

Marsh Posté le 03-04-2003 à 02:24:03    

titimanu a écrit :

Salut,
G un petit pb avec directX8 et la transparence.
Je veux superposer deux images l'une sur l'autre. La premiere servant de fond et la seconde de calque.
Le but est qu'une partie de la seconde devienne transparente pour cacher la premiere. Seulement voila je n'arrive pas a la rendre transaprente.


 
Ben n'utilises pas copyrect
tu n'arriveras à rien comme ça..
 
Utilises ton calque comme une texture
et basta
 
LeGreg


---------------
voxel terrain render engine | animation mentor
Reply

Marsh Posté le 03-04-2003 à 09:41:16    

Salut,
 
Comment ca comme une texture. Il faut bien le copier sur le back buffer ou sur une surface pour l'afficher. J'ai même essayer de créer des sprites mais rien de mieux. Si tu peux me preciser comment en texture ce serai sympa.

Reply

Marsh Posté le 03-04-2003 à 16:03:42    

Me revoila encore une fois. Bon ca y est cette fois ma transparence marche mais g un autre problème. En fait cette fois ma texture est bien transparente sauf les couleur du dessin qui devrait rester sont transformer en noir. En gros en plus de ma transparence g aussi le mode ombre. Voila mon code :
 
 g_pD3DDevice->SetRenderState(D3DRS_ALPHABLENDENABLE,TRUE);
 g_pD3DDevice->SetRenderState(D3DRS_SRCBLEND,D3DBLEND_SRCALPHA);
 g_pD3DDevice->SetRenderState(D3DRS_DESTBLEND,D3DBLEND_INVSRCALPHA);
 g_pD3DDevice->SetRenderState(D3DRS_LIGHTING ,FALSE);
 //g_pD3DDevice->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_MODULATE);
 
 
    if(g_pD3DDevice == NULL)
    {
        return;
    }
 
 g_pD3DDevice->GetBackBuffer(0, D3DBACKBUFFER_TYPE_MONO, &base);
 
 base->GetDesc(&desc);
 
 if (g_pD3DDevice->CreateImageSurface(600, 450, desc.Format, &fond1) != D3D_OK)
    {
  g_pD3DDevice->CreateImageSurface(400, 400, desc.Format, &fond1);
 
 }
 
 if (g_pD3DDevice->CreateImageSurface(400, 400, desc.Format, &calque) != D3D_OK)
    {
  g_pD3DDevice->CreateImageSurface(400, 400, desc.Format, &calque);
 
 }
 
 
 //desc.Format = D3DFMT_A1R5G5B5;
 
    //Begin the scene
    g_pD3DDevice->BeginScene();
 
 if (D3DXLoadSurfaceFromFile(fond1, NULL, NULL, "c:\\visage.jpg", NULL, D3DX_DEFAULT ,
    0, NULL) != D3D_OK)
 {
  D3DXLoadSurfaceFromFile(fond1, NULL, NULL, "c:\\visage.jpg", NULL, D3DX_DEFAULT ,
    0, NULL);
 
 }
 
 if (g_pD3DDevice->CopyRects(fond1, NULL, 0, base, NULL) != D3D_OK)
 {
  g_pD3DDevice->CopyRects(fond1, NULL, 0, base, NULL);
 }
 
 
 if (D3DXCreateTextureFromFileEx(g_pD3DDevice, "c:\\test.bmp", 600,
    400,
    1, 0 , D3DFMT_UNKNOWN, D3DPOOL_DEFAULT, D3DX_FILTER_LINEAR,
    D3DX_FILTER_LINEAR, 0xFFFF00FF, NULL, NULL, &cheveux) != D3D_OK)
 {
  D3DXCreateTextureFromFile(g_pD3DDevice, "c:\\test.bmp", &cheveux);
 }
 
 
 BlitRect(g_pD3DDevice, cheveux, 0, 0, 600, 400, D3DFMT_UNKNOWN,1);  
 
 
    //End the scene
    g_pD3DDevice->EndScene();
     
 fond1->Release();
 base->Release();
    //Filp the back and front buffers so that whatever has been rendered on the
    //back buffer will now be visible on screen (front buffer).
    g_pD3DDevice->Present(NULL, NULL, NULL, NULL);
 
si kelkun peut m'aider merci d'avance

Reply

Marsh Posté le 03-04-2003 à 16:13:10    

C bon g enfin trouver.  
 
Merci a tous. Maintenant je peux vous expliquer comment faire si yen a ke ca interesse
 
++

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed