DrawTranslucidImage() - durch Bank "viel" schnelle

Übersicht BlitzBasic Codearchiv

Neue Antwort erstellen

 

Kekskiller

Betreff: DrawTranslucidImage() - durch Bank "viel" schnelle

BeitragSa, Sep 25, 2004 21:53
Antworten mit Zitat
Benutzer-Profile anzeigen
So Leute, ich hatte vorhin einen Geistesblitz und hab das bis jetzt mit
Abstand geilste von mir erschaffen, eine Bild-Zeichnen-Funktion mit
Transparenzangabe Smile ! Hat eine einfache Bedienung und eine interessantees
und schnelles system. Ich weiß garnicht, was ich dazu sagen soll, seht
euch einfach an. Ich finde meine Schöpfung einfach: Shocked !

EDIT: Unten ist ein schnellerer Code, als der obrige...

BlitzBasic: [AUSKLAPPEN]
;DrawTranslucidImage() - Transparente Bilder darstellen
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
;Funktion by Kekskiller. Bei Verwendung bitte Credit
;oder ähnliches nicht vergessen.


;DrawTranslucidImage(Bild,Maskierung,X,Y,Transparenz,CenterX,CenterY)
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
;Bild - Identität eines geladenen/erstellten Bildes
;Maskierung - Farbwert der Maskierung, Alphawert muss mit angegeben werden, sprich FF vor Wert
;X - X-Koordinate
;Y - Y-Koordinate
;Transparenz - Geht von 0(unsichtbar) bis 1(vollkommen sichtbar). Kommawerte dazwischen sind entsprechend transparent
;CenterX - X-Zentrierung
;CenterY - Y-Zentrierung

;Anmerkung
;~~~~~~~~~
;Die Funktionen Degree#(), ExtractRed(), ExtractGreen() und ExtractBlue() habe Bequehmlichkeitshalber
;ein gebaut. Man könnte sie zwar mit reinschreiben, doch das würde die Übersicht schwinden und die Größe
;steigern lassen.


;Initialisierunng
Graphics 640,480,16,1
SetBuffer BackBuffer()

;Bild laden
Temporary=LoadImage("testmonster.bmp"); <- hier Bildname$ einfügen
Global PictureHexMask=$FFFFFFFF; Maskierung fürs Beispiel

;Variablen festlegen
Global TranslucidDown=0,Translucid#=0; Beispielvariablen


;Hauptschleife
ClsColor 255,255,255
Repeat
Cls
mx=MouseX()
my=MouseY()
Select TranslucidDown
Case 0
Translucid#=Translucid#+0.01
If Translucid#>=1 Then TranslucidDown=1:Translucid=1
Case 1
Translucid#=Translucid#-0.01
If Translucid#<=0 Then TranslucidDown=0:Translucid=0
End Select
temp=ImageWidth(Temporary)/2
DrawTranslucidImage Temporary,PictureHexMask,mx-temp,my-temp,Translucid#
DrawTranslucidImage Temporary,PictureHexMask,mx,my,Translucid#
DrawTranslucidImage Temporary,PictureHexMask,mx+temp,my+temp,Translucid#
Color 0,0,0
Flip
Delay 10
Until KeyHit(1)
End


