Luz — это трассировщик путей на C++20, написанный с нуля без сторонних зависимостей. Он поддерживает Monte Carlo path tracing, global illumination, BVH acceleration, adaptive sampling, denoising (NFOR-style), атмосферное рассеяние и глубину резкости. Рендеринг многопоточный, выполняется на CPU. Можно задавать сферы, плоскости, прямоугольники, треугольники, кубы, объёмы и OBJ-меши. Материалы: Lambertian, metal, dielectric, emissive, isotropic. Источники света — area, point, sphere, directional. Сцены описываются в файлах .luz, есть конвертер .blend → .luz для Blender.
Собирается через Make или CMake 3.16+, нужен компилятор C++20. На macOS и Linux основной путь — Makefile, на Windows — CMake с MSVC или MinGW, также поддерживается WSL. Релизная сборка включает -O3, -march=native и LTO, что даёт максимальную производительность, но бинарники могут не работать на старых CPU. Если возникают проблемы, можно отключить эти опции через make NATIVE=0 LTO=0 или в CMake -DLUZ_NATIVE_OPTIMIZATIONS=OFF -DLUZ_ENABLE_LTO=OFF.
CLI предоставляет гибкие настройки: количество сэмплов, разрешение, число потоков, seed, включение/отключение bloom, tone mapping, gamma correction, denoising. Пример запуска: ./Luz --file examples/scenes/blender_monkey.luz --samples 50 --resolution 300x300. По умолчанию результат — render.bmp.
Адаптивное сэмплирование воспринимает параметр --samples как максимум на пиксель. Каждый пиксель сначала отрабатывает --adaptive-min-samples, затем периодически проверяет доверительные интервалы по яркости и RGB. Очень тёмные пиксели используют консервативный минимум, чтобы редкость вклада света не принималась за чистый чёрный. Для финальных рендеров авторы советуют высокий максимум сэмплов, например --samples 4096 --adaptive --adaptive-min-samples 512 --adaptive-check-interval 64 --adaptive-threshold 0.005.
Денойзер (NFOR-style) пишет отдельный файл — по умолчанию render_denoised.bmp, можно переопределить через --denoise-output. Ему нужно хотя бы несколько сэмплов на пиксель для осмысленного результата, а для оценки качества — примерно 16+ сэмплов. Очень низкое разрешение делает оценку ненадёжной.
В проекте есть встроенные бенчмарки для сравнения производительности рендера, денойза, постпроцесса и общего счёта. Для запуска: make benchmark BENCH_CPUS=1 BENCH_THREADS=1 > before.csv, затем make benchmark-compare BEFORE=before.csv AFTER=after.csv.
Пути к OBJ-файлам в сценах резолвятся относительно файла сцены, затем рабочей директории, затем assets/objects/. Меши можно сдвигать и назначать материал прямо в .luz. Для экспорта из Blender используется Python-скрипт tools/blender_export_luz.py, который пишет .luz и OBJ-меши.
В структуре кода: include/luz/ — публичные заголовки, src/core/ — математика и материалы, src/renderer/ — рендеринг, src/scene/ — модель сцены, src/io/ — загрузка/сохранение, src/cli/ — точка входа, examples/scenes/ — примеры, assets/objects/ — OBJ-активы, docs/images/ — скриншоты, tools/ — скрипты, tests/ — тесты, docker/ — контейнер для бенчмарков.
Авторы благодарят книжную серию Ray Tracing in One Weekend за вдохновение (написано, что это было до эпохи AI). Модель штурмовика — от @ScottGraham на BlendSwap, бюст статуи — от @geoffreymarchal. Лицензия — MIT.