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)