Ray Tracing Reflexionen
-
Hallo Leute
Ich programmiere einen Ray Tracer und soweit funktioniert alles einwandfrei. Ich habe von der Theorie keine Ahnung und mache alles so nach Gefühl und schaue hin und wieder ein paar Dinge nach. Damit bin ich schon recht weit gekommen, sprich mathematische Formen, die Kamera, das Bild und dergleichen sind schon voll funktionstüchtig. Jetzt wollte ich Reflexionen implementieren, also z.B. einen Spiegel oder eine Kugel mit spiegelnder Oberfläche. Dazu berechne ich einfach alles von vorn für den Schnittpunkt mit der spiegelnden Oberfläche, denn Einfallswinkel = Ausfallswinkel, weiß jedes Kind.
Jetzt: für farblose Spiegel tut dies, wie ich es mir erhofft hatte. Wenn ich nun aber z.B. eine rote und eine blaue, spiegelnde Kugel nebeneinander stelle, dann erscheint die rote als komplett schwarzer Kreis in der blauen und vice versa. Das ist weil ich im Code einfach die eigene Farbe des Körpers komponentenweise mit dem Ergebnis der rekursiven Reflexion multipliziere. Dann gilt logischerweise (1,0,0)*(0,0,1)=(0,0,0).
Ist das trotzdem korrekt so wie ich das mache? Muss ich dann einfach rot als z.B. (1,0.1,0.1) darstellen? Oder soll ich die eigene Farbe und die Reflexion LERPen? Oder wie genau macht man das korrekterweise?MFG
-
Das du die reflektierten Kugeln in schwarzer Farbe siehst ist korrekt und deine Berechnung mit der Formel (1,0,0) * Farbe vom Strahl ist korrekt.
Die Farbe, die ein Lichtstrahl nach einer Reflektion hat wird über dir Brdf-Funktion bestimmt.
https://de.wikipedia.org/wiki/Bidirektionale_Reflektanzverteilungsfunktion
Für eine Brdf gelten, wie bei Wikipedia steht, die 3 Punkte, welcher unter 'Physikalisch richtige BRDF' stehen.
Die Formel, welche du für dein Spiegel verwendest, erfüllt alle 3 Punkte und ist somit erstmal richtig.
Wenn du aber eine rote Kugel bauen willst, welche mehr wie eine Weihnachtskugel aussieht, probiere doch mal folgende Formel:
50% der Lichtenergie wird perfekt Spekular reflektiert (Deine Formel)
50% der Lichtenergie wird Diffuse relektiertDie diffuse Farbkomponete berechnet du, in dem du von dem Schnittpunkt zwischen dein Sichtstrahl und der Kugel einen Schattenstrahl zur Lichtquelle sendet. Du prüfst also mithilfe von einen Strahl, ob zwischen dem Kugelschnittpunkt und der Lichtquelle freie Sicht ist. Wenn das so ist, dann berechnet sich die diffuse Farbe wie folgt:
DiffuseColor = (1,0,0) / PI * Dot(Schnittpunktnormale, Richtungsvektor_VomSchnittpunkt_zum_Licht_zeigend) / QuadratAbstandZwischenLichtquelleUndSchnittpunkt * aktuelleFarbeVomStrahl
SpecularColor = (1,1,1) * aktuelleFarbeVomStrahlKugelfarbe = (DiffuseColor + SpecularColor) * 0.5