Votre question

Probleme d'affichage avec BitBlt()

Tags :
  • Pixel
  • Programmation
Dernière réponse : dans Programmation
18 Juillet 2007 21:38:23

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

Autres pages sur : probleme affichage bitblt

a b L Programmation
18 Juillet 2007 22:13:54

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.
18 Juillet 2007 23:11:17

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...
Contenus similaires
a b L Programmation
19 Juillet 2007 19:28:41

ç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).
2 Décembre 2007 16:46:06

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...
5 Décembre 2007 10:49:22

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!
6 Décembre 2007 12:27:59

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...
7 Décembre 2007 12:17:31

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
31 Décembre 2007 13:07:13

Quelqu'un pourai me proposer un tuto sur l'affichage ac AlphaBending en context 3D ac DirectX?
3 Janvier 2008 19:39:19

Merci!
3 Janvier 2008 21:56:16

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?
Tom's guide dans le monde
  • Allemagne
  • Italie
  • Irlande
  • Royaume Uni
  • Etats Unis
Suivre Tom's Guide
Inscrivez-vous à la Newsletter
  • ajouter à twitter
  • ajouter à facebook
  • ajouter un flux RSS