ZFX
ZFX Neu
Home
Community
Neueste Posts
Chat
FAQ
IOTW
Tutorials
Bücher
zfxCON
ZFXCE
Mathlib
ASSIMP
NES
Wir über uns
Impressum
Regeln
Suchen
Mitgliederliste
Membername:
Passwort:
Besucher:
4384260
Jetzt (Chat):
27 (0)
Mitglieder:
5239
Themen:
24223
Nachrichten:
234554
Neuestes Mitglied:
-insane-

ZFX
Coding-Foren
Algorithmen und Datenstrukturen
Re: Atmosphere Scattering
Normal
AutorThema
PuMi Online ist nicht jeder!
ZFX'ler


Registriert seit:
02.04.2006

Berlin
266670062
Atmosphere ScatteringNach oben.
Jetzt geht es nun an einen Himmel der ordentlich sein soll und ich stehe vor dem Problem der Farbe des Himmels. Noch problematischer ist, dass das ganze realistisch aussehen soll.

Nun habe ich mich im Netz eine Weile lang schon umgeschaut und mich gefragt wie man das machen könnte. Da habe ich mir Paper von Nashita angesehen, die Hoffmann-Technologie, dieses Paper und dieses Paper. Alle habe ich mir auch durchgelesen.

Nun kenne ich zwar viel Theorie, weiß ich aber so einige Dinge nicht:
Wie hängt die Lichtfrequenz vom Tag ab und was ist der tatsächliche Wertebereich (OK: Ich weiß es sind 440-770nm aber gebe ich das jetzt so ein: 770.0f?)?

Jetzt kenne ich zwar alle schicken Formeln und Integrale aber irgendwie habe ich kaum einen Plan, wie ich etwas in einem Shader zusammenschweißen soll, damit etwas brauchbares herauskommt. Es ist mir klar, dass in den Papers zwischen dem Himmel und Terrain strikt getrennt wird, aber wie zur Hölle sollen die Integrale und Co. richtig integriert werden? Wie funktioniert die Berechnung von den Formeln zur Farbe eigentlich im genaueren? Ich finde hierzu kaum Hinweise oder finde im Netz kaum brauchbare Quellcodes um zu sehen, wie das direkt geht.

Von den ganzen Faktoren: Was sind hier sinnvolle Definitionsbereiche?

Die Integrale: Sollen die jetzt 1 zu 1 in den Shader integriert werden? Sprich innerhalb des Integrals ist die Funktion geschrieben und die ab in den Shader? Oder müssen diese Funktionen erstmal integriert werden und dann einfügen?

Was mir klar ist, dass das ganze schon per SkySphere gerendert werden muss, von einer Normale des Vertices, einer Blickrichtung des Spielers, einer Sonnenscheinrichtung und von gewissen Faktoren abhängt - aber wie?

Im Netz finde ich komischerweise auch keine hilfreichen Demos mit Code wo ich mal schnell einige Parameter umstellen kann um zu schauen, was dort nun passiert.

Und wenn ich nun mal die Summe der Fläche eines Beispielintegrals I0->s(0.25x^3+0.55x^2-0.15x+1.13) richtig verstehen würde wäre dies F(x)=0.0625x^4+0.183x^3-0.075x^2+1.13x+c -> F(s) - c? Wie werden im allgemeinen Integrale in Shadern implementiert? Ich benutze derzeit das HLSL 4.0 Shadersystem.

Letzeres Paper hat sogar Pseudocode. Allerdings scheinen mir dort die Formeln etwas anders als ich sie vermuten würde. Was geht dort vor?

Okay - und wie implementiere ich die Mammutsgeburt nun? - Denn ich habe kaum einen Plan wie das gehen soll.

Im voraus Danke!
21.12.2008, 20:46:27 Uhr
Art Train Developer
Krishty Offline
ZFX'ler


Registriert seit:
01.02.2004

Nordrhein-Westfalen
342173470
Re: Atmosphere ScatteringNach oben.
Warum nicht diesen Thread fortsetzen? Für das meiste muss ich mich eh wiederholen -.-

Die Lichtfrequenz der Sonne ist logischerweise immer gleich, weil es ihr egal ist, ob hier Tag oder Nacht ist. Man kann sogar davon ausgehen, dass in ihrem Licht die Frequenzbänder für Rot, Grün und Blau etwa gleich stark ausgeprägt sind.

Du gibst die Wellenlängen in die Formeln ein, wie die Formeln sie erfordern. Wenn die Formel mit Metern rechnet, gibst du eben 0.000000440f für 440nm ein.

Die Integrale können nicht gelöst werden, du musst sie iterativ annähern (bedeutet, for-Schleife im Shader, zwischen 64 und 256 Samples liefern gute Ergebnisse).
Du gehst also alle Punkte durch, die entlang der gegebenen Blickrichtung in der Atmosphäre liegen. Dann berechnest du, wieviel Sonnenlicht diesen Punkt erreicht (Abschwächung durch optische Dichte von diesem Punkt zum Außenrand der Atmosphäre in Richtung der Sonne multipliziert mit der Stärke des Sonnenlichts) und schwächst diesen Wert entsprechend der Abschwächungsfunktion für die optische Dichte, die er zum Betrachter durchqueren muss, ab. Wenn du alle diese Punkte aufaddierst, hast du die Intensität, mit der das Streulicht aus dieser Richtung ins Auge des Betrachters fällt.

