Ich versuche, Ray Tracing mit Zapfen zu implementieren (Amanatides 1984) . Anstelle von Strahlen werden Kegel in die Szene geschossen und mit Geometrie geschnitten. Da mehrere Dreiecke die Apertur des Kegels einnehmen können, müssen wir die relative Fläche des Kreises, der vom Dreieck bedeckt wird, berechnen (oder ziemlich schnell schätzen, da die Kegelverfolgung ohnehin viele Annäherungen macht). Anschließend werden die einzelnen Beiträge gewichtet und zusammengefasst.
Der Autor gibt leider nicht viele Details über seine Lösung. Folgendes schreibt er über Kegel-Ebenen-Schnittpunkte:
Der Ausbreitungswinkel und der Winkel zwischen dem Strahl und der Ebene, die oben zusammen berechnet wurden, geben an, wie der Abstand zwischen dem Mittelpunkt des Kreises und der Kante der Halbebene ist. Bei dieser Entfernung wird die Schnittfläche unter Verwendung einer Polynomnäherung berechnet. Damit ist die Schnittpunktberechnung für Ebenen abgeschlossen.
Und dann, nachdem ein Polygon auf die Ebene senkrecht zum Richtungsvektor des Kegels projiziert wurde:
Wir müssen dann den Schnittpunkt zwischen dem projizierten Polygon und einem Kreis berechnen. Dies kann erreicht werden, indem der Abstand vom Mittelpunkt des Kreises zu jeder der Kanten berechnet und dann die zuvor erwähnte Schätzung des Schnittpunkts zwischen Kreis und Halbebene verwendet wird.
Ich habe bei StackExchange eine Lösung für das Problem gefunden . Ich habe den Code aus der Antwort von NowIGetToLearnWhatAHeadIs portiert , und er funktioniert einwandfrei , scheint mir aber ziemlich kompliziert zu sein. Ich arbeite mit Compute Shadern, daher ist das Verzweigen eine schlechte Sache, und die Lösungen hängen stark davon ab.
- Was ist das Polynomannäherungseinheit dass Amanatides spricht über, und wie wird es auf Polygone angewendet werden (ESSA. Dreiecke)?
- Gibt es eine Annäherung an das Problem, die vernünftig genaue Ergebnisse (z. B. ± 10%) bei erheblichen Verbesserungen der Leistung / Code-Einfachheit liefert?
- Bei der Arbeit mit GPUs interessiere ich mich für eine optimierte Lösung, die beispielsweise Min / Max über Verzweigung verwendet. Vielleicht gibt es so etwas schon. Etwas Glück?
Antworten:
Auf dem Weg zu einer exakten Lösung
Nur ein kurzer Gedanke, bevor ich rennen muss!
Ok, lassen Sie uns das Problem auf den Kopf stellen. Was ist, wenn man die vom Kreis geschnittene Fläche des Dreiecks nicht berechnet? Berechnen wir stattdessen die Umkehrung davon. Die Fläche von drei Segmenten wird aus dem Kreis herausgeschnitten. Das Schöne an diesem Ansatz ist, dass wir einen einzelnen Code erstellen können, den wir dreimal wiederholen können. Natürlich wird die Antwort manchmal 0 sein, aber das ist in Ordnung.
Bild 1 : Berechnen wir stattdessen dieses Problem.
Nun stellt sich heraus, dass wir wissen, wie man die Umkehrung berechnet, es ist das Segment eines Kreises. Wir können also einfach sagen, dass .EINi n t=EINc i r c l e- -EIN1- -EIN2- -EIN3
Bild 2 : Wir kennen diese Lösung.
Die Formel für die Fläche eines Segments lautet einfach und das hat in der Literatur eine bekannte Lösung.EINs e c t o r- -EINt r i a n gl e
Jetzt müssen Sie nur noch die Schnittpunkte zwischen den Kanten und dem Kreis in einem auf dem Kreis zentrierten Raum finden, den Winkel zwischen diesen berechnen und dann jedes Segment berechnen. Und der einzige Sonderfall ist, wenn keine Kreuzung existiert. Ich weiß nicht, ob dies schnell ist, aber zumindest sollte Code etwas einfach zu implementieren sein.
quelle