Luz:从零构建的 C++20 路径追踪器

Luz 是一个高性能的 C++20 路径追踪器,完全从零开始开发,未使用任何第三方库。它实现了 Monte Carlo 路径追踪和全局光照,利用多线程 CPU 渲染器生成写实渲染图像。

核心渲染能力

Luz 提供了一套完整的渲染特性,旨在实现物理精度和高效性。引擎支持多种几何原语,包括球体、平面、矩形、三角形、立方体、体积以及 OBJ 网格。

材质与光照

为了实现真实的光交互,Luz 实现了多种材质类型和光照模型:

  • 材质:支持 Lambertian(漫反射)、金属、介质(折射)、自发光和各向同性材质。
  • 光照:支持面积光、点光、球形光和方向光源。
  • 采样:引擎使用基于概率密度函数(PDF)的重要性采样,以降低噪声并提升收敛速度。

高级视觉效果

除了基础的光线追踪,Luz 还包含后处理和大气管线:

  • 大气模拟:加入散射效果,实现逼真的天空和空中视角。
  • 相机效果:景深、抗锯齿、曝光补偿、对比度调节、色调映射、伽马校正和泛光。
  • 输出格式:渲染结果导出为 BMP 和 TIFF 文件。

性能优化与加速

Luz 采用多项技术策略,以在基于 CPU 的渲染中保持合理的性能。

BVH 加速

为处理包含大量对象的复杂场景,Luz 使用包围体层次结构(BVH)加速。该 BVH 采用分箱表面面积启发式(SAH)构建,并使用近先遍历以最小化相交测试次数。

自适应采样与去噪

为优化渲染时间,Luz 实现了自适应像素采样。引擎首先渲染最少样本数(由 --adaptive-min-samples 定义),随后定期检查亮度和 RGB 置信区间,以判断像素是否已收敛。这可以防止在已达到稳定颜色的像素上浪费计算资源。

此外,Luz 还提供了类似 NFOR 的特征缓冲去噪器。用户可以生成去噪后的伴随图像(render_denoised.bmp),这在预览或降低获得干净图像所需的总样本数时尤为有用。

工具与集成

Luz 旨在通过自定义场景文件和外部导出器,集成到现有的 3D 工作流中。

Blender 集成

Luz 包含一个基于 Python 的导出器,允许用户将 Blender 场景转移为 .luz 格式。该工具利用 Blender 的 Python API 编写必要的场景文件,并导出 OBJ 网格供 Luz 渲染使用。

构建与基准测试

该项目使用 C++20 编写,可通过 Makefile 或 CMake 3.16+ 编译。为获得最高性能,构建系统默认使用 -O3 优化、-march=native 进行 CPU 特定调优,并启用链接时优化(LTO)。

Luz 还包含一个确定性的基准测试框架,提供渲染、去噪和后处理时间的详细拆分,帮助开发者衡量代码改动对性能的影响。

社区视角与发展

项目由用户 martiano 开发,最初是受《Ray Tracing in One Weekend》系列启发的个人项目。作者指出,最初的代码并未使用 AI,但近期的清理和功能添加中使用了 AI 工具。

开发者社区的讨论凸显了构建光线追踪器作为图形程序员“入门仪式”的持久吸引力。虽然有用户认为 “without AI” 已成为类似 “written in Rust” 的营销噱头,另一些人则强调光线追踪概念的简洁性与实现的复杂性,使其成为一种令人满意的技术挑战。

“光线追踪是那类概念上极其简单,却因为实现中的种种挑战而持续占据大量注意力的问题。”

技术规格概览

功能 实现
语言 C++20
依赖 零第三方库
加速 使用分箱 SAH 的 BVH
采样 Monte Carlo / 自适应
去噪 类 NFOR 特征缓冲
兼容性 macOS、Linux、Windows

Sources