Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Fr Mär 29, 2024 15:04

Foren-Übersicht » DGL » News
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 8 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: [OPENGL] Sonneschein?
BeitragVerfasst: Fr Jun 02, 2006 12:23 
Offline
Fels i.d. Brandung
Benutzeravatar

Registriert: Sa Mai 04, 2002 19:48
Beiträge: 3827
Wohnort: Tespe (nahe Hamburg)
Phobeus: Diese News wurde als IOTW von Al eingesandt. Wenn jemand von Euch ebenfalls ein interessantes Bild hat, möge er mir dieses (am besten mit kleinen Text) zusenden. Bitte beachtet, dass das Bild komplett und in voller Größe erst nach einem Klick angezeigt wird.
---
Bild

Vor einiger Zeit hab ich mal für ein Spiel, das ich mit Tomok schreibe, ein wenig mit Wolken experimentiert und da die Jungs von X-Dream ja nach Ideen für Skydomes gefragt haben, dachte ich mir schick ich das hier einfach noch mal als IOTW ab.

Auf den Bildern sieht man einen kompletten Tagesablauf. Gerendert wird das ganze mit einem Skydome, mit einer Sternentextur, über die tagsüber eine Textur mit den Himmelsfarben geblendet wird (s. http://www.geocities.com/ngdash/whitepapers/skydomecolor.html). Darüber kommt eine Textur mit Wolken und darüber ganz normales Lensflare und Lichstrahlen.
Das Erstellen der Wolkentextur, insbesondere des Shadings, dass sich der bewegten Sonne anpasst und dafür sorg, dass die Wolken räumlich wirken, ist das eigentlich Interessante und richtet sich nach einem Gamedev Thread, über den ich mal gestolpert bin: http://www.gamedev.net/community/forums/topic.asp?topic_id=86024

Zunächst benötigt man das übliche Plasma. Wie man das erstellt, ob Perlin Noise, Fraktal oder Fault und dessen Derivate, is denke ich egal. Ich benutze einen Perlin Noise über Splines, aber der hier im Wiki beschriebene Weg sollte auch gehen. Als nächstes wird das Plasma in gewohnter Weise bearbeitet, also erstmal Wolkenlücken schaffen:
Code:
  1.  
  2. For i := 0 to High(Noise) do
  3. begin
  4.     Noise[i] := Noise[i] - Coverage; // Coverage = 0.0 für geschlossene Wolkendecke, Coverage = 1.0 für frien Himmel
  5.     if Noise[i] < 0.0
  6.     then
  7.         Noise[i] := 0.0;
  8. end;
  9.  

Eventuell nachträglich noch auf den Bereich 0..1 zurück Skalieren. Um Kontrolle über die Schärfe der Wolken zu bekommen, wird das ganze noch durch ne Exponentialfunktion gewurstet:
Code:
  1.  
  2. For i := 0 to High(Noise) do
  3.     ExpNoise[i] := 1 - Power(Sharpness, Noise[i] * 300.0); // 0.0 <= Sharpness <= 1.0
  4.  

Wichtig ist, dass man sich auch das andere Array verwahrt, weil mit ExpNoise das Shading nicht so schön aussieht. Mit ExpNoise haben wir nun schon mal die Transparenz des Cloud-layers, denn da wo keine Wolken sind, soll man ja den Himmel sehen.

So nun zum eigentlich interessanten, dem Shading:
Das Shading kann man eigentlich als Raytracing durch das 2.5D Voxel Noisemap ansehen. Je größer der Wert an der Stelle, desto dicker die Wolke. Von der Sonne aus geht man durch alle Felder des Arrays, die zwischen der Sonne und dem jeweiligen Pixel liegen, und guckt, ob ein Strahl von der Sonne durch einen Wolkenfetzen abgeschwächt wird.
Bild
Weshalb man aus der Sonne eine lokale Lichtquelle und nicht eine unendlich weit entfernte Lichtquelle mit parallel einfallenden Lichtstrahlen macht, hat einen guten Grund. Wolken, die am Horizont liegen) sieht man mehr von der Seite, die der Sonne zugewandt (und heller) ist. Obwohl eine Wolke in der Realität einen gut durchleuchteten Rand und ein dicken dunkleren Klotz in der Mitte hat, sieht man nur die einem zugewandte Seite "leuchten", die hintere seite wird verdeckt. Um diesen Effekt in der flachen Textur irgendwie hereinzufaken wird die Sonne dicht über den Wolken platziert. Steht die Sonne im Zenit, wird nur die dem Zentrum zugewandte Seite beleuchtet, und die Wolken wirken räumlich.

Das ist es dann im Grunde auch schon, wenn man nur eine feststehende Wolkentextur erzeugen will. Will man aber die Sonne in Echtzeit bewegen können (was in RPGs ja schon Standard ist), dann muss man noch ein wenig optimieren.
Zunächst einmal muss das Shading bei weitem keine so große Auflösung haben, wie die Alpha-maske. 1/4 der ExpNoise Auflösung reichen dicke, und 1/8 ist denke ich auch ganz ok.
Als nächstes muss man ja nicht die Beleuchtung der Wolkenzwischenräume also der freien Stellen am Himmel berechnen. Damit es keine Interpolationsprobleme gibt, sollte man auch die Beleuchtung für die vollständig transparenten Pixel berechnen, die in unmittelbarer Umgebung zu sichtbaren Pixel liegen. Ein vorberechnetes Array indem das vermerkt ist funktioniert bei mir wunderbar.
Zum Schluss sollte man noch bedenken, dass sich die Sonne auch in RPGs eher langsam bewegt. Man muss also keineswegs jeden Frame die Wolken updaten. Es reicht voll und ganz, wenn in jedem Frame eine Zeile der Wolkentextur neuberechnet wird, und diese, wenn sie fertig ist, ins VRAM geladen wird. In der Zwischenzeit kann man einfach zwischen den beiden letzten Texturen interpolieren.