;Funktionen
;~~~~~~~~~~
Function DrawTranslucidImage(picture,maskcolor,ox,oy,t#,centerx=0,centery=0)
in=ImageBuffer(picture)
out=GraphicsBuffer()
pw=ImageWidth(picture)-1
ph=ImageHeight(picture)-1
gw=GraphicsWidth()-1
gh=GraphicsHeight()-1
If CenterX=1 Then ox=ox-pw/2
If CenterY=1 Then oy=oy-ph/2
LockBuffer in
LockBuffer out
For y=0 To ph
For x=0 To pw
If ox+x>=0 And oy+y>=0 And ox+x<=gw And oy+y<=gh Then

ipx=ReadPixelFast(x,y,in)
If ipx<>maskcolor Then
opx=ReadPixelFast(ox+x,oy+y,out)

ored=ExtractRed(opx)
ogre=ExtractGreen(opx)
oblu=ExtractBlue(opx)

ired=ExtractRed(ipx)
igre=ExtractGreen(ipx)
iblu=ExtractBlue(ipx)

If ored<ired Then
fred=ored+Degree#(ored,ired)*t#
ElseIf ored>ired Then
fred=ired+Degree#(ored,ired)*t#
ElseIf ored=ired Then
fred=ored
EndIf

If ogre<igre Then
fgre=ogre+Degree#(ogre,igre)*t#
ElseIf ogre>igre Then
fgre=igre+Degree#(ogre,igre)*t#
ElseIf ogre=igre Then
fgre=ogre
EndIf

If oblu<iblu Then
fblu=oblu+Degree#(oblu,iblu)*t#
ElseIf oblu>iblu Then
fblu=iblu+Degree#(oblu,iblu)*t#
ElseIf oblu=iblu Then
fblu=oblu
EndIf

fpx=fred*$10000+fgre*$100+fblu
WritePixelFast ox+x,oy+y,fpx,out
EndIf

EndIf
Next
Next
UnlockBuffer in
UnlockBuffer out
End Function

Function Degree#(v1#,v2#)
Local bigger,out#
If v2#>v1# bigger=2
If v1#>v2# bigger=1
Select bigger
Case 0:out#=0
Case 1:out#=v1#-v2#
Case 2:out#=v2#-v1#
End Select
Return out#
End Function

Function ExtractRed(col)
o=(col And $FF0000)/$10000
Return o
End Function

Function ExtractGreen(col)
o=(col And $FF00)/$100
Return o
End Function

Function ExtractBlue(col)
o=col And $FF
Return o
End Function


Mann, ich bin sowas von happy deswegen, das glaubt ihr garnicht!
Endlich mal was gescheites vom Mürbegebäck Twisted Evil !
  • Zuletzt bearbeitet von Kekskiller am So, Sep 26, 2004 19:39, insgesamt 4-mal bearbeitet

Triton

BeitragSo, Sep 26, 2004 3:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich hab bei nem 250x350 bild ganze 3 fps - so schnell oder besonders ist es also nicht Wink


(Athlon 64 3400+, Radeon9800pro) Rolling Eyes
Coding: silizium-net.de | Portfolio: Triton.ch.vu

soli

BeitragSo, Sep 26, 2004 3:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Ausser einem schwarzen Bildschirm,
hat es bei mir noch nichts gemacht,
könnte das bei einem P3-900 noch
etwas dauern?
solitaire

Kabelbinder

Sieger des WM-Contest 2006

BeitragSo, Sep 26, 2004 17:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Hey, ganze Leistung.
Ist glaube ich das erste Mal, das man in Blitzbasic 2D sowas wie 'n Transparenzwert benutzen kann.
Ich hab bisher immer nur so Sachen mit Halbdurchsichtig geschafft.

Aber für Echtzeit Sachen ist das glaub ich zu langsam.
<Wing Avenger Download> ◊◊◊ <Macrophage Download>
 

Dreamora

BeitragSo, Sep 26, 2004 18:10
Antworten mit Zitat
Benutzer-Profile anzeigen
Das kann und wird so nie funktionieren.
Da ist ein Dual LockBuffer, das killt die Hardware.
Um es schnell zu machen, schreibst du am besten noch ein

"LoadTranslucideImage( path$)" welches die Bilddaten in eine Bank ladet und den Bankhandle zurück gibt und dann übergibt man diesen Bankhandle an DrawTranslucideImage. Dann müsste es beträchtlich schneller sein.

Lockbuffer ist etwas was auf PreShader karten allgemein sehr auf die Performance schlägt, bei 2 Buffern gleichzeitig verabschiedet sich dann alles.

Hoffe du kannst mit der Idee das System zu ungeahnten Höhenflügen bringen Smile
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.
 

Kekskiller

BeitragSo, Sep 26, 2004 18:14
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn man so große Bilder nimmt, ist es ja auch kein Wunder...
Transparenz kann man eben nicht realtime bekommen, wenn man
es direkt in Blitz-Code ntegriert. Und zu der Sache mit langsamen
Pc's: Ich habe einen Pentium I, und bei mir läuft für solch ein Unterfangen schon sehr schön. Man kann damit zum Beispiel prima Sprites oder so
einfärben, Schatten in entsprechender Farbe vom Original machen und
mit angegebener Transparenz drüberziehen. Schon hat man ein
eingetöntes Bild.

@Triton: Für mich ist das schon ganz schön schnell Very Happy .
Ne, ist jetzt nicht sooo schnell, aber immerhin hab ichs hinbekommen ^_^ !

@Soli: Hm, komisch. Bei mir funktioniert alles eingbahnfrei.
Falls du Blitz2D und nicht Plus, oder 3D hast, dann leigt es wohl
daran, dass du bei den Maskierungen den Alpha-Wert entfernen
musst. Der ist meines Wissens beim alten Blitz2D nicht dabei.

@Draemora: Hey, gute Idee. Werde ich gleich mal ausprobieren.
Wusste nicht, dass Locken und Unlocken soviel runterzieht...
Werds mal so machen.
 

Apocalyptic

BeitragSo, Sep 26, 2004 18:32
Antworten mit Zitat
Benutzer-Profile anzeigen
Kekskiller hat Folgendes geschrieben:
@Soli: Hm, komisch. Bei mir funktioniert alles eingbahnfrei.
Falls du Blitz2D und nicht Plus, oder 3D hast, dann leigt es wohl
daran, dass du bei den Maskierungen den Alpha-Wert entfernen
musst. Der ist meines Wissens beim alten Blitz2D nicht dabei.


Ab Version 1.53 ist der Alphakanal vorhanden und bei mir funktionierts auch mit B2D.
Suum cuique

[ www.ffs-net.de.vu ] [ Raycaster ]
 

Kekskiller

BeitragSo, Sep 26, 2004 18:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Dann hats wohl mit dem doppelten Lockbuffer zu tun.
Bin gleich fertig...
 

Kekskiller

BeitragSo, Sep 26, 2004 19:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Tada, jetzt ist es wirklich einige mal schneller.
Habs mal auch mit Tricorns großem Bild ausprobiert, waren vorher wirklich
so wenig... Jetzt sind einige Frames mehr als vorher, auf jeden Fall mehr 10...
BlitzBasic: [AUSKLAPPEN]
;TranslucidImage - by Kekskiller
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
;DrawTranslucidImage(Bank,MaskRed,MaskGreen,MaskBlue,X,Y,Transparency#,CenterX=0,CenterY=0)
; - draws an image form a bank
;
;LoadTranslucidImage(file$)
; - loads an image file in to a bank
;
;ConvertImageToTranslucid(picture)
; - converts an image to a image bank

Graphics 640,480,16,1
SetBuffer BackBuffer()
ClsColor 255,255,255

Temporary=LoadTranslucidImage("testmonster.bmp")

Global TranslucidDown=0,Translucid#=0
Global bwx,BW,oldZeit

Repeat
Cls
mx=MouseX()
my=MouseY()
Select TranslucidDown
Case 0
Translucid#=Translucid#+0.01
If Translucid#>=1 Then TranslucidDown=1:Translucid#=1
Case 1
Translucid#=Translucid#-0.01
If Translucid#<=0 Then TranslucidDown=0:Translucid#=0
End Select
DrawTranslucidImage(Temporary,255,255,255,mx,my,Translucid#,1,1)
bwx=bwx+1:If MilliSecs()>oldZeit+999 Then BW=bwx:bwx=0:oldZeit=MilliSecs()
Color 0,0,0
Text 1,1,BW
Flip
Until KeyHit(1)

End

Function DrawTranslucidImage(bank,mred,mgre,mblu,ox,oy,t#,centerx=0,centery=0)
out=BackBuffer()
pw=PeekByte(bank,0)
ph=PeekByte(bank,1)
gw=GraphicsWidth()-1
gh=GraphicsHeight()-1
If centerx=1 Then ox=ox-pw/2
If centery=1 Then oy=oy-ph/2
z=2
LockBuffer out
For y=0 To ph
For x=0 To pw
If ox+x>=0 And oy+y>=0 And ox+x<=gw And oy+y<=gh Then

ired=PeekByte(bank,z):z=z+1
igre=PeekByte(bank,z):z=z+1
iblu=PeekByte(bank,z):z=z+1

If ired<>mred Or igre<>mgre Or iblu<>mblu Then
opx=ReadPixelFast(ox+x,oy+y,out)

ored=ExtractRed(opx)
ogre=ExtractGreen(opx)
oblu=ExtractBlue(opx)

If ored<ired Then
fred=ored+Degree#(ored,ired)*t#
ElseIf ored>ired Then
fred=ired+Degree#(ored,ired)*t#
ElseIf ored=ired Then
fred=ored
EndIf

If ogre<igre Then
fgre=ogre+Degree#(ogre,igre)*t#
ElseIf ogre>igre Then
fgre=igre+Degree#(ogre,igre)*t#
ElseIf ogre=igre Then
fgre=ogre
EndIf

If oblu<iblu Then
fblu=oblu+Degree#(oblu,iblu)*t#
ElseIf oblu>iblu Then
fblu=iblu+Degree#(oblu,iblu)*t#
ElseIf oblu=iblu Then
fblu=oblu
EndIf

fpx=fred*$10000+fgre*$100+fblu
WritePixelFast ox+x,oy+y,fpx,out
EndIf

Else
z=z+3
EndIf
Next
Next
UnlockBuffer out
End Function

Function LoadTranslucidImage(file$)
picture=LoadImage(file$)
pw=ImageWidth(picture)-1
ph=ImageHeight(picture)-1
bnk=CreateBank(2+((pw+1)*(ph+1))*3)
in=ImageBuffer(picture)
PokeByte bnk,0,pw
PokeByte bnk,1,ph
z=2
LockBuffer in
For y=0 To ph
For x=0 To pw
ipx=ReadPixelFast(x,y,in)
ired=ExtractRed(ipx)
igre=ExtractGreen(ipx)
iblu=ExtractBlue(ipx)
PokeByte bnk,z,ired:z=z+1
PokeByte bnk,z,igre:z=z+1
PokeByte bnk,z,iblu:z=z+1
Next
Next
UnlockBuffer in
FreeImage picture
Return bnk
End Function

Function ConvertImageToTranslucid(picture)
pw=ImageWidth(picture)-1
ph=ImageHeight(picture)-1
bnk=CreateBank(2+((pw+1)*(ph+1))*3)
in=ImageBuffer(picture)
PokeByte bnk,0,pw
PokeByte bnk,1,ph
z=2
LockBuffer in
For y=0 To ph
For x=0 To pw
ipx=ReadPixelFast(x,y,in)
ired=ExtractRed(ipx)
igre=ExtractGreen(ipx)
iblu=ExtractBlue(ipx)
PokeByte bnk,z,ired:z=z+1
PokeByte bnk,z,igre:z=z+1
PokeByte bnk,z,iblu:z=z+1
Next
Next
UnlockBuffer in
Return bnk
End Function

Function Degree#(v1#,v2#)
Local bigger,out#
If v2#>v1# bigger=2
If v1#>v2# bigger=1
Select bigger
Case 0:out#=0
Case 1:out#=v1#-v2#
Case 2:out#=v2#-v1#
End Select
Return out#
End Function

Function ExtractRed(col)
o=(col And $FF0000)/$10000
Return o
End Function

Function ExtractGreen(col)
o=(col And $FF00)/$100
Return o
End Function

Function ExtractBlue(col)
o=col And $FF
Return o
End Function


LoadTranslucidImage$(file$)
Läd ein Bild aus einer Datei in eine Bank.

ConvertImageToTranslucid$(picture)
Konvertiert ein bereits im Speicher zu einer Bank um.

DrawTranslucidImage(bank,mred,mgre,mblu,ox,oy,t#,centerx=0,centery=0)
Gibt das Bank-Bild auf dem Bildschirm aus. mred, mgre und mblu sind die
Maskierungswerte für Rot, Grün und Blau.


Soweit hätte ich da jetzt keine Idee, was man da noch so dran werkeln
könnte... Würde sagen, das ist erstmal fertig Smile . Zumindest ist es etwas,
aber wie immer nicht für Realtime... Egal, werde ich mal ne Dll draus
machen, falls ich mal wieder überflüssig viel Zeit habe Wink ...
  • Zuletzt bearbeitet von Kekskiller am So, Sep 26, 2004 21:09, insgesamt 2-mal bearbeitet
 

Dreamora

BeitragSo, Sep 26, 2004 20:06
Antworten mit Zitat
Benutzer-Profile anzeigen
Da hats noch was kleines was eventuell helfen könnte

out = Graphicsbuffer()

-> vielleicht durch out = BackBuffer() ersetzen und das programm auf 2 buffer basis laufen lassen ...
dadurch kann die grafikkarte überschüssige zeit für vorberechnen neuer daten verwenden.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.
 

Kekskiller

BeitragSo, Sep 26, 2004 20:19
Antworten mit Zitat
Benutzer-Profile anzeigen
Juchu, noch ein paar Fps mehr ^_^ !
Danke, Draemora, dank dir ist daraus noch was ersnthaftes geworden.
Jetzt muss ichnur noch eine Verwendung dafür finden Very Happy !

Neue Antwort erstellen


Übersicht BlitzBasic Codearchiv

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group