Yocto/GL ist eine Sammlung kleiner C++17-Bibliotheken zum Erstellen physikalisch basierter Grafikalgorithmen, die unter der MIT-Lizenz veröffentlicht werden. Yocto/GL ist bewusst datenorientiert geschrieben, um die Entwicklung und Verwendung zu vereinfachen. Yocto/GL ist in kleine Bibliotheken aufgeteilt, um die Code-Navigation zu erleichtern. Die Dokumentation finden Sie in jeder Header-Datei.
yocto/yocto_math.{h}
: Vektoren fester Größe, Matrizen, starre Rahmen, Transformationenyocto/yocto_color.{h}
: Farbkonvertierung, Farbanpassung, Tone-Mapping-Funktionen, Farbkorrektur, Farbkarten, Farbräumeyocto/yocto_geometry.{h}
: Strahlen, Begrenzungsrahmen, Geometriefunktionen, Strahl-Primitiv-Schnittpunkt, Punkt-Primitiv-Überlappungyocto/yocto_noise.{h}
: Perlin-Rauschenyocto/yocto_sampling.{h}
: Zufallszahlengenerierung, Generierung von Punkten und Richtungen, Monte-Carlo-Dienstprogrammeyocto/yocto_shading.{h}
: Auswertung und Abtastung von Fresnel-Funktionen, BSDF-Keulen, Transmissionskeulen, Phasenfunktionenyocto/yocto_image.{h,cpp}
: einfacher Bilddatentyp, Bildgrößenänderung, Tonemapping, Farbkorrektur, prozedurale Bilder, prozeduraler Sonnenhimmelyocto/yocto_shape.{h,cpp}
: einfache Formdatenstruktur, Dienstprogramme zum Bearbeiten von Dreiecksnetzen, Quadernetzen und Liniensätzen, Berechnung von Normalen und Tangenten, lineare und Catmull-Clark-Unterteilung, prozedurale Formengenerierung, Strahlschnittpunkt und Abfragen nach nächstgelegenen Punktenyocto/yocto_scene.{h,cpp}
: Szenendarstellung und Eigenschaftenbewertungyocto/yocto_bvh.{h,cpp}
: Abfragen von Strahlenschnittpunkten und nächstgelegenen Punkten von Dreiecksnetzen, Quadernetzen, Liniensätzen und Instanzszenen unter Verwendung einer zweistufigen Begrenzungsvolumenhierarchieyocto/yocto_trace.{h,cpp}
: Pfadverfolgung von Oberflächen und Haaren, unterstützt Flächen- und Umgebungsbeleuchtung, Mikrofacetten-GGX und Untergrundstreuung, Mehrfachbedeutungsstichprobeyocto/yocto_sceneio.{h,cpp}
: Bild-, Form- und Szenenserialisierungyocto/yocto_modelio.{h,cpp}
: Low-Level-Parsing und Schreiben für Ply-, Obj- und Stl-Formateyocto/yocto_pbrtio.{h,cpp}
: Low-Level-Analyse und -Schreiben für das Pbrt-Formatyocto/yocto_cli.{h}
: Druckdienstprogramme und Befehlszeilenanalyseyocto/yocto_parallel.h
: Parallelitätsdienstprogramme (veraltet)Sie können Yocto/GL in den folgenden Anwendungen in Aktion sehen, die zum Testen der Bibliothek geschrieben wurden:
apps/ytonemap.cpp
: Bildkonvertierung und -anzeigeapps/ycolorgrade.cpp
: Farbkorrektur von Bildernapps/yconvert.cpp
: Szenenkonvertierungapps/yconverts.cpp
: Formkonvertierungapps/ytrace.cpp
: Offline- und interaktives Szenenrenderingapps/ycutrace.cpp
: Offline- und interaktives Szenenrendering mit CUDAapps/yview.cpp
: interaktive SzenenanzeigeHier sind einige Testbilder, die mit dem Path Tracer gerendert wurden. Weitere Bilder finden Sie auf der Projektseite.
Yocto/GL folgt einem „datenorientierten Programmiermodell“, das Daten explizit macht. Daten werden in einfachen Strukturen gespeichert und mit kostenlosen Funktionen oder direkt abgerufen. Alle Daten sind öffentlich, daher unternehmen wir keinen Versuch einer Kapselung. Wir tun dies, da Yocto/GL dadurch einfacher zu erweitern und schneller zu erlernen ist und ein expliziterer Datenfluss vorliegt, der beim Schreiben von parallelem Code einfacher ist. Da Yocto/GL hauptsächlich für Forschung und Lehre verwendet wird, sind explizite Daten sowohl hackbarer als auch leichter zu verstehen.
Fast alle Objekte in Yocto/GL haben eine Wertesemantik. Dies bedeutet, dass alles problemlos kopiert und serialisiert werden kann und keine Speicherverwaltung erforderlich ist. Dies hat zwar den Nachteil, dass möglicherweise falsche Kopien entstehen, bietet aber auch den Vorteil, dass keine Speicherbeschädigung auftreten kann, was für unerfahrene C++-Benutzer ein großes Problem darstellte, selbst in einer sehr kleinen Bibliothek wie dieser.
Was den Codestil betrifft, bevorzugen wir einen funktionalen Ansatz gegenüber einem objektorientierten Ansatz und bevorzugen freie Funktionen gegenüber Klassenmethoden. Alle Funktionen und Daten sind im yocto
-Namespace definiert, sodass Bibliotheken sich gegenseitig problemlos aufrufen können.
Die Verwendung von Vorlagen in Yocto war der Grund für viele Umgestaltungen, die von keiner Vorlage zu einer intensiven Verwendung von Vorlagen führten. An dieser Stelle verwendet Yocto einige Vorlagen zur besseren Lesbarkeit. In Zukunft werden wir die Verwendung von Vorlagen im Mathematikcode verstärken und gleichzeitig viele APIs explizit typisieren lassen.
Für die Fehlerbehandlung in IO geben wir entweder ein Statusobjekt oder eine Schnittstelle zurück, die boolesche Flags und Fehlerzeichenfolgen verwendet. Intern werden Ausnahmen verwendet, wenn sie von externen Bibliotheken verwendet werden, ansonsten werden jedoch keine Ausnahmen verwendet. Derzeit werden Ausnahmen nur dazu verwendet, „Programmiererfehler“ zu melden, nämlich wenn Vor- oder Nachbedingungen in Funktionen verletzt werden, wie dies bei der Standardbibliothek der Fall ist.
Die Bibliothek wird unter der MIT-Lizenz veröffentlicht. Wir integrieren verschiedene externe Abhängigkeiten in die Distribution, die jeweils über eine eigene Lizenz verfügen, die mit der gewählten kompatibel ist.
Diese Bibliothek erfordert einen C++17-Compiler und kann unter OsX (Xcode >= 11), Windows (MSVC >= 2019) und Linux (gcc >= 9, clang >= 9) kompiliert werden.
Sie können die Beispielanwendungen mit CMake mit mkdir build; cd build; cmake ..; cmake --build .
Die für Yocto/GL erforderlichen Abhängigkeiten sind in der Distribution enthalten und müssen nicht separat installiert werden.
Yocto/GL unterstützt optional die Erstellung von OpenGL-Demos. Die OpenGL-Unterstützung wird durch die Definition der cmake-Option YOCTO_OPENGL
aktiviert. OpenGL-Abhängigkeiten sind in diesem Repo enthalten.
Yocto/GL unterstützt optional die Verwendung von Intels Embree für Raycasting. Informationen zum Verknüpfen finden Sie in der CMake-Hauptdatei. Die Embree-Unterstützung wird durch die Definition der cmake-Option YOCTO_EMBREE
aktiviert. Embree muss separat installiert werden.
Yocto/GL unterstützt optional die Verwendung von Intels Open Image Denoise zur Rauschunterdrückung. Informationen zum Verknüpfen finden Sie in der CMake-Hauptdatei. Die Open Image Denoise-Unterstützung wird durch die Definition der cmake-Option YOCTO_DENOISE
aktiviert. OIDN muss separat installiert werden.