Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

17.05.2010, 10:23

Wasser/Fresnel Programmierung

Moin,

ich sitze schon seit längerer Zeit an einem Problem der Wasserprogrammierung und komme nicht vorran. Das fängt schon ziemlich zu Beginn an:
Die Mathematik. Ich habe mich natürlich mit Reflektion (Einfallswinkel = Ausfallwinkel) und Brechung ( Snellius ) beschäftigt und diese auch verstanden :P . Mein Problem ist Herr Fresnel. :) Immer wenn ich auf Wasserprogrammierung gestoßen bin, gab es Verweise auf die Fresnelschen Formeln. Ich habe jedoch ziemliche Verständnisprobleme mit den Formeln. Zum einen verstehe ich nicht ganz den Zusammenhang (wofür sind sie genau da, auch in Hinblick auf Wasser? Ich schätze mal sie beschreiben die Wirkung eines Lichtstrahls auf 3Dimensionales Wasser?) und ich habe noch Probleme die Formeln generell zu verstehen. Habt ihr da gute Tutorials?

Vielleicht kennt ihr ja auch Implementierungen (vorzugsweise C++, bzw. CG)?
Eigentlich könnt ihr auch alles schreiben , was euch zu dem Thema einfällt :D .

Ich habe diesen Thread in diesem Forum gestellt, da ich vllt später noch ein paar Fragen zur Implementierung der Formeln habe.

Fals es wen interessiert:
C++, Ogre3D, CG sind die Komponenten mit denen ich für das Wasser arbeiten werde.

Ich freue mich über eure Antworten :) .

Gruß,

Mark

2

17.05.2010, 12:34

Guck dir die Ogre Fresnel Sample an :D
Das kann das alles was du willst ;)

3

17.05.2010, 15:12

Ja du bist gut :D Da drauf bin ich natürlich schon selbst gekommen :) . Aber eine Plane zu machen die reflektiert und dann einen FrameListener einzubauen + die Materials und Shader zu kopieren bringt mich leider nicht weiter ;) .

Ich muss es erst mal inhaltlich (mathematisch) verstehen und dann setzte ich mich noch mal genauer mit der Implementierung in die Vertex/Pixel/ASM( :( ) Shader auseinander.
Aber ich möchte das inhaltliche Verständnis haben und das bekomme ich leider durch die FresnelDemo nicht.

Ich würde sehr gerne selbst was erstellen, was ich dann auch zu 100% verstehe, als dass ich mir was zusammen stückele :D .
Da arbeite ich nämlich nicht ergebnisorientiert sondern "egoistisch" ;) .
Ich hoffe du verstehst meine Motivation und vielleicht hast du oder wer anders ja ein bisschen Zeit , die er/sie erübrigen kann.

Gruß,

mark

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

4

17.05.2010, 15:19

Die Fresnelschen Gleichungen beschreiben nur wieviel Licht an der Wasseroberfläche abhängig vom Einfallswinkel reflektiert und wieviel durchgelassen wird. Anders ausgedrückt liefern sie dir das Verhältnis zwischen Reflection und Refraction...

In der Computergraphik verwendet man oft folgende Näherungsformel da die Fresnelgleichungen recht aufwändig zu berechnen sind: http://en.wikipedia.org/wiki/Schlick's_approximation

5

21.05.2010, 17:03

Hey,

ich habe jetzt doch erstmal die Fresnel Formeln hergeleitet und überprüft ob sie stimmen :D - Ja sie tun es.
Mir fehlt aber noch der Zusammenhang zwischen den Formeln für § r_{s}, t_{s}, r_{p}, t_{p}§ und der Aussage zu den Verhältnissen.
Angenommen alpha ist 15°, ergibt sich daraus:
§\alpha = 15^\circ§
§\beta = 11.19298717^\circ§
§n_{1} = 1§
§n_{2} = 4/3§
§r_{s} = -0.1504228031§
§t_{s} = 0.8495771969§
§r_{p} = 0.1341628189§
§t_{p} = 0.844457261§

Wenn ich das richtig verstehe, dann ist R = r² und T = t² .
und T = 1 - R.

Laut einem Beispiel, soll §r^{2} = r_{s}^{2} + r_{p}^{2} § sein?
Dann wäre das:
R = 0.04062668167 = 4.1%
T = 95,9%

Also würden bei einem Winkel von 15° 4.1% reflektiert und 95.9% würden transmittiert?

Vielleicht findet, ja einer von euch mal die Zeit, das zu überprüfen :D.

Ich werde mir die Schlick's approximation mal nach Pfingsten zu Gemüte führen.

Gruß,

Mark

6

18.06.2010, 11:56

Moin,

so ich mich mittlerweile ziemlich in das Thema eingearbeitet und habe mich mit vers. Approximationen beschäftigt , sowie mit der Programmierung dessen. Mein momentaner Stand ist:


Sowohl Reflection als auch Refraction und testweise Specular Highlights sind schon eingebaut. Man erkennt aber auf Anhieb ein ziemliches Manko, den schwarzen Rand. Ich tippe darauf das dieser seinen Ursprung in der Reflection hat:


Und durch die Bewegung der Plane wird dieser schwarze Rand dann dicker bzw. dünner.
Vielleicht habt ihr da Ideen.

Außerdem habe ich noch ein zweites Problem:

In dem Shader von dem Fresnel Beispiel wird eine sehr komische Approximation verwendet:
§-0.1+1.8*(1+cos(\alpha))^{8} §
Die oben bekannte Schlicks Approximaton lautet aber:
§0.02+0.97*(1-cos(\alpha))^{5} §

Wenn man die beiden Funktion betrachtet, merkt man das diese nicht annähernd gleich sind (eher gegensätzlich):

Deshalb meine Frage, warum verwendet Ogre Frendel Demo diese Approximation?

Wenn ihr i-welchen Code oder Shader-Code braucht, bitte Bescheid sagen.

Gruß,

Mark

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

7

18.06.2010, 12:18

Nun, Schlicks Approximation gibt dir den Reflexionskoeffizienten, also das Verhältnis von reflektierter zu eingestrahlter Intensität. Ich würde mal schätzen dass die Ogre Variante dagegen den Transmissionskoeffizienten approximiert, der eben genau T = 1 - R wäre...

8

18.06.2010, 12:26

Hey danke für deine schnelle Antwort. Das dachte ich auch zuerst, aber im Shader steht folgendes:

Quellcode

1
2
float fresnel = fresnelBias + fresnelScale * pow(1 + dot(eyeDir, normal), fresnelPower);
col = lerp(refractionColour, reflectionColour, fresnel);


Mit lerp(a,b,f) = (1-f)*a + f*b; würde das ja nicht stimmen.

9

19.06.2010, 16:27

Moin,

ich bin eig. kein Freund von Thread-Pushing , besonders nach so kurzer Zeit, jedoch läuft mir etwas die Zeit davon, die ich noch hab bis ich das Projekt abgeben muss. Die zwei Probleme von oben stehen noch, also wenn ihr Ideen habt, wie sinnlos sie auch erscheinen mögen oder wenn ihr i-welchen Source braucht, bitte melden ;).

Gruß und nochmal sry fürs pushen,

mark

Werbeanzeige

Ähnliche Themen