Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1423 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  Transparence avec directX8

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Transparence avec directX8

n°348784
titimanu
Posté le 01-04-2003 à 09:50:26  profilanswer
 

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 :)

mood
Publicité
Posté le 01-04-2003 à 09:50:26  profilanswer
 

n°348895
theshockwa​ve
I work at a firm named Koslow
Posté le 01-04-2003 à 11:25:20  profilanswer
 

: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

n°348904
titimanu
Posté le 01-04-2003 à 11:31:05  profilanswer
 

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

n°349274
theshockwa​ve
I work at a firm named Koslow
Posté le 01-04-2003 à 15:52:38  profilanswer
 

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
n°349452
Tetragramm​aton IHVH
dieu unique => pensée unique
Posté le 01-04-2003 à 17:40:15  profilanswer
 

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
n°349494
theshockwa​ve
I work at a firm named Koslow
Posté le 01-04-2003 à 17:55:35  profilanswer
 

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
n°349752
titimanu
Posté le 02-04-2003 à 09:32:48  profilanswer
 

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.

n°349788
titimanu
Posté le 02-04-2003 à 09:53:11  profilanswer
 

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.

n°349894
theshockwa​ve
I work at a firm named Koslow
Posté le 02-04-2003 à 11:10:28  profilanswer
 

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
n°350013
titimanu
Posté le 02-04-2003 à 12:06:32  profilanswer
 

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.

mood
Publicité
Posté le 02-04-2003 à 12:06:32  profilanswer
 

n°350042
theshockwa​ve
I work at a firm named Koslow
Posté le 02-04-2003 à 12:32:08  profilanswer
 

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
n°350064
theshockwa​ve
I work at a firm named Koslow
Posté le 02-04-2003 à 13:05:05  profilanswer
 

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
n°350105
titimanu
Posté le 02-04-2003 à 13:58:38  profilanswer
 

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

n°350127
theshockwa​ve
I work at a firm named Koslow
Posté le 02-04-2003 à 14:26:36  profilanswer
 

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
n°350135
theshockwa​ve
I work at a firm named Koslow
Posté le 02-04-2003 à 14:33:44  profilanswer
 

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
n°350865
LeGreg
Posté le 03-04-2003 à 02:24:03  profilanswer
 

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
n°350942
titimanu
Posté le 03-04-2003 à 09:41:16  profilanswer
 

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.

n°351698
titimanu
Posté le 03-04-2003 à 16:03:42  profilanswer
 

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

n°351734
titimanu
Posté le 03-04-2003 à 16:13:10  profilanswer
 

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


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  Transparence avec directX8

 

Sujets relatifs
de la transparence sur un bouton ?!!!png généré par php, transparence et browser
transparenceExpert de XFree , comment faire de la transparence ?
collision avec directX8[VC++ MFC] Comment faire de la transparence avec bitblt ?
Probleme OPENGL , affichage des couleurs en non transparence[flash] effet de transparence sur un champ text dynamique?
PHP : images truecolor et transparenceGestion de transparence sous delphi
Plus de sujets relatifs à : Transparence avec directX8


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR