Probleme d'affichage avec BitBlt()
Forum Programmation : Probleme d'affichage avec BitBlt()
Voila, j'arrive facilement à manipuler l'affichage, j'utilise la plateforme GDI, donc BitBlt() et tout ca, mais quand j'utilise avec cette fonction un raster-op comme par exemple SRCAND, le résultat est bizarre.
Je la soubsonne de faire l'opération sur chaque byte de l'image au lieux de les prendre 3 à 3 (je suis en couleurs 24 bits), c-à-d pixel par pixel comme elle devrait le faire.
Comme s'est pas super claire je vais illustrer:
Image source:
Image destination:
Code (en simplifié):
Creation de la fenêtre:
hDC = GetDC( hWnd );
hBufferDC = CreateCompatibleDC( hDC );
hTamponDC = CreateCompatibleDC( hBufferDC );
hBitmapScreen = CreateBitmap( gpGlobals->iScreenWidth, gpGlobals->iScreenHeight, 1, 24, NULL );
SelectObject( hBufferDC, hBitmapScreen );
Dessin de la frame:
BitBlt( hBufferDC, x, y, width, height, hTamponDC, 0, 0, SRCAND );
BitBlt( hDC, 0, 0, gpGlobals->iScreenWidth, gpGlobals->iScreenHeight, hBufferDC, 0, 0, SRCCOPY );
Résultat désiré:
Résultat obtenu:
Sur le dessin ca a l'air d'aller sur certaines couleur comme le vert, mon dégrader noir vers blanc devien un gros tas de toutes les couleurs!
Merci de votre aide et si vous avez besoin de plus de détails ou de code source n'hésitez pas
le SRCAND fait un masque binaire ET
par exemple:
11110001 AND 01010101 = 01010001
Toi, si j'ai compris, tu veux faire baisser la luminosité selon le dégradé :
composante finale = composante initiale * couleur degradé / 256
C'est même différent du fading.
81F900FA750230EDBADA03ECA80875FBECA808
74FBE4603C0175DFB80300CD10B8004CCD21
Répondre à CRicky
Dans ce cas-ci s'est bien ca, mais j'utilise les raster-op pour d'autre effets et j'ai bien compris le principe de relation Pat, Destination, Source, j'arrive à le manipuler mais il me fait tjs des trucs bisares comme si les couleur saturait ou si tout à coup il affichait les pixels selon une palette.
Ce systeme est parfait pour ce que je veux faire, s'est domange qu'il ne fonctionne pas...
ça fonctionne, ça fait bien ce que c'est sensé faire (qui n'a aucun rapport avec ce que tu veux faire). Si tu fait un masque ET, ça ne fait pas du tout ce que tu espère.
ça ne fonctionne que pour les couleurs en 2^n.
Justement l'exemple que je te donne montre bien que faire un masque ET ne peut pas s'appliquer pour tous les cas.
pour le "/ 256", un décalage de bits suffit, mais pour la multiplication, il faut l'appliquer pour chaque composante de chaque pixel.
Je crois que la fonction Bitblt ne permet pas de faire ce que tu veux faire. Tu peux toujours le faire en faisant une opération pixel par pixel (en optimisant au maximum).
81F900FA750230EDBADA03ECA80875FBECA808
74FBE4603C0175DFB80300CD10B8004CCD21
Répondre à CRicky
Je suis passe en DirectDraw parce que j'ai vu des fonctions qui permette de d'appliquer des effets. Tout fonctionne, j'ai entierment converti le code d'affichage ac DirectDraw MAIS des que je veux appliquer un effet ca ne marche pas de nouveau. Pourtant j'ai vu des miliers de programmes qui font ce genre d'effets donc je dois pouvoir y arriver aussi.
J'ai essaye de faire moi-meme le code d'affichage pour la transparence mais du coup c'est le prcesseur qui calcule et s'est trop lent pour moi, s'est le travail de la carte graphique quand meme.
Personne sait me dire comment afficher une image avec un simple clef de transparence dison 50%, par exemple. Ca doit pas etre sorcier...
Bon voila, avec DirectDraw j'aurais toujours pu chercher il gere pas l'alpha bending en 2D (en 3D oui, completement fous!!!), j'ai lu sa:
"Alpha and Z Values
Opacity and depth values are not currently supported in DirectDraw blits. If alpha values are stored in the pixel format, they simply overwrite any alpha values in the destination rectangle. Values from alpha buffers and z-buffers are ignored. The members of the DDBLTFX structure that have to do with alpha channels and z-buffers (members whose names begin with "dwAlpha" and "dwZ" ), and the corresponding flags for Blt, are not used. The same applies to the DDBLTFX_ZBUFFERBASEDEST and DDBLTFX_ZBUFFERRANGE flags in the dwDDFX member of the DDBLTFX structure."
Pourtant mon hardware gere l'alpha bending vu que j'arrive a en faire avec OpenGL en 3D mais j'ai pas envie de passer par la 3D, j'en ai pas besoin et ca va me faire perdre de la stablilite et de la vitesse. Ce que jveux dire s'est que si il est capable de faire l'operation, il doit bien y avoir une fonction qui gere l'alpha bending qui existe?
S'il vous plait aidez-moi sa fait des lustre que je suis bloquer a cause de sa!
Utilise une vrai API qui gère l'alpha blending comme SDL
http://lazyfoo.net/SDL_tutorials/lesson27/index.php
81F900FA750230EDBADA03ECA80875FBECA808
74FBE4603C0175DFB80300CD10B8004CCD21
Répondre à CRicky
Ok merci, mais d'apres ce que j'ai lu SDL ne gere pas l'apha bending par le hardware ce qui veut dire que s'est assez lent et puis j'ai deja fait un projet ac SDL et j'aimerais bien m'en passe ce coup-ci.
Bon sinon une autre solution serait que je puisse demander a la carte graphique d'effectuer des calcule, genre une partie de mon code qui serait envoye au processeur graphique plutot. Est-ce possible en C++?
Pcq plein de programe gere la transparence donc je pourrais aussi... Les autres programes le font quand meme par hardware...
Il te faut utiliser la 3D pour ça, sinon il faut chercher une solution propre à ta carte graphique. Si tu lances un contexte 3D, tu ne peux pas utiliser l'alpha blending?
Tu peux aussi utiliser les registres MMX (dans le CPU, pas la carte graphique) pour faire les calculs rapidement.
http://www.google.fr/search?hl=fr& [...] ogle&meta=
81F900FA750230EDBADA03ECA80875FBECA808
74FBE4603C0175DFB80300CD10B8004CCD21
Répondre à CRicky
Merci CRicky, la technologie a l'air interessante, je penses que je vais l'exploiter.
T'es sur que sans contexte 3D on peut pas faire d'alpha bending par carte graphique
Quelqu'un pourai me proposer un tuto sur l'affichage ac AlphaBending en context 3D ac DirectX?
http://www.riaz.de/tutorials/d3d.html
Regarde le tuto 11
81F900FA750230EDBADA03ECA80875FBECA808
74FBE4603C0175DFB80300CD10B8004CCD21
Répondre à CRicky
Merci!
J'ai un probleme ac les tutos DirectX que je telecharge, quand je compile le source, j'ai des tas d'erreurs, pcq je pense, mon SDK DirectX a pas la bonne version. Par exemple les type de donnee finissent par 7, sur le mien jamais. C'est l'edition August 2007. Quelqu'un pourait me dire ou telecharger le bon SDK?
Il y a 1964 utilisateurs connus et inconnus. Pour voir la liste des connectés connus, cliquez ici.
