Wollen einen Raytracer schreiben, stecken auf, was Algebra-Bibliothek verwenden (C ++)

StackOverflow https://stackoverflow.com/questions/4674195

  •  10-10-2019
  •  | 
  •  

Frage

Ich habe gefehlt, meine eigene multithreaded Realtime Raytracing in C ++ zu schreiben, aber ich will nicht alle die Vektor- und Matrix-Logik implementieren, die mit ihm kommt. Ich dachte, ich würde einige der Forschung eine gute Bibliothek für diese zu finden, aber ich habe nicht viel Erfolg ...

hatte

Es ist wichtig, dass die Umsetzung schnell ist, und vorzugsweise, dass es mit einiger freundlichen Lizenzierung kommt. Ich habe gelesen, dass boost einfachen Algebra, aber ich kann nichts finden, wie gut es war in Bezug auf seine Geschwindigkeit.

Im übrigen gab Google mir Armadillo, die Ansprüche sehr schnell zu sein, und vergleicht sich zu bestimmten anderen Bibliotheken, dass ich nicht gehört haben.
Dann bekam ich Seldon, die auch als effizient und bequem behauptet, obwohl ich nicht konnte, wo genau sie auf der Skala sind.
Schließlich las ich über Eigen, die ich habe auch hier auf Stackoverflow bei der Suche hier erwähnt gesehen.

In der CG Vortrag an meiner Universität, verwenden sie HLSL für die Algebra (wodurch die Schüler implementieren / optimize Teile der Raytracer), die mich bekam denken, ob ich GLSL dafür verwenden könnte. Auch hier habe ich keine Ahnung, welche Option am effizientesten ist, oder das, was der allgemeine Konsens über Algebra Bibliotheken ist. Ich habe gehofft, mir so helfen könnte hier aus, so dass ich mit einiger echten Entwicklung beginnen können:)

PS: Ich habe versucht, zu Sites verknüpft, aber ich habe nicht genug rep noch

War es hilfreich?

Lösung

Ich würde empfehlen, eigene Routinen zu schreiben. Als ich meine Raytracer schrieb, fand ich, dass die meisten der Algebra die gleiche kleine Sammlung von Methoden verwendet. Im Grunde alles, was Sie brauchen, ist ein Vektor-Klasse, die Träger Addition, Subtraktion, etc. Und von dort alles, was Sie wirklich brauchen, Dot und Cross ist.

Und um ehrlich zu sein mit GLSL wird nicht Sie viel mehr geben, als dass sowieso (sie nur unterstützen Punkt, Kreuz und einfache Vektor-Mathematik, alles andere muss Hand codiert werden). Ich würde auch Prototypen in C ++ empfehlen dann danach zu CUDA bewegen. Es ist ziemlich schwierig, eine GPU-Code zu debuggen, so dass Sie es Arbeit in der CPU erhalten dann kann es ein wenig an die Arbeit in CUDA rekodieren.

In der Realität Raytracern ist ziemlich einfach. Es macht sie schnell, dass hart. Es ist die Beschleunigungsstrukturen, die die meiste Zeit und Optimierung nehmen werden. Wenigstens hat es für mich.

Andere Tipps

Sie sollten nehmen Blick auf http://ompf.org/forum/

Dieses Forum handelt von Echtzeit-Raytracing, meist in C ++. Es wird Ihnen Hinweise geben, und Probenquelle.

Die meisten der Zeit, als jede Zykluszahl, die Menschen verlassen Sie sich nicht auf externe Vektor Mathematik Libs. Optimierungen sind abhängig von der Compiler Sie verwenden, inlining, die Verwendung von SSE (oder kindof) oder nicht, usw.

I "IlmBase" empfehlen, der Teil des OpenEXR Pakets. Es ist gut geschrieben C ++, von ILM entwickelt und weit von Menschen, die professionell schreiben und Verwendung Grafik-Software.

Für meine Projekte, die ich verwendet glm, vielleicht wäre es auch zu Ihnen passen.

Beachten Sie, dass Bibliotheken wie boost::ublas oder seldon wahrscheinlich werden Sie nicht passen, weil sie BLAS orientierte (und ich nehme an, Sie suchen nach einem guten 3D-driven lineare Algebra-Bibliothek).

Auch die dxmath DirectX-Bibliothek ist ziemlich gut, wenn auch manchmal schwer zu bedienen, weil es die C-kompatiblen Stil.

Sie können auf den Quellcode sucht POVRAY

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top