Yocto/GL — это набор небольших библиотек C++17 для создания физически обоснованных графических алгоритмов, выпущенных по лицензии MIT. Yocto/GL написан в стиле, специально ориентированном на данные, для простоты разработки и использования. Yocto/GL разделен на небольшие библиотеки, чтобы упростить навигацию по коду. См. документацию по каждому заголовочному файлу.
yocto/yocto_math.{h}
: векторы фиксированного размера, матрицы, жесткие рамки, преобразования.yocto/yocto_color.{h}
: преобразование цвета, настройка цвета, функции отображения тонов, градация цвета, цветовые карты, цветовые пространства.yocto/yocto_geometry.{h}
: лучи, ограничивающие рамки, геометрические функции, пересечение лучевых примитивов, перекрытие точечных примитивов.yocto/yocto_noise.{h}
: шум Перлинаyocto/yocto_sampling.{h}
: генерация случайных чисел, генерация точек и направлений, утилиты Монте-Карло.yocto/yocto_shading.{h}
: оценка и выборка функций Френеля, лепестков bsdf, лепестков пропускания, фазовых функций.yocto/yocto_image.{h,cpp}
: простой тип данных изображения, изменение размера изображения, тональное отображение, коррекция цвета, процедурные изображения, процедурное солнце-небо.yocto/yocto_shape.{h,cpp}
: простая структура данных формы, утилиты для управления сетками треугольников, сетками квадратов и наборами линий, вычислением нормалей и касательных, линейным разделением и подразделением Катмулла-Кларка, процедурной генерацией фигур, пересечением лучей и запросами ближайших точек.yocto/yocto_scene.{h,cpp}
: представление сцены и оценка свойств.yocto/yocto_bvh.{h,cpp}
: запросы пересечения лучей и ближайших точек треугольных сеток, четырехугольников, наборов линий и сцен экземпляров с использованием двухуровневой иерархии ограничивающих объемов.yocto/yocto_trace.{h,cpp}
: трассировка путей поверхностей и волосков, поддерживающая освещение области и окружающей среды, микрофасетное GGX и подповерхностное рассеяние, выборка с множественной важностью.yocto/yocto_sceneio.{h,cpp}
: сериализация изображения, формы и сцены.yocto/yocto_modelio.{h,cpp}
: низкоуровневый анализ и запись для форматов Ply, Obj, Stl.yocto/yocto_pbrtio.{h,cpp}
: низкоуровневый анализ и запись для формата Pbrt.yocto/yocto_cli.{h}
: утилиты печати и анализ командной строки.yocto/yocto_parallel.h
: утилиты параллелизма (устарело)Вы можете увидеть Yocto/GL в действии в следующих приложениях, написанных для тестирования библиотеки:
apps/ytonemap.cpp
: преобразование и просмотр изображенийapps/ycolorgrade.cpp
: цветокоррекция изображенияapps/yconvert.cpp
: преобразование сценыapps/yconverts.cpp
: преобразование формыapps/ytrace.cpp
: автономный и интерактивный рендеринг сцены.apps/ycutrace.cpp
: автономный и интерактивный рендеринг сцены с помощью CUDA.apps/yview.cpp
: интерактивный просмотр сцен.Вот несколько тестовых изображений, созданных с помощью трассировщика пути. Дополнительные изображения размещены на сайте проекта.
Yocto/GL следует «модели программирования, ориентированной на данные», которая делает данные явными. Данные хранятся в простых структурах, доступ к которым осуществляется с помощью бесплатных функций или напрямую. Все данные общедоступны, поэтому мы не предпринимаем попыток инкапсуляции. Мы делаем это, поскольку это упрощает расширение и ускоряет изучение Yocto/GL, а также обеспечивает более явный поток данных, который упрощает написание параллельного кода. Поскольку Yocto/GL в основном используется для исследований и обучения, явные данные легче взломать и понять.
Почти все объекты в Yocto/GL имеют семантику значений. Это означает, что все можно тривиально скопировать и сериализовать и нет необходимости в управлении памятью. Хотя у этого подхода есть недостаток, заключающийся в потенциальном создании поддельных копий, его преимуществом является гарантия отсутствия повреждения памяти, что оказалось серьезной проблемой для начинающих пользователей C++, даже в такой очень маленькой библиотеке, как эта.
С точки зрения стиля кода мы предпочитаем функциональный подход, а не объектно-ориентированный, отдавая предпочтение свободным функциям методам класса. Все функции и данные определены в пространстве имен yocto
поэтому библиотеки могут тривиально вызывать друг друга.
Использование шаблонов в Yocto было причиной многих рефакторингов, начиная от отсутствия шаблонов и заканчивая их интенсивным использованием. На этом этапе Yocto использует некоторые шаблоны для удобства чтения. В будущем мы будем чаще использовать шаблоны в математическом коде, сохраняя при этом явную типизацию многих API.
Для обработки ошибок в вводе-выводе мы либо возвращаем объект состояния, либо интерфейс, который использует логические флаги и строки ошибок. Внутренние исключения используются при использовании внешних библиотек, но в противном случае исключения не используются. На данный момент исключения используются только для сообщения об «ошибках программиста», а именно, когда в функциях нарушаются предусловия или постусловия, как это делает стандартная библиотека.
Библиотека выпущена под лицензией MIT. Мы включаем в дистрибутив различные внешние зависимости, каждая из которых имеет три собственные лицензии, совместимые с выбранной.
Для этой библиотеки требуется компилятор C++17, и она может быть скомпилирована в OsX (Xcode >= 11), Windows (MSVC >= 2019) и Linux (gcc >= 9, clang >= 9).
Вы можете создавать примеры приложений с помощью CMake со mkdir build; cd build; cmake ..; cmake --build .
Требуемые зависимости Yocto/GL включены в дистрибутив и их не нужно устанавливать отдельно.
Yocto/GL дополнительно поддерживает создание демонстраций OpenGL. Поддержка OpenGL включается путем определения параметра cmake YOCTO_OPENGL
. Зависимости OpenGL включены в этот репозиторий.
Yocto/GL дополнительно поддерживает использование Intel Embree для преобразования лучей. См. основной файл CMake, чтобы узнать, как связать его. Поддержка Embree включается путем определения параметра cmake YOCTO_EMBREE
. Embree необходимо устанавливать отдельно.
Yocto/GL дополнительно поддерживает использование Intel Open Image Denoise для шумоподавления. См. основной файл CMake, чтобы узнать, как связать его. Поддержка Open Image Denoise включается путем определения параметра cmake YOCTO_DENOISE
. OIDN необходимо устанавливать отдельно.