Page 1 sur 1

Calculer la transparence entre deux sprites ou deux images

Publié : dim. 21/août/2005 17:50
par comtois
voila j'ai fait ce code pour tester

Pour mes essais , j'ai fait deux sprites , et ensuite je tente de les mélanger pour en créer un troisème qui devrait être le résultat de la transparence du second sur le premier.

Si je mets 0 ou 255 en paramètre de la fonction transparence() je vois bien soit l'un , soit l'autre, je peux donc supposer que ce n'est pas un problème d'adresse puisque les sprites se recopient bien dans le troisième ?

Par contre si je mets une autre valeur , par exemple 155 , alors là j'ai un écran noir !

Quelqu'un s'est déjà amusé à faire ce genre de calcul ?
avec succès ?
Bref je suis sec, si quelqu'un a une idée pour me débloquer ,je suis preneur .

Code : Tout sélectionner

InitSprite()
InitKeyboard()
OpenScreen(800,600,32,"Transparence")

Structure s_pixel
	P1.b
	P2.b
	P3.b
	P4.b
EndStructure

#SpriteA=0
#SpriteB=1
#SpriteC=2


CreateSprite(#spriteA,800,600,#PB_Sprite_Memory)
CreateSprite(#spriteB,SpriteWidth(#SpriteA),SpriteHeight(#SpriteA),#PB_Sprite_Memory)
CreateSprite(#spriteC,SpriteWidth(#SpriteA),SpriteHeight(#SpriteA),#PB_Sprite_Memory)

 StartDrawing(SpriteOutput(#spriteA))
 Box(0,0,800,600,RGB(0,0,255))
 StopDrawing()
 
StartDrawing(SpriteOutput(#spriteB))
 Box(0,0,800,600,RGB(255,255,255))	
 Box(200,200,200,200,RGB(255,0,0))
StopDrawing()
		
Procedure Transparence(trans)
	Protected *PtrA.s_pixel
	Protected *PtrB.s_pixel
	Protected *PtrC.s_pixel
	
	StartDrawing(SpriteOutput(#spriteA))
		*memA=DrawingBuffer()
		Pitch=DrawingBufferPitch()
		Format=#PB_PixelFormat_32Bits_BGR
	StopDrawing()

	StartDrawing(SpriteOutput(#spriteB))
		*memB=DrawingBuffer()
	StopDrawing()
	
	StartDrawing(SpriteOutput(#spriteC))
		*memC=DrawingBuffer()
	StopDrawing()
	
	;Principe de la transparence 

	;Le sprite C = le résultat de la fondue entre le sprite A et le Sprite B	
	;Valeur exacte
	;CouleurC = (alphaB couleurB + (((255 - alphaB) alphaA CouleurA)/255))/255
	
	;Plus rapide mais moins exacte
	;CouleurC = (alphaB couleurB + (((255 - alphaB) alphaA CouleurA)>>8)) >>8

	AlphaB=255-trans
	AlphaA=trans
	
	For pos=0 To (800+600*pitch) Step 4
		*PtrA=*memA + pos
		*PtrB=*memB + pos 
		*PtrC=*memC + pos 
	
		*PtrC\P1 = (alphaB * *PtrB\P1 + (((255-alphaB)*alphaA * *PtrA\P1)/255))/255
		*PtrC\P2 = (alphaB * *PtrB\P2 + (((255-alphaB)*alphaA * *PtrA\P2)/255))/255
		*PtrC\P3 = (alphaB * *PtrB\P3 + (((255-alphaB)*alphaA * *PtrA\P3)/255))/255
			
			
	Next pos
	
EndProcedure
I=0
Repeat
FlipBuffers()
ClearScreen(0,0,0)
;Si je mets 0 ou 255 , je vois bien l'un des deux sprites, sinon c'est tout noir 
Transparence(0)
DisplaySprite(#SpriteC,0,0)
ExamineKeyboard()

Until KeyboardPushed(#PB_Key_Escape)

Publié : dim. 21/août/2005 18:47
par djes
Mmmm. M'étonnerait pas qu'il y ait un problème de débordement...

Publié : dim. 21/août/2005 19:15
par comtois
Youpi j'ai trouvé !!!

Où avais-je la tête ? j'ai oublié que les bytes sont signés :?
Maintenant, ça fonctionne parfaitement :)
Il me reste à améliorer la vitesse .

Code : Tout sélectionner

		*PtrC\P1 = (alphaB * *PtrB\P1 & $FF + (((255-alphaB)*alphaA * *PtrA\P1 & $FF)>>8))>>8
		*PtrC\P2 = (alphaB * *PtrB\P2 & $FF + (((255-alphaB)*alphaA * *PtrA\P2 & $FF)>>8))>>8
		*PtrC\P3 = (alphaB * *PtrB\P3 & $FF + (((255-alphaB)*alphaA * *PtrA\P3 & $FF)>>8))>>8
je vais essayer en faisant lerendu directement à l'écran sans passer par un autre sprite !