[BB]2D-Alpha mit dem Befehl "Alphaimage"

Übersicht BlitzBasic Codearchiv

Neue Antwort erstellen

Christoph

Betreff: [BB]2D-Alpha mit dem Befehl "Alphaimage"

BeitragMo, Aug 14, 2006 15:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Was bringt der Befehl?
Ich habe eine Funktion für 2D alpha.
Diese funktioniert wie Drawblock, mit dem Unterschied, dass noch ein 4. Parameter angegeben wird: der Alphawert.

Syntax:
Alphaimage bild,x-position,y-position,alpha#
Für alpha wird wie von 3D gewohnt ein Wert zwischen 0 (unsichtbar) und 1(sichtbar) angegeben.

Das Prinzip:
Jeder Punkt aus dem Bild und auf dem Buffer werden ausgelesen und ein Zwischenwert wird errechnet.

Hier die Funktion:
Code: [AUSKLAPPEN]
Function Alphaimage(bi,x,y,a#)
   If a#=0 Then Return
   If a#=1 Then DrawBlock bi,x,y:Return
   w=ImageWidth(bi)
   h=ImageHeight(bi)
   LockBuffer BackBuffer()
   LockBuffer ImageBuffer(bi)
      For i=x To x+w-1
         For j=y To y+h-1
            rgb=ReadPixelFast(i,j,BackBuffer())
            r=(rgb And $FF0000)/$10000
            g=(rgb And $FF00)/$100
            b=rgb And $FF
            rgb2=ReadPixelFast(i-x,j-y,ImageBuffer(bi))
            r2=(rgb2 And $FF0000)/$10000
            g2=(rgb2 And $FF00)/$100
            b2=rgb2 And $FF
            r=r+(r2-r)/(1/a#)
            g=g+(g2-g)/(1/a#)
            b=b+(b2-b)/(1/a#)
            rgb=r*$10000 + g*$100 + b   
            WritePixelFast(i,j,rgb,BackBuffer())
         Next
      Next
   UnlockBuffer ImageBuffer(bi)
   UnlockBuffer BackBuffer()
End Function


Im Code wird die Funktion ganz normal aufgerufen, hier ein Beispiel:

Code: [AUSKLAPPEN]
Graphics 800,600,32,2
SetBuffer BackBuffer()
SeedRnd MilliSecs()

;Bild1
Bild=CreateImage(50,50)
Bild2=CreateImage(50,50)

SetBuffer ImageBuffer(Bild)
Color Rand(0,255),Rand(0,255),Rand(0,255):Rect 0,0,50,50
SetBuffer ImageBuffer(Bild2)
Color Rand(0,255),Rand(0,255),Rand(0,255):Rect 0,0,50,50
SetBuffer BackBuffer()
r=1
Repeat
   Cls
   If r=1 Then a#=a#+0.01:If a#>1 Then a#=1:r=0
   If r=0 Then a#=a#-0.01:If a#<0 Then a#=0:r=1   
   DrawImage  Bild,0,0
   AlphaImage Bild2,25,25,a#
   Flip
Until KeyDown(1)


Function Alphaimage(bi,x,y,a#)
   If a#=0 Then Return
   If a#=1 Then DrawBlock bi,x,y:Return
   w=ImageWidth(bi)
   h=ImageHeight(bi)
   LockBuffer BackBuffer()
   LockBuffer ImageBuffer(bi)
      For i=x To x+w-1
         For j=y To y+h-1
            rgb=ReadPixelFast(i,j,BackBuffer())
            r=(rgb And $FF0000)/$10000
            g=(rgb And $FF00)/$100
            b=rgb And $FF
            rgb2=ReadPixelFast(i-x,j-y,ImageBuffer(bi))
            r2=(rgb2 And $FF0000)/$10000
            g2=(rgb2 And $FF00)/$100
            b2=rgb2 And $FF
            r=r+(r2-r)/(1/a#)
            g=g+(g2-g)/(1/a#)
            b=b+(b2-b)/(1/a#)
            rgb=r*$10000 + g*$100 + b   
            WritePixelFast(i,j,rgb,BackBuffer())
         Next
      Next
   UnlockBuffer ImageBuffer(bi)
   UnlockBuffer BackBuffer()
End Function


Es ist nicht das Schnellste aber wenigstens etwas.
  • Zuletzt bearbeitet von Christoph am Fr, Aug 18, 2006 19:13, insgesamt einmal bearbeitet

aMul

Sieger des Minimalist Compo 01/13

BeitragMo, Aug 14, 2006 16:46
Antworten mit Zitat
Benutzer-Profile anzeigen
Gabs schon öfter, aber Hauptsache es funktioniert Wink
Panic Pong - ultimate action mashup of Pong and Breakout <= aktives Spiele-Projekt, Downloads mit vielen bunten Farben!
advASCIIdraw - the advanced ASCII art program <= aktives nicht-Spiele-Projekt, must-have für ASCII/roguelike/dungeon-crawler fans!
Alter BB-Kram: ThroughTheAsteroidBelt - mit Quelltext! | RGB-Palette in 32²-Textur / Farbige Beleuchtung mit Dot3 | Stereoskopie in Blitz3D | Teleport-Animation Screensaver
 

Florian

BeitragFr, Aug 18, 2006 14:50
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo

Ich die Funktion eigenlich ganz nett, aber bei mir ist leider ein Fehler aufgetaucht.

Immer wenn ich das Programm im Fenstermodus starte, dann sehe ich am rechten Rand des Alphaimage nicht korrekt dargestellte Pixel.
Der Fehler tritt aber nur im Fenstermodus auf.

Blitz3D 1.96
Blitz3D 1.97
Blitz3D 1.98

WinXP SP2
Grafikkarte: NVIDIA GeForce4 MX 440 With AGP8X

MfG

Florian

d-bug

BeitragFr, Aug 18, 2006 17:07
Antworten mit Zitat
Benutzer-Profile anzeigen
ändere

Code: [AUSKLAPPEN]
Function Alphaimage(bi,x,y,a#)
   If a#=0 Then Return
   If a#=1 Then DrawBlock bi,x,y:Return
   w=ImageWidth(bi)
   h=ImageHeight(bi)
   LockBuffer BackBuffer()
   LockBuffer ImageBuffer(bi)
      For i=x To x+w

...

nach

Code: [AUSKLAPPEN]
Function Alphaimage(bi,x,y,a#)
   If a#=0 Then Return
   If a#=1 Then DrawBlock bi,x,y:Return
   w=ImageWidth(bi)
   h=ImageHeight(bi)
   LockBuffer BackBuffer()
   LockBuffer ImageBuffer(bi)
      For i=x To x+w-1    ;<------------------------------ geändert

...

dann sollte es funktionieren

Christoph

BeitragFr, Aug 18, 2006 19:14
Antworten mit Zitat
Benutzer-Profile anzeigen
Sry, ich habe nicht die richtige Version gepostet, bei mir auf dem PC war's richtig.
Arrow Editiert

(bei y wars ja richtig!)

Triton

BeitragFr, Aug 18, 2006 20:10
Antworten mit Zitat
Benutzer-Profile anzeigen
Funktioniert, aber ist ganz schön langsam - bei mir 1 FPS.

Meine alte Funktion ( https://www.blitzforum.de/foru...p?p=153116 )
schafft beim gleichen Bild immerhin 4 FPS.
Eine verschnellerte Function (habe ich dort ergänzt) sogar 16 FPS.
Coding: silizium-net.de | Portfolio: Triton.ch.vu

Christoph

BeitragFr, Aug 18, 2006 20:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Die schau ich mir mal an, danke.

Wer diese 2D-Alpha-geschichten in "Echtzeit" braucht kommt ohne 3D-Grafikkarte schlecht weg Wink

Neue Antwort erstellen


Übersicht BlitzBasic Codearchiv

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group