schatten vorher berechnen....
Übersicht

![]() |
dimasterBetreff: schatten vorher berechnen.... |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() wär froh wenn ihr eure ideen wie ich das lösen könnte posten würdet mfg dimaster |
||
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() mfg dimaster |
||
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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... |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group