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 |