schatten vorher berechnen....

Übersicht BlitzBasic Blitz3D

Neue Antwort erstellen

dimaster

Betreff: schatten vorher berechnen....

BeitragDi, Feb 21, 2006 0:01
Antworten mit Zitat
Benutzer-Profile anzeigen
hallo,

ich weiss, dass ähnliche fragen schon viele male gestellt wurden, bin aber nicht auf eine gute lösung für mein problem gestossen.

also ich hab jezt ein terrain und möchte vor dem start der hauptschleife alle schatten berechnet haben, es sollen also nicht live schatten sein. jetzt weiss ich einfach nicht wie anfangen...

das problem ist, da es sehr viele objekte sind, sollten diese schatten möglichst FPS freundlich sein
Wink

wär froh wenn ihr eure ideen wie ich das lösen könnte posten würdet

mfg dimaster

hectic

Sieger des IS Talentwettbewerb 2006

BeitragDi, Feb 21, 2006 1:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich habe das bei Terrains so gemacht...

1. Über die "Highmap.bmp" ein Emboss-Relief-Filter gelegt.
2. Dem Bild einen recht hohen Kontrasst ausgesetzt.
3. Heligkeit soweit hoch gedreht, bis nur noch der Mittelwert und der 'Schatten' zu sehen war.
4. Kontrast soweit angepasst, daß die nicht abzudunkelnden Stellen Weiß sind.
5. Dem Bild (bedingt durch die vielen Kontrastwerten, entstehen kaum noch weiche Übergänge zwischen Schatten und nicht Schatten) ein extremen Weichzeichner zB den Gausischen verpasst.
6. Das Bild negiert.

Dieses nun verarbeitete Bild dann als zweite Textur komplett auf das gesammte Terrain gelegt. Die herabfallende Seiten erscheinen nun Dunkel.

Das Problem bei der ganzen Sache ist, daß das Gefühl nicht los wurde das der Schatten irgendwie 'zu Früh' anfing mit dem dunkler werden!?! Somit habe ich mir mein eigenes Programm geschrieben, welches Highmap-Bilddateien mit einem Schatten versetzt. Und dieses Bild dann auf die gesammte Terrain gelegt. Sah viel besser aus. Würde auch den Code bereit stellen, wenn ich ihn noch hätte...

/EDIT1: In einigen Fällen reicht es aus nur Punkt 1 und 2 durchzugehen... Manchmal sogar bessere Ergebnisse! Mußt du mal selber schauen, wie es für dich besser passt... Mir fällt eben auch ein, daß man sich eine eigene Routine schreiben könnte die sich aus der Highmap dann per CreateTexture und TextureBuffer ein solches Bild beim laden selbst erstellt. Ähnlich wie bei meinem 'verschollenem' Code, nur per Runtime...

/EDIT2: Falls du auch 'Schlagschatten' haben willst, dann geht es nicht mit Emboss/Relief! Aber eine eigene Routine zu schreiben ist nicht schwer, die das dann auch kann...

dimaster

BeitragDi, Feb 21, 2006 12:10
Antworten mit Zitat
Benutzer-Profile anzeigen
hmmm stimmt is ja eigentlich ganz einfach:
hab ne funktion die eine textur 512*512 erstellt dann wird errechnet, wo die objekte auf dem terrain btw. auf der textur dann sind die schatten werfen, dann nurnoch die textur über das terrain ziehen und schon sind die schatten da:D sieht recht gut aus. ich denke mal so hast dus gemeint oder? naja danke für den tipp Very Happy

mfg dimaster

hectic

Sieger des IS Talentwettbewerb 2006

BeitragDi, Feb 21, 2006 13:30
Antworten mit Zitat
Benutzer-Profile anzeigen
So habe mich mal hingesetzt und ein simples Programm geschrieben, welches aus einer Highmap ein Schattenbild mit Schlagschatten erstellt. Um bessere Ergebnisse zu erziehlen empfielt sich der Highmap erstmal ein Blur zu verpassen (ausserdem macht dies ein Spiel auch schneller!!!). Dann den Code mit der Highmap zu starten... Auch wenn der Code so simpel ist, bin ich echt beeindruckt wie geil das zT aussieht...Code: [AUSKLAPPEN]
Graphics 512,512,0,2
SetBuffer FrontBuffer()

hm%=0;Highmap Höheninformation
lf#=0;Lichtfall für Schattenberechnung
la#=0;Alter Lichteinfall(Winkel)
fa#=0;Errechnete Farbe

ls#=2;Lichtfall-Geschwindigkeit [User-Variabel]
kt#=3;Kontrast [User-Variabel]

name1$=Input$("Highmap Dateiname: ")
name2$=Input$("Shadow Dateiname: ")

bild1=LoadImage(name1)
ix%=ImageWidth(bild1)
iy%=ImageHeight(bild1)
DrawImage bild1,0,0

bild2=CreateImage(ix,iy)

;---- --- -- - -  -   -    -

For y=0 To iy-1
la=0
lf=0

 For x=0 To ix-1
  hm=ReadPixel(x+1,y-1) And $FF

  la=lf
  If lf>hm lf=lf-ls Else lf=hm
  fa=ATan2(lf-la+ls,1)*kt
  If fa>255 fa=255
  If fa<0 fa=0

  SetBuffer ImageBuffer(bild2)
   Color fa,fa,fa
   Plot x,y
  SetBuffer FrontBuffer()
 Next
Next

save=SaveImage(bild2,name2)

End

dimaster

BeitragDi, Feb 21, 2006 14:55
Antworten mit Zitat
Benutzer-Profile anzeigen
hmm ich hät eher an sowas gedacht:
Code: [AUSKLAPPEN]

Graphics3D 640,480,16,1
SetBuffer BackBuffer()

terrain = CreateTerrain(512)
MoveEntity terrain,-256,0,-256

cube = CreateCube()
RotateEntity cube,22,22,22
MoveEntity cube,0,50,0
ScaleEntity cube,20,20,20

cone = CreateCone()
RotateEntity cone,10,20,14
MoveEntity cone,-100,100,20
ScaleEntity cone,10,10,10

texture1=CREATETEXTURE(128,128)
SETBUFFER TEXTUREBUFFER(texture1)
COLOR 255,0,0
OVAL 0,0,128,128,1
SETBUFFER BACKBUFFER()

cam = CreateCamera()
RotateEntity cam,80,0,0
MoveEntity cam,0,256,-100

EntityTexture terrain,texture1

tex1 = CreateTexture(512,512)
cam1 = CreateCamera()
ShowEntity cam1
MoveEntity cam1,0,265,0
RotateEntity cam1,90,0,0
RenderWorld
CopyRect 0,0,512,512,0,0,backbuffer(),texturebuffer(tex1)
HideEntity cam1
ScaleTexture tex1,512,512
EntityTexture terrain,tex1

SetBuffer BackBuffer()

While Not KeyHit(1)
MoveEntity cam,0,0,1

RotateEntity cam,EntityPitch(cam)+MouseYSpeed(),EntityYaw(cam)-MouseXSpeed(),0

Cls
UpdateWorld()
RenderWorld()
Flip
Wend



muss natürlich noch perfektioniert werden, zb. müsste man da das weisse noch schwarz machen...

mfg dimaster

EDIT: hmm vielleicht eine idee wie ich nur die schatten auf die textur kriege und sie durchsichtig mache? bzw. wie ich mache, dass sie wie schatten aussehen?(is ne sehr schlechte lösung aber sehr frame freundlich und da es das sein muss dachte ich ich probiers mal... aber jetzt eben wie mach ich dass das so aussieht wie schatte...

Neue Antwort erstellen


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group