Das Problem ist folgendes: Ich habe mich erst einmal ohne Hilfe von Tutorials etc. an einem Raytracer versucht, als ich dann feststellte, dass meine Schatten merkwürdig aussehen (siehe Bild) habe ich mir mal diverse Tutorials (auch das auf DGL) angeschaut. Allerdings konnte ich keinen groben Denkfehler entdecken, weshalb ich jetzt nicht weiß woran es liegt.
mfg
Zuletzt geändert von Seth am Fr Okt 15, 2010 15:16, insgesamt 3-mal geändert.
Grundsätzlich solltest du nicht das aktuelle Object ausschließen, sondern ein den Anfangspunkt des Strahls um ein Epsilon nach außer versetzen.
Insbesondere bin ich mir nicht sicher ob dein code Selbsbeschattung korrekt handhabt, z.B. wenn die Lichtquelle auf der anderen Seite der Kugel ist. Zum debuggen würde ich phong auch einmal ausmachen, damit du echte Beschattung von dunkler Beleuchtung trennen kannst.
Als optimierung würde ich später allerdings normale dot lichtvektor ausrechnen bevor du den Strahl losjagst und bei <0 ein early out machen für undurchsichtige Materialien.
Selbstbeschattung ist dadurch ja erst einmal deaktiviert, dass das Objekt selbst ausgeschlossen wird, aber die Sache mit dem Epsilon werde ich mal probieren, ich muss ja nur den Punkt entlang der Normalen, die ich ja ohnehin berechnen muss, verschieben.
danke.
Zuletzt geändert von Seth am Sa Jul 26, 2008 21:37, insgesamt 1-mal geändert.
Ein paar allgemeine (performance) Tipps:
* Deklarier den Vektor als array[0..2]of single statt als record, damit lässt es sich imo leichter arbeiten
* Deine Nullmatrix etc als Konstante deklarieren mit {$WRITEABLECONST OFF}, gegen überschreiben ausversehen
* Konstante Vektorparameter als const übergeben, afaik ist das etwas schneller und hat keine Nachteile
* Rückgabewerde durch out parameter ersetzen, ist afaik ebenfalls schneller da ein kopiervorgang wegfällt allerdings unpraktisch, also nur umsetzen falls du die performance brauchst
* Kurze Funktionen als inline deklarieren, auch wenn das in Delphi nicht sonderlich viel bringt
Außerdem hat deine Abstandsberechnung einen bug wo du die indizes vertauscht hast. Du solltest deine hilfsfunktionen auch nutzen wenn du sie schon schreibst Das ist die glaube ich Ursache für deine Probleme.
Wenn du die ersten 3 Zeilen von RaySphereIntersect ersetzt geht es:
Code:
a := v3f_sqr(ray.d);
b :=2* v3f_dot(ray.d,v3f_sub(ray.p,sphere.position));
c := v3f_sqr(v3f_sub(sphere.position,ray.p))-sqr(sphere.radius);
Epsilon ist üblicherweise SEHR klein und dient nur zur Kompensation von Floatingpoint fehlern.
Außerdem wäre etwas OOP bei deinen Objekttypen angebracht. Eine Baseklasse und die abgeleiteten objekte wie sphere die virtuelle Methoden überschreiben. Ist zwar nicht super schnell macht den code aber ordentlicher.
Vielen Dank erstmal für die viele Mühe. Erstmal wollte ich meinen Code zum laufen kriegen, schauen wie ichs am besten anstelle und mich dann ans Optimieren machen. Das gleiche gilt für die Struktur, ich hatte vorher noch eine Version in der es nur nen Code in nem Onclick eines Buttons gab.
Mit der Berechnung hast du recht, die hätte ich wirklich nicht kompliziert ausschreiben müssen, besonders die Berechnung von c geht auch deutlich kürzer Allerdings falsch war es nicht, deshalb bringt dies auch keine Änderung, was die Berechnung der Schatten angeht.
Deine Strukturtipps sind auch sehr nützlich, danke
€: Ich glaub ich weiß den Fehler Ich muss mit Halbgeraden arbeiten. Sonst bekomme ich ja immer einen Schnitt.
€2: Ja das wars ein einfaches Skalarprodukt hat das Problem behoben (welches ich mir auch noch sparen kann, wenn ich das in der Intersection Routine vornehme)
Das Ergebnis der Lösung sieht wie folgt aus (Anhang):
mfg
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
Doch, bei der berechnung von c hattest du einmal y statt x geschrieben. Dadurch wurde in deinem hochgeladenen Beispiel die Kugel nicht korrekt dargestellt und hatte diese seltsamen Einschnitte an der Seite.
Antialiasing ist schon drin, aber gerade das ist nicht die schnellste Variante Es wird nicht nachträglich auf das Bild angewandt, ist also in dem Sinne kein Antialiasing, sondern einfach eine etwas exaktere Berechnung des Bildes. In diesem Fall wurden Pro Pixel 4*4 Strahlen losgeschickt und miteinander verrechnet. Ein paar Sekunden dauert es schon. Das Bild ist (bis auf die JPEG Kompression) so mit dem Raytracer berechnet worden.
Schade, dass solch schöne Schatten in OpenGL (und in Echtzeit) nicht so leicht zu berechnen sind
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
Seth hat geschrieben:
Antialiasing ist schon drin, aber gerade das ist nicht die schnellste Variante Es wird nicht nachträglich auf das Bild angewandt, ist also in dem Sinne kein Antialiasing, sondern einfach eine etwas exaktere Berechnung des Bildes. In diesem Fall wurden Pro Pixel 4*4 Strahlen losgeschickt und miteinander verrechnet. Ein paar Sekunden dauert es schon. Das Bild ist (bis auf die JPEG Kompression) so mit dem Raytracer berechnet worden.
Ist nicht genau das das, was das Antialiasing ausmacht? Anstatt einen Wert pro Pixel zu berechnen, werden mehrere Berechnet und deren Mittelwert wird dann genommen, oder?
Gruß Lord Horazont
_________________ If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung. current projects: ManiacLab; aioxmpp zombofant network • my photostream „Writing code is like writing poetry“ - source unknown
„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb
Bin mit den Begrifflichkeiten nicht so vertraut. Wenn mans nachträglich anwenden würde (sprich mit den Nachbarpixel verrechnet) wäre es wohl kein Antialiasing, sondern einfach Blur.
zu AA gibt es papers welche sparsed Masks am günstigsten sind. Wenn dann die Farbunterschiede groß sind kann man ja auch noch adaptiv die Anzahl der Strahlen erhöhen.
Mitglieder in diesem Forum: Bing [Bot] und 2 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.