[B2D] Echtzeit Transparenz

Übersicht BlitzBasic Codearchiv

Neue Antwort erstellen

ToeB

Betreff: [B2D] Echtzeit Transparenz

BeitragFr, Jun 20, 2008 21:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Also ich hab mal ne Kleine FUnction geschrieben, die ein Bild direct mit Trasparenz einzeichnet. Dabei wird jeder Pixel im Bild ausgelesen und dann den darunterliegenden Pixel im DRAWBUFFER. Dann werden beide Pixel gemischt, gemalt und das wars Smile

Hier das Bild braucht ihr :
user posted image

Hier die Function :

Parameter :
IMG% Arrow Bild das gemalt werden soll
XPOS% Arrow X-Position des Bildes (Linke obere Ecke)
YPOS% Arrow Y-Position des Bildes (Linke obere Ecke)
DRWABUFFER% Arrow Buffer auf der das Bild gemalt werden soll (Meistens Frontbuffer)
TRANS# Arrow Transparent von 0 - 1(klappt leider noch nicht so richtig...)

Code: [AUSKLAPPEN]
Function DrawTrans(IMG,XPOS,YPOS,DRAWBUFFER,TRANS#=1)
   Local BUFFER = ImageBuffer(IMG)
   Local WIDTH = ImageWidth(IMG)
   Local HEIGHT = ImageHeight(IMG)
   Local PIX[2]
   Local R[2],G[2],B[2]
   If TRANS > 1 Then TRANS = 1
   If TRANS < 0 Then TRANS = 0
   TRANS = (TRANS/0.33)/10
   If TRANS < 1
      LockBuffer BUFFER
      LockBuffer DRAWBUFFER
      For XX = 0 To WIDTH
         For YY = 0 To HEIGHT
            PIX[1] = ReadPixelFast(XPOS+XX,YPOS+YY,DRAWBUFFER)
            PIX[2] = ReadPixelFast(XX,YY,BUFFER)
            For I = 1 To 2
               R[I] = (PIX[I] And $FF0000) / $10000
               G[I] = (PIX[I] And $FF00  ) / $100
               B[I] = (PIX[I] And $FF    )
            Next
            R[0] = (R[0] + R[1] + R[2])*TRANS
            G[0] = (G[0] + G[1] + G[2])*TRANS
            B[0] = (B[0] + B[1] + B[2])*TRANS
            PIX[0] = 1*$1000000+R[0]*$10000+G[0]*$100+B[0]
            WritePixelFast(XPOS+XX,YPOS+YY,PIX[0],DRAWBUFFER)
         Next
      Next
      UnlockBuffer BUFFER
      UnlockBuffer DRAWBUFFER
   ElseIf TRANS = 1
      DrawImage IMG,XPOS,YPOS
   EndIf 
End Function


Hier Das Beispiel :

Code: [AUSKLAPPEN]
Graphics 800,600,16,2
SetBuffer BackBuffer()

Global FIRE = LoadImage("Fire.png"):MaskImage FIRE,1,2,3

Global FPS[2]

Color 255,255,255
TR# = 0

Repeat
   If FPS[0] <= MilliSecs()-999 Then FPS[2] = FPS[1]:FPS[1] = 0:FPS[0] = MilliSecs()
   If KeyHit(57)Color Rand(255),Rand(255),Rand(255)
   Rect 50,50,100,100
   If MouseDown(1) Then TR = TR + 0.01
   If MouseDown(2) Then TR = TR - 0.01
   If TR < 0 Then TR = 0
   If TR > 1 Then TR = 1
   DrawTrans(FIRE,MouseX()-50,MouseY()-50,FrontBuffer(),TR#)
   Text 1,1,"FPS:"+FPS[2]
   Text 1,20,"Transparenz : "+TR
   Flip
   Cls
   FPS[1] = FPS[1] + 1
Until KeyHit(1)
End


Man kann es leider aber noch nicht wirklich benutzen, da bei etwa 7-10 Trasparenten Bilderen die FPS in den Keller geht...

Na Egal, sagt auf jeden fall mal was ihr davon haltet ^^

mfg ToeB
Religiöse Kriege sind Streitigkeiten erwachsener Männer darum, wer den besten imaginären Freund hat.
Race-Project - Das Rennspiel der etwas anderen Art
SimpleUDP3.0 - Neuste Version der Netzwerk-Bibliothek
Vielen Dank an dieser Stelle nochmal an Pummelie, welcher mir einen Teil seines VServers für das Betreiben meines Masterservers zur verfügung stellt!

Eingeproggt

BeitragSa, Jun 21, 2008 0:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich halte den Ansatz nicht für Echtzeittauglich, aber für eher kleinere Sonderfälle durchaus brauchbar.
Ich würd sagen, du kannst dir jeweils eine Dimension in den R,G,B-Arrays sparen. [0] ist eig ohne Bedeutung.
Und die Sache mit Trans funktioniert meiner Meinung nach so:
R[1] = R[1] + R[2]*TRANS
(Nicht getestet und gleich ohne dem nullten Element)

mfG, Christoph.
Gewinner des BCC 18, 33 und 65 sowie MiniBCC 9
 

Matthias

BeitragSa, Jun 21, 2008 9:42
Antworten mit Zitat
Benutzer-Profile anzeigen
Hay.

Wenn mann schon Blitz3D benutzt gibt es viel einfache Wege Echtzeittransparenz zu erzeugen. Zb indem mann sich ein Quad macht. (2 Triangles).
Eine Alpha Textur drüber legt und fertig. Natürlich solte diese dann auch einen Alphakanal besitzen. zB png. Und nicht den TexturModus 2 vergessen. Das ist auf jedenfall Echtzeittauglicher als jeden Pixel dauernt neu zu berechnen. (Read/WritePixelFast)

Für den 2D Bereich gibt es schon lange ein recht schnelle Lösung.

https://www.blitzforum.de/foru...ransparenz

Mfg Matthias.

Plasma

Betreff: hmm

BeitragSa, Jun 21, 2008 12:09
Antworten mit Zitat
Benutzer-Profile anzeigen
da muss doch irgendwo noch ne dll sein die irgendjemand geschrieben hat und die eigendlich ziemlich schnell
war Wink

such mal im forum

Neue Antwort erstellen


Übersicht BlitzBasic Codearchiv

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group