Du rechnest dabei nicht mit Rot, Grün und Blau, sondern entsprechend mit ihren Wellenlängen, die du in die Formeln einsetzt. Die Ergebnisse kannst du dann einfach zu RGB übernehmen.

Das ist dann die Streuung erster Ordnung – gut sieht die noch nicht aus, dafür musst du ein oder zwei höhere Ordnungen berechnen, was bisher nicht in Echtzeit machbar ist – sprich, was du für einen Pixel tust, tust du dann für jedes Sample beim Durchqueren der Atmosphäre.
Eine sinnvolle Implementierung dafür zu finden ist die andere Sache. Da kann man aber massiv auf Texturen als Lookup-Tables zurückgreifen anstatt dauernd neu zu rechnen. Z.B. ändern sich die Streufunktion eines Partikels, die Dichte der Atmosphäre, die Abschwächung durch bestimmte optische Tiefen usw. nie.

Gruß, Ky

1 Mal gendert, zuletzt am 21.12.2008, 21:11:43 Uhr von Krishty.
21.12.2008, 21:07:30 Uhr
PuMi Online ist nicht jeder!
ZFX'ler


Registriert seit:
02.04.2006

Berlin
266670062
Re: Atmosphere ScatteringNach oben.
Also wenn ich das jetzt mit den Integralen in HLSL richtig verstanden habe...

Nehmen wir an ich habe einen fiktiven Integral

I[0, s] 0.25s^3-4.5s^2+0.05s-5 ds

Und s ist die Länge. Wenn ich nun 88 Schritte möchte (meinetwegen ein hinrechend genauer Wertebereich):

Code:
float sum = 0.0f;
for(int i=0; i<88; i++)
{
    float ls = i / 88.0f * s;
    sum += 0.25 * ls^3 - 4.5 * ls^2 + 0.05 * ls - 5;
}
Oder habe ich dich da falsch verstanden? Denn dies wäre ja eine Funktion um die Obersumme eines Integrales von 0 bis s im Intervall i zu berechnen.

Das ich mal einen Thread deswesen aufgemacht habe, habe ich schon total vergessen . Aber jetzt den anderen auch wieder noch vorne zu kramen halte ich auch für wenig Sinnvoll.

Wenn ich das jetzt richtig verstanden habe, würde ich das gerne mal mit einem Integral aus dem Paper machen. Würde dann auch erklären, wie ich mathematisch zu dem Ergebnis komme.
05.01.2009, 20:38:32 Uhr
Art Train Developer
Krishty Offline
ZFX'ler


Registriert seit:
01.02.2004

Nordrhein-Westfalen
342173470
Re: Atmosphere ScatteringNach oben.
Da fehlt noch etwas: Momentan näherst du nur für 88 Meter an. Du musst sum mit s/88 multiplizieren, um über s anzunähern.

2 Mal gendert, zuletzt am 05.01.2009, 21:28:26 Uhr von Krishty.
05.01.2009, 21:27:37 Uhr
PuMi Online ist nicht jeder!
ZFX'ler


Registriert seit:
02.04.2006

Berlin
266670062
Re: Atmosphere ScatteringNach oben.
Na der Index i war dazu gedacht, dass er angibt, wo sich der Index befindet.

Also wenn Index i = 44 und 88 Schritte gewollt sind, dann werden 50% der Entfernung zu s genommen und dann dort zu diesem Fall der Funktionswert errechnet. s ist hierbei die gesamte Entfernung zum Vertex.

Oder habe ich deinen Post falsch verstanden. Wenn ja: Wie meinst du das in mathematischer Ausdrucksweise?

Sorry das ich so viel frage, aber klebe ich an einem Problem bin ich wie ein Sekundenkleber .

1 Mal gendert, zuletzt am 05.01.2009, 22:40:25 Uhr von PuMi.
05.01.2009, 22:40:03 Uhr
Art Train Developer
Krishty Offline
ZFX'ler


Registriert seit:
01.02.2004

Nordrhein-Westfalen
342173470
Re: Atmosphere ScatteringNach oben.
Ich verstehe nicht wirklich was von Mathematik, darum ein Bildchen:

http://img119.imageshack.us/img119/7579/iterationtw8.png

Oder kurz: Ohne Multiplikation mit der Schrittlänge stimmt die Dimension deines Ergebnisses nicht und du müsstest meterweise rechnen, damit du die richtige Zahl erhälst.

3 Mal gendert, zuletzt am 05.01.2009, 23:19:08 Uhr von Krishty.
05.01.2009, 23:08:34 Uhr
PuMi Online ist nicht jeder!
ZFX'ler


Registriert seit:
02.04.2006

Berlin
266670062
Re: Atmosphere ScatteringNach oben.
Arg stimmt, klar . Auch ich stehe manchmal auf dem Schlauch .

Ich werde jetzt mal ne Nacht drüber schlafen, mir das mal durchlesen und dann mal auf meinem Mathepapier wieder Umweltverschmutzung durchführen .
05.01.2009, 23:17:45 Uhr
Art Train Developer
Normal


ZFX Community Software, Version 0.9.1
Copyright 2002-2003 by Steffen Engel