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) 開始,並演變為一個為公開發布而精心打磨的個人項目。

Sources