Luz: 從零開始構建的 C++20 路徑追蹤器
Luz 是一款高性能的 C++20 路徑追蹤器,從零開始開發,完全不依賴任何第三方依賴項。它實現了完整的渲染管線,包括蒙特卡羅路徑追蹤、全局光照以及自定義的 BVH (Bounding Volume Hierarchy) 加速結構,以實現複雜場景和 OBJ 網格的渲染。
核心渲染能力
Luz 為基於物理的渲染提供了一套全面的功能,並專注於基於 CPU 的多線程性能。
路徑追蹤與光照
Luz 利用蒙特卡羅路徑追蹤來實現全局光照。它支持廣泛的光源,包括面光源、點光源、球體光源和方向光。引擎處理各種材質類型以模擬真實的光與物質交互作用:
- Lambertian: 用於漫反射表面。
- Metal: 用於反射表面。
- Dielectric: 用於透明/折射材質。
- Emissive: 用於發光幾何體。
- Isotropic: 用於體積散射。
幾何體與加速
為了在渲染複雜網格時保持性能,Luz 實現了帶有分箱 SAH (Surface Area Heuristic) 構建和近首位遍歷的 BVH 加速。引擎支持多種幾何原形,包括球體、平面、矩形、三角形、立方體、體積和導入的 OBJ 網格。
採樣與降噪
Luz 包含先進的採樣技術以減少渲染時間和噪聲:
- Adaptive Sampling: 引擎將最大採樣次數視為限制,並使用漸進式逐像素序列。它監控亮度(luminance)和 RGB 置信區間,以停止對已收斂的像素進行採樣,同時為暗部像素保持保守的最小值,以避免錯過罕見的光照貢獻。
- NFOR-style Denoiser: 通過
--denoise標誌提供特徵緩衝區降噪器,它會生成一張配套的降噪圖像。為了獲得最佳效果,作者建議每像素至少採樣 16 次,以提供足夠的信號讓降噪器估算顏色和特徵統計數據。
技術實現與工具
Luz 旨在實現可移植性和性能,利用了現代 C++ 標準和激進的編譯器優化。
編譯與優化
Luz 需要 C++20 編譯器,並可以使用 Make 或 CMake 3.16+ 進行構建。默認情況下,發布版使用 -O3、原生 CPU 調優 (-march=native) 以及鏈接時優化 (-flto)。對於在不同 CPU 上遇到非法指令崩潰的用戶,作者提供了禁用原生優化和 LTO 的選項。
場景管理與 Blender 集成
場景使用自定義的 .luz 場景文件來定義。為了簡化複雜環境的創建,Luz 包含一個基於 Python 的 Blender 導出器,允許用戶將 Blender 場景導出為 .luz 文件和 OBJ 網格。
後處理與輸出
渲染器包含一套完整的後處理套件,包括:
- 景深與抗鋸齒。
- 曝光補償、對比度調整和色調映射。
- 伽馬校正與泛光 (bloom)。
- 輸出格式包括 BMP 和 TIFF。
社群洞察與背景
從零開始開發光線追蹤器通常被視為計算機圖形學中的「入學儀式」。圍繞 Luz 的討論突顯了這些項目的教育價值以及基礎資源的影響力。
"光線追蹤是那種概念上非常簡單,但由於實現上的種種挑戰,卻持續佔據大量心智資源的問題。"
許多開發者指出,該項目與流行的 Ray Tracing in One Weekend 系列的學習路徑一致,Luz 的作者將其列為主要的靈感來源。該項目的開發跨越了數年,從一個編碼訓練營 (42) 開始,並演變為一個為公開發布而精心打磨的個人項目。