A collection of small C++17 libraries for building data-oriented physically-based graphics algorithms.
Yocto/GL is a collection of tiny C++ libraries for building physically-based graphics algorithms. It provides modular components for math, color, geometry, shading, image processing, shape manipulation, scene representation, and path tracing, all designed with a data-oriented style. It solves the need for a simple, hackable, and educational codebase for graphics research and development.
Graphics researchers, educators, and developers who need a lightweight, modular C++ library for building or learning physically-based rendering algorithms, especially those valuing explicit data flow and ease of extension.
Developers choose Yocto/GL for its data-oriented design that makes graphics algorithms transparent and easy to modify, its modular structure that simplifies navigation and use, and its focus on value semantics that reduces memory management errors, making it ideal for experimentation and teaching.
Yocto/GL: Tiny C++ Libraries for Data-Driven Physically-based Graphics
Open-Awesome is built by the community, for the community. Submit a project, suggest an awesome list, or help improve the catalog on GitHub.
Libraries are split into focused headers like yocto_math and yocto_trace, making code navigation and selective use straightforward for building custom graphics algorithms.
Data is stored in simple structs with public access and free functions, enhancing hackability and ease of learning, as emphasized in the design philosophy for research and teaching.
Value semantics ensure objects can be copied and serialized easily, reducing memory management errors and simplifying data handling, which benefits novice C++ users.
Includes a path tracer with support for area lighting, GGX models, and subsurface scattering, providing a ready-to-use physically-based renderer for surfaces and hairs.
Value semantics and explicit data structures may introduce overhead from spurious copies, potentially affecting performance in intensive applications compared to optimized, cache-friendly designs.
Features like Embree for ray casting and Open Image Denoise require separate installation and CMake configuration, adding setup complexity beyond the included dependencies.
Uses a mix of status objects and boolean flags without exceptions, which can be less intuitive and harder to debug than modern C++ error patterns, as noted in the design considerations.