Environment-Bumpmapping mit BB2D von ???
Hi @all,

ich hab mal einen Beispielcode für Environment-Bumpmapping, schauts euch einfach selber an. Zum Testen würde ich euch folgendes Bild empfehlen:

[img:aa9ec2953e]http://home.arcor.de/tasky/daten/bb.jpg[/img:aa9ec2953e]

Hier der Code:

[code:1:aa9ec2953e]
Graphics 640, 480, 32, 1
SetBuffer BackBuffer()

;Bilddatei einladen
imgTest = LoadImage("bb.jpg")

;Phong erstellen und in einer Bank sichern (256 * 256 Pixel)
bankLiteMap = createBumpPhong(256)

;Bilddaten in eine Bank transferieren
bankHeightMap = initBumpBankScreen(0, 0, 640, 480, imgTest)

;eingeladene Bild wird nicht mehr gebraucht => Speicher wird freigegeben
FreeImage(imgTest)

;Wird für die Berechnung der FPS benötigt
at = MilliSecs()

;Hauptschleife (wird beendet, wenn eine Taste betätigt wird)
While GetKey() = 0
;Bildschirm löschen (drawBankScreenBump zeichnet nur notwendige Pixel)
Cls

;Koordinaten für Lichtquelle
x = MouseX()
y = MouseY()

;BUMPMAPPING
drawBankScreenBump(0, 0, x, y, bankHeightMap, bankLiteMap)

;FPS-Berechnung
frame = frame + 1
If MilliSecs() - at => 1000
at = MilliSecs()
fps = frame
frame = 0
End If
Text 0, 0, "FPS: " + fps

Flip False
Wend

;Alle Banks wieder freigeben

FreeBank(bankLiteMap)
FreeBank(bankHeightMap)

End

;Funktion : createBumpPhong(mapSize)
; Erzeugt Environment-Map, welche Lichtwerte enthält und speichert diese in einer Bank
;Parameter: mapSize -> Seitenlänge eines 2D-Quadrats, welches die Lichtinformation speichert
; Damit kann die Größe des Phong angegeben werden
;Rückgabe : Bank mit den darin enthaltenen Lichtinformationen
Function createBumpPhong(mapSize)
Local x, y
Local nX#, nY#, nZ#, lv#
Local bankLiteMap

bankLiteMap = CreateBank(2 + mapSize * mapSize)
PokeShort(bankLiteMap, 0, mapSize)

