Yocto/GL est une collection de petites bibliothèques C++17 pour construire des algorithmes graphiques basés sur la physique, publiés sous licence MIT. Yocto/GL est écrit dans un style délibérément orienté données pour faciliter le développement et l'utilisation. Yocto/GL est divisé en petites bibliothèques pour faciliter la navigation dans le code. Voir chaque fichier d'en-tête pour la documentation.
yocto/yocto_math.{h}
: vecteurs de taille fixe, matrices, cadres rigides, transformationsyocto/yocto_color.{h}
: conversion des couleurs, ajustement des couleurs, fonctions de mappage de tons, étalonnage des couleurs, cartes de couleurs, espaces colorimétriquesyocto/yocto_geometry.{h}
: rayons, boîtes englobantes, fonctions géométriques, intersection primitive de rayon, chevauchement primitif de pointyocto/yocto_noise.{h}
: Bruit Perlinyocto/yocto_sampling.{h}
: génération de nombres aléatoires, génération de points et de directions, utilitaires de Monte Carloyocto/yocto_shading.{h}
: évaluation et échantillonnage des fonctions de Fresnel, lobes bsdf, lobes de transmission, fonctions de phaseyocto/yocto_image.{h,cpp}
: type de données d'image simple, redimensionnement d'image, mappage de tons, correction des couleurs, images procédurales, soleil-ciel procéduralyocto/yocto_shape.{h,cpp}
: structure de données de forme simple, utilitaires pour manipuler les maillages triangulaires, les maillages quads et les ensembles de lignes, calcul des normales et des tangentes, subdivision linéaire et Catmull-Clark, génération de formes procédurales, intersection de rayons et requêtes de points les plus prochesyocto/yocto_scene.{h,cpp}
: représentation de la scène et évaluation des propriétésyocto/yocto_bvh.{h,cpp}
: requêtes d'intersection de rayons et de points les plus proches de maillages triangulaires, de maillages quads, d'ensembles de lignes et de scènes d'instances utilisant une hiérarchie de volumes englobants à deux niveauxyocto/yocto_trace.{h,cpp}
: traçage de chemins de surfaces et de poils prenant en charge l'éclairage de zones et d'environnements, GGX de microfacettes et diffusion souterraine, échantillonnage d'importance multipleyocto/yocto_sceneio.{h,cpp}
: sérialisation d'images, de formes et de scènesyocto/yocto_modelio.{h,cpp}
: analyse et écriture bas niveau pour les formats Ply, Obj, Stlyocto/yocto_pbrtio.{h,cpp}
: analyse et écriture bas niveau pour le format Pbrtyocto/yocto_cli.{h}
: utilitaires d'impression et analyse en ligne de commandeyocto/yocto_parallel.h
: utilitaires de concurrence (obsolète)Vous pouvez voir Yocto/GL en action dans les applications suivantes écrites pour tester la bibliothèque :
apps/ytonemap.cpp
: conversion et visualisation d'imagesapps/ycolorgrade.cpp
: étalonnage des couleurs de l'imageapps/yconvert.cpp
: conversion de scèneapps/yconverts.cpp
: conversion de formeapps/ytrace.cpp
: rendu de scène hors ligne et interactifapps/ycutrace.cpp
: rendu de scènes hors ligne et interactif avec CUDAapps/yview.cpp
: visualisation interactive de scènesVoici quelques images de test rendues avec le traceur de chemin. Plus d'images sont incluses sur le site du projet.
Yocto/GL suit un "modèle de programmation orienté données" qui rend les données explicites. Les données sont stockées dans des structures simples et accessibles avec des fonctions gratuites ou directement. Toutes les données sont publiques, nous ne faisons donc aucune tentative d'encapsulation. Nous faisons cela car cela rend Yocto/GL plus facile à étendre et plus rapide à apprendre, avec un flux de données plus explicite et plus facile lors de l'écriture de code parallèle. Puisque Yocto/GL est principalement utilisé pour la recherche et l'enseignement, les données explicites sont à la fois plus hackables et plus faciles à comprendre.
Presque tous les objets dans Yocto/GL ont une valeur sémantique. Cela signifie que tout peut être copié et sérialisé de manière triviale et qu'il n'y a pas besoin de gestion de la mémoire. Bien que cela présente l'inconvénient d'introduire potentiellement de fausses copies, cela présente l'avantage de garantir qu'aucune corruption de la mémoire ne puisse se produire, ce qui s'est avéré être un problème majeur pour les utilisateurs novices de C++, même dans une très petite bibliothèque comme celle-ci.
En termes de style de code, nous préférons une approche fonctionnelle plutôt qu'orientée objet, privilégiant les fonctions libres aux méthodes de classe. Toutes les fonctions et données sont définies dans l'espace de noms yocto
afin que les bibliothèques puissent s'appeler de manière triviale.
L'utilisation de templates dans Yocto a été à l'origine de nombreuses refactorisations, allant de l'absence de template à une utilisation intensive de templates. A ce stade, Yocto utilise quelques modèles pour plus de lisibilité. À l’avenir, nous augmenterons l’utilisation de modèles dans le code mathématique, tout en conservant de nombreuses API explicitement typées.
Pour la gestion des erreurs dans IO, nous renvoyons soit un objet d'état, soit une interface qui utilise des indicateurs booléens et des chaînes d'erreur. En interne, les exceptions sont utilisées lorsqu'elles sont utilisées par des bibliothèques externes, mais sinon aucune exception n'est utilisée. Pour le moment, les exceptions ne sont utilisées que pour signaler des "erreurs de programmation", à savoir lorsque les conditions préalables ou post-conditions sont violées dans les fonctions, comme le fait la bibliothèque standard.
La bibliothèque est publiée sous licence MIT. Nous incluons diverses dépendances externes dans la distribution qui ont chacune leur propre licence, compatible avec celle choisie.
Cette bibliothèque nécessite un compilateur C++17 et est connue pour être compilée sur OsX (Xcode >= 11), Windows (MSVC >= 2019) et Linux (gcc >= 9, clang >= 9).
Vous pouvez créer les exemples d'applications en utilisant CMake avec mkdir build; cd build; cmake ..; cmake --build .
Les dépendances requises par Yocto/GL sont incluses dans la distribution et n'ont pas besoin d'être installées séparément.
Yocto/GL supporte en option la construction de démos OpenGL. La prise en charge d'OpenGL est activée en définissant l'option cmake YOCTO_OPENGL
. Les dépendances OpenGL sont incluses dans ce dépôt.
Yocto/GL supporte en option l'utilisation d'Embree d'Intel pour le ray casting. Consultez le fichier CMake principal pour savoir comment créer un lien vers celui-ci. La prise en charge d'Embree est activée en définissant l'option cmake YOCTO_EMBREE
. Embree doit être installé séparément.
Yocto/GL supporte en option l'utilisation d'Open Image Denoise d'Intel pour le débruitage. Consultez le fichier CMake principal pour savoir comment créer un lien vers celui-ci. La prise en charge d'Open Image Denoise est activée en définissant l'option cmake YOCTO_DENOISE
. OIDN doit être installé séparément.