So, nun noch alles in die GPU schieben und bei mittlerer Temperatur leicht köcheln lassen.

Andreas Ley - "AL"

_________________
"Light travels faster than sound. This is why some people appear bright, before you can hear them speak..."


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jun 02, 2006 15:31 
Offline
DGL Member
Benutzeravatar

Registriert: Di Mai 18, 2004 16:45
Beiträge: 2621
Wohnort: Berlin
Programmiersprache: Go, C/C++
Die Bilder sehen gut aus.
Du hast nich zufällig lust eine Binary und oder Code zur verfügung zu stellen ?

_________________
"Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren"
Benjamin Franklin

Projekte: https://github.com/tak2004


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Jun 04, 2006 13:31 
Offline
DGL Member

Registriert: Sa Jan 22, 2005 21:10
Beiträge: 225
Hmm, für sich den Code zu schreiben und zum laufen zu bringen ist eine Sache, ihn dann jedoch zu säubern, mit sinnvollen Kommentaren zu versehen, in ein funktionierendes Template einzubauen (um nicht alle meine Header verwenden zu müssen), ... is irgendwie langweilig ^^. Ich wollte das ja auch mal für meine Fluid-Dynamics Simulation machen aber mehr als ein C++ Code ist dann doch nicht draus geworden. Naja, ich frag mal Tomok, ob er mir hilft - wenn er von seiner Sauftour wieder da ist - und wenn er bis dahin nicht in mein Zelt gekotzt hat.

_________________
[18:30] tomok: so wie ich das sehe : alles. was nich was anderes ist als nen Essay ist nen Essay

hi, i'm a signature viruz, plz set me as your signature and help me spread :)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Jun 04, 2006 15:29 
Offline
DGL Member
Benutzeravatar

Registriert: Di Mai 18, 2004 16:45
Beiträge: 2621
Wohnort: Berlin
Programmiersprache: Go, C/C++
Ich bin da recht flexible, von mir aus nehme ich auch wilden assemblercode.
Mich interessiert vorallem erstmal die binary und dann in 2. linie der code, denn ich hab ja nun ne doku dazu.

_________________
"Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren"
Benjamin Franklin

Projekte: https://github.com/tak2004


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jun 05, 2006 09:05 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Jul 16, 2003 15:20
Beiträge: 198
Der Tomok ist jetzt wieder von seiner "Sauftour" zurück - nebenbei soviel gesoffen wurd gar nicht - und wenn noch interesse besteht kann ich das gerne übernehmen, dürfte nicht sooo viel Arbeit sein, da ich deine Templates kenne.

_________________
Bevor du definierst, was etwas ist, versichere dich seiner Existenz.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Jun 06, 2006 13:42 
Offline
DGL Member
Benutzeravatar

Registriert: Di Mai 18, 2004 16:45
Beiträge: 2621
Wohnort: Berlin
Programmiersprache: Go, C/C++
Es würde mich sehr freuen, wenn ich Compilierbaren code bekommen könnte.

_________________
"Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren"
Benjamin Franklin

Projekte: https://github.com/tak2004


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Jun 06, 2006 17:58 
Offline
DGL Member

Registriert: Sa Jan 22, 2005 21:10
Beiträge: 225
Er is von seinem -ähem- Camping-Urlaub direkt auf ne LAN weitergezogen (und dass auch noch ohne mich :cry: ) aber wenn er wieder da ist, setzen wir uns dran.

_________________
[18:30] tomok: so wie ich das sehe : alles. was nich was anderes ist als nen Essay ist nen Essay

hi, i'm a signature viruz, plz set me as your signature and help me spread :)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Jun 20, 2006 20:14 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Jul 16, 2003 15:20
Beiträge: 198
So, wir haben den Code jetzt weitesgehend ins DGL-Template kopiert. Die Texturen werden immer noch von ALs Loader geladen, da wir beide den schon immer benutzen und somit keinen anderen kennen, außerdem ist es ja auch nicht sooo wichtig, wie die Texturen da reinkommen - hauptsache sie sind da ^^.

Ach ja, ATI-Nutzer gucken ebenfalls in die Röhre da NV-Registercombiner verwendet wurden.
Außerdem ist der Code alles andere als Perfekt - er soll nur zeigen, wie es gemacht werden kann.

OK, lange rede kurzer Sinn hier gehts zum Code : klick

Wem die Ladezeiten zu lang sind, der kann im Quelltext den Compilerschalter über Debug aktivieren, dann siehts aber schlechter aus.

Fragen könnt ihr hier posten, da keiner von uns Zeit hatte um das ganze mit Kommentaren zu versehen.

MfG
Tomok & AL

PS : Bedinung : Maus + i + ESC / ALT+F4

_________________
Bevor du definierst, was etwas ist, versichere dich seiner Existenz.


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 8 Beiträge ] 
Foren-Übersicht » DGL » News


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 39 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.066s | 17 Queries | GZIP : On ]