For y = 0 To mapSize - 1
For x = 0 To mapSize - 1
nX# = (Float(x - (mapSize Shr 1))) / Float(mapSize Shr 1)
nY# = (Float(y - (mapSize Shr 1))) / Float(mapSize Shr 1)
nZ# = 1 - Sqr(nX# * nX# + nY# * nY#)
If nZ# < 0 nZ# = 0
lv# = 92 * nz# * nz# + 128 * nZ# * nZ# * nZ# * nZ# * nZ#
PokeByte(bankLiteMap, 2 + y * mapSize + x, Int(lv#))
Next
Next

Return bankLiteMap
End Function

;Funktion : initBumpBankScreen(x, y, width, height, image)
; Transferiert die Bildinformation in eine Bank, in der die Informationen wesentlich schneller verarbeitet werden können
;Parameter: x -> X-Startkoordinate des Bildausschnitts
; y -> Y-Startkoordinate des Bildausschnitts
; width -> Breite des Bildausschnitts
; height -> Höhe des Bildausschnitts
; image -> Handle des Bildes
;Rückgabe : Bank mit den darin enthaltenen Bildinformationen
Function initBumpBankScreen(x, y, width, height, image)
Local xc, yc, i
Local r, g, b, c
Local iw, ih, ib
Local bankHeightMap

iw = ImageWidth(image) - 1
ih = ImageHeight(image) - 1
ib = ImageBuffer(image)

If width <= 0 Or height <= 0 Return 0
If x > iw Or y > ih Return 0
If x < 0
width = width + x
x = 0
End If
If y < 0
height = height + y
y = 0
End If
If (x + width - 1) > iw width = width + iw - x
If (y + height - 1) > ih height = height + ih - y

bankheightMap = CreateBank(width * height + 4)
PokeShort(bankHeightMap, 0, width)
PokeShort(bankHeightMap, 2, height)

width = width - 1
height = height - 1

i = 4

LockBuffer ib
For yc = y To y + height
For xc = x To x + width
c = ReadPixelFast(xc, yc, ib)
c = (((c Shr 16) And $FF) + ((c Shr 8) And $FF) + (c And $FF)) / 3
PokeByte(bankHeightMap, i, c)
i = i + 1
Next
Next
UnlockBuffer ib

Return bankHeightMap
End Function

;Funktion : drawBankScreenBump(xPos, yPos, xLight, yLight, bankHeightMap, bankLiteMap, mapSize)
; Stellt das Bild mit Environment-Bumpmapping dar
;Parameter: xPos -> X-Koordinate im Bildschirm
; yPos -> Y-Koordinate im Bildschirm
; xLight -> X-Koordinate des Lichtes
; yLight -> Y-Koordinate des Lichtes
; bankHeightMap -> Bank mit den Bildinformationen
; bankLiteMap -> Bank mit den Lichtinformationen
;Rückgabe : Keine
Function drawBankScreenBump(xPos, yPos, xLight, yLight, bankHeightMap, bankLiteMap)
Local xc, yc, nX, nY, mh
Local width, height, i, j
Local cv, c, d, e
Local gw, gh

mh = mapSize Shr 1

width = PeekShort(bankHeightMap, 0)
height = PeekShort(bankHeightMap, 2)
mapSize = PeekShort(bankLiteMap, 0)
iw = width
ih = height

ype = yPos
If xPos + width > GraphicsWidth() iw = GraphicsWidth() - xPos
If yPos < 0
ype = 0
End If
If (yPos + height) > GraphicsHeight() ih = GraphicsHeight() - yPos

iw = iw - 3
ih = ih - 3
xPos = xPos + 1
yPos = yPos + 1

LockBuffer
For yc = yPos To yPos + ih
i = 4 + (yc - yPos + 1) * width
j = 0
For xc = xPos To xPos + iw
Select j
Case 0
c = PeekInt(bankHeightMap, i - 1)
d = PeekInt(bankHeightMap, i + width)
e = PeekInt(bankHeightMap, i - width)
nX = mh + ((c Shr 16) And $FF) - (c And $FF) - xc + xLight
nY = mh + (d And $FF) - (e And $FF) - yc + yLight
Case 1
nX = mh + ((c Shr 24) And $FF) - ((c Shr 8) And $FF) - xc + xLight
nY = mh + ((d Shr 8) And $FF) - ((e Shr 8) And $FF) - yc + yLight
Case 2
c = (c Shr 16) Or (PeekShort(bankHeightMap, i + 3) Shl 16)
nX = mh + ((c Shr 16) And $FF) - (c And $FF) - xc + xLight
nY = mh + ((d Shr 16) And $FF) - ((e Shr 16) And $FF) - yc + yLight
Case 3
nX = mh + ((c Shr 24) And $FF) - ((c Shr 8) And $FF) - xc + xLight
nY = mh + ((d Shr 24) And $FF) - ((e Shr 24) And $FF) - yc + yLight
i = i + 4
j = -1
End Select

j = j + 1
If nX >= 0
If nX < mapSize
If nY >= 0
If nY < mapSize
If xc >= 0
If yc >= 0
cv = PeekByte(bankLiteMap, 2 + nY * mapSize + nX)
WritePixelFast xc, yc, (cv Shl 16) Or (cv Shl 8) Or cv
End If
End If
End If
End If
End If
End If
Next
Next
UnlockBuffer
End Function
[/code:1:aa9ec2953e]

mfg tasky
===
von ???
Hi,
ich hab es eben mal getestet und habe bemerkt das es auch Schnell ist. Gute Arbeit. :)

MfG ShadowTurtle
===
von ???
ich seh nur schwarz mit 3 fps...
===
von ???
bei mir auch...aber immerhin 50 fps
===
von ???
ach sorry, hab ich vergessen zu sagen: mouse noch bewegen, am besten in richtung mitte
===
von ???
Sieht gut aus.
Übrigens für die bei denen es langsam läuft:
DEBUG AUS!
===
von ???
Ich hab auch einen BumpMappingCode bei mir rumliegen(ist nicht von mir)
Ich glaube an meinem kann man auch leichter verstehen wie BumpMapping funktioniert
Man kann dasgleiche Bild verwenden aber da nur eine Auflösung von 320*200 eingestellt ist sieht man nicht das ganze Bild

[code:1:61afcf5dce]Graphics 320,200,16

Dim LightMap(255,255)
Dim Bump(320,200)

SetBuffer BackBuffer()

Image=LoadImage ("bb.jpg")
DrawImage Image,-50,-120
;DrawImage Image,0,0

FreeImage Image

LockBuffer BackBuffer()
For n=0 To 319
For m=0 To 199
Bump(n,m)=ReadPixelFast (n,m) And 255
Next
Next
UnlockBuffer BackBuffer()
Cls

CreateLightMap

mx=160
my=100
xdir=4
ydir=-4

While Not KeyDown(1)
xxx=MouseX()
yyy=MouseY()
bumpmap(xxx,yyy)


mx=mx+xdir
my=my+ydir
If (mx<0) Or (mx>319) xdir=-xdir
If (my<0) Or (my>199) ydir=-ydir

Flip
Wend

End

Function CreateLightMap()
For i#=0 To 255
For j#=0 To 255
nx#=(i-128)/128
ny#=(j-128)/128
nz#=1-Sqr(nx^2+ny^2)
If nz<0 nz=0
LightMap(i,j)=Int(nz*256)
Next
Next
End Function

Function BumpMap(lightx,lighty)
LockBuffer BackBuffer()
For i=1 To 318
For j=1 To 198
t=bump(i,j)
nx=Bump(i-1,j)-Bump(i+1,j)
ny=Bump(i,j-1)-Bump(i,j+1)

lx=i-lightx
ly=j-lighty

nx=(nx-lx)+128
ny=(ny-ly)+128

If (nx<0) Or (nx>255) Then nx=0
If (ny<0) Or (ny>255) Then ny=0

WritePixelFast(i,j,LightMap(nx,ny))

Next
Next
UnlockBuffer BackBuffer()
End Function[/code:1:61afcf5dce]
===
von ???
@tasky
WOW!!! Nicht schlecht.
Ich komme bis auf 60 Fps wenn ich in der mitte bin.
===
von ???
Sieht geil aus ... mit meiner TNT 2 aber nur 19 FPS in der Mitte :?
===
von ???
Habe 134 FPS max und in der Mitte knapp 90 :)
===
von ???
Ein Wort ... nein, zwei: [b:81273aae76]verdammte Axt[/b:81273aae76]!!!

