Code: Alles auswählen
; Datei zum wandeln von Image zu Sprite
TempDatei$ = GetTemporaryDirectory()+"TempAlphaImage0815.png"
; Puffer für 2 Screenshots
Dim Bitmap(1, $FF, $FF)
; Image-Plugins
UsePNGImageDecoder()
UsePNGImageEncoder()
; Initialisierungen und Fenster/Screen
InitSprite()
InitSprite3D()
OpenWindow(0,0,0,256,256,"Alpha")
OpenWindowedScreen(WindowID(0),0,0,WindowWidth(0),WindowHeight(0),0,0,0)
; Temporäre Images erstellen/zeichnen
For Image = 0 To 1
CreateImage(Image,256,256,32)
StartDrawing(ImageOutput(Image))
DrawingMode(#PB_2DDrawing_AllChannels) ; <- nicht bei Sprites möglich
For i = 0 To 255
Box(i, 0, 1, 256, RGBA($FF*Image, $FF*(1-Image), 0, i))
Next
StopDrawing()
Next
; Images zu Sprites wandeln
For i = 0 To 1
SaveImage(i,TempDatei$,#PB_ImagePlugin_PNG,0,32)
FreeImage(i)
LoadSprite(i,TempDatei$,#PB_Sprite_Texture|#PB_Sprite_AlphaBlending)
DeleteFile(TempDatei$)
Next i
; Zielsprite erstellen (für das Endprodukt)
CreateSprite(2,256,256,#PB_Sprite_Texture|#PB_Sprite_AlphaBlending)
; 3D-Sprites erstellen
For i = 0 To 2
CreateSprite3D(i,i)
Next i
; 3D-Sprite drehen (Zufallswinkel)
RotateSprite3D(0,Random(360),#PB_Absolute)
RotateSprite3D(1,Random(360),#PB_Absolute)
; 2 mal Sprites anzeigen und Screenshots machen
For i = 0 To 1
ClearScreen($FFFFFF * i)
Start3D()
DisplaySprite3D(0,0,0)
DisplaySprite3D(1,0,0)
Stop3D()
StartDrawing(ScreenOutput())
For y = 0 To $FF
For x = 0 To $FF
Bitmap(i,x,y) = Point(x,y)
Next
Next
StopDrawing()
Next i
; Zielsprite zeichnen (wieder über Image-Umweg)
CreateImage(0,256,256,32)
StartDrawing(ImageOutput(0))
DrawingMode(#PB_2DDrawing_AllChannels) ; <- nicht bei Sprites möglich
For y = 0 To $FF
For x = 0 To $FF
; Farbdifferenzen Screenshot 1 und 2
n = Bitmap(1,x,y) - Bitmap(0,x,y)
a = n >> 0 & $FF
b = n >> 8 & $FF
c = n >> 16 & $FF
; Max. Differenz als Tansparenz (= ~Alpha)
If a>b And a>c
trans = a
ElseIf b>c
trans = b
Else
trans = c
EndIf
; Plotten
Plot(x, y, (~trans)<<24 | Bitmap(0,x,y))
;Plot(x, y, ~trans<<24 | Bitmap(0,x,y)) ; <- "Überlauf" dank x64-Integer oder was?!
Next
Next
StopDrawing()
SaveImage(0,TempDatei$,#PB_ImagePlugin_PNG,0,32)
FreeImage(0)
LoadSprite(2,TempDatei$,#PB_Sprite_Texture|#PB_Sprite_AlphaBlending)
DeleteFile(TempDatei$)
; Screen mit Pixelrauschen füllen (damit man den Alphakanal besser erkennt)
; und das Endprodukt (Sprite 2) darüber anzeigen.
StartDrawing(ScreenOutput())
For y = 0 To $FF
For x = 0 To $FF
Plot(x,y,Random($FFFFFF))
Next
Next
StopDrawing()
Start3D()
DisplaySprite3D(2,0,0)
Stop3D()
FlipBuffers() ; <- Erster und einziger Puffertausch!
Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow