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?