Extrem kewl! Shockshit, das Teil läuft so sauber und schnell, das ist einfach wundergeil... Mehr braucht man da, denke ich mal, nicht zu sagen! :D
===
von ???
bei mir lässt sich die maus kurz bewegen, dann rührt sich nix mehr.
===
von ???
bei mir gehts einwandfrei...sieht perfekt aus...respect!
===
von ???
Yo, ein feines Stück Code ... mal probieren ob sich das auch auf Texturen in 3D mit echten Lichtquellen anwenden läßt.
===
von ???
jo... ist echt nen cooler code!
===
Super Algorithmus !!! von ???
Wow, man ist der code schnell - Bin richtig beeindruckt :lol:
===
von ???
Hm irgendwie klappt das bei mir nicht...

Hab nur 1Fps...
An meinem Rechner liegt das wohl eher nicht..
1,5 GHz
GF 4 Ti4400
256MB Ram

Ich will das auch schneller haben... sieht aber auch mit 1Fps
schon richtig geil aus...
===
von ???
Hi!
Kannst Du vieleicht mal ein Example hochladen? Habe nur ein hässliches
Bild gefunden, das geht, alles andere bleibt wie es ist :?
Ansonsten sehr schnell bei mir
mfg olli
===
von ???
Sieht echt geil aus!

@Rowdy: Bist du sicher, dass du den Debugger ausgeschalten hast?
===
von ???
hi
Estmals geeeeiiil..

[quote:1f50a5a75b="Apocalyptic"]Sieht echt geil aus!

@Rowdy: Bist du sicher, dass du den Debugger ausgeschalten hast?[/quote:1f50a5a75b]
JAdu kannst dem debugger ausschalten 100%
Cu
MAUPA
===
von ???
Türlich bin ich mir sicher :?
===
von ???
läuft super,
zwischen 63 und 80 Frames.
AMD 1600+XP
526 MB PC133
TI4200 64MB
Win98SE
===
von ???
[quote:1a950b4031="Rowdy"]Türlich bin ich mir sicher :?[/quote:1a950b4031]

Komisch... Ich hab so um die 65 Fps bei einem ähnlichen Rechner...
===
von ???
*keuch*

bin aus dem staunen garnicht mehr rausgekommen
knapp 40 fps, cool



Suche:
(unterstützt mySQL Wildcards ala %)
Titel:
Text:
Autor: