Luz: 처음부터 만든 C++20 경로 추적기
Luz는 서드파티 라이브러리를 전혀 사용하지 않고 처음부터 개발된 고성능 C++20 경로 추적기입니다. Monte Carlo 경로 추적과 전역 조명을 구현하여 멀티스레드 CPU 렌더러로 포토리얼리스틱한 이미지를 생성합니다.
핵심 렌더링 기능
Luz는 물리적 정확성과 효율성을 목표로 한 포괄적인 렌더링 기능을 제공합니다. 엔진은 구, 평면, 직사각형, 삼각형, 큐브, 볼륨, OBJ 메쉬 등 다양한 기하 프리미티브를 지원합니다.
재질 및 조명
실제와 같은 빛 상호작용을 위해 Luz는 여러 재질 유형과 조명 모델을 구현합니다:
- 재질: Lambertian(확산), 금속, 유전체(굴절), 방사형, 등방성 재질을 지원합니다.
- 조명: 면광, 점광, 구광, 방향성 광원을 지원합니다.
- 샘플링: 엔진은 확률 밀도 함수(PDF)를 이용한 중요도 샘플링을 사용해 노이즈를 줄이고 수렴 속도를 높입니다.
고급 시각 효과
기본 레이 트레이싱을 넘어 Luz는 후처리 및 대기 환경 파이프라인을 포함합니다:
- 대기 시뮬레이션: 현실적인 하늘과 공중 시점을 위한 산란 효과를 포함합니다.
- 카메라 효과: 심도, 안티앨리어싱, 노출 보정, 대비 조정, 톤 매핑, 감마 보정, 블룸을 지원합니다.
- 출력 포맷: 렌더 결과는 BMP와 TIFF 파일로 내보냅니다.
성능 최적화 및 가속
Luz는 CPU 기반 렌더링에서 합리적인 성능을 유지하기 위해 여러 기술 전략을 사용합니다.
BVH 가속
많은 객체가 있는 복잡한 장면을 처리하기 위해 Luz는 Bounding Volume Hierarchy(BVH) 가속을 사용합니다. 여기에는 binned Surface Area Heuristic(SAH)으로 구축된 패킹된 메쉬 BVH와 교차 테스트를 최소화하는 near‑first 트래버설이 포함됩니다.
적응형 샘플링 및 디노이징
렌더 시간을 최적화하기 위해 Luz는 적응형 픽셀당 샘플링을 구현합니다. 엔진은 최소 샘플 수(--adaptive-min-samples 로 정의)를 렌더한 뒤 주기적으로 휘도와 RGB 신뢰 구간을 확인해 픽셀이 수렴했는지 판단합니다. 이를 통해 이미 안정된 색을 가진 픽셀에 대한 불필요한 연산을 방지합니다.
또한 Luz는 NFOR‑style feature‑buffer 디노이저를 제공합니다. 이를 통해 사용자는 디노이즈된 보조 이미지(render_denoised.bmp)를 생성할 수 있으며, 이는 미리보기나 깨끗한 이미지를 얻기 위한 전체 샘플 수를 줄이는 데 특히 유용합니다.
도구 및 통합
Luz는 사용자 정의 씬 파일과 외부 익스포터를 통해 기존 3D 워크플로에 통합되도록 설계되었습니다.
Blender 통합
Luz는 Blender에서 .luz 포맷으로 씬을 전송할 수 있는 Python 기반 익스포터를 포함합니다. 이 도구는 Blender의 Python API를 활용해 필요한 씬 파일을 작성하고 렌더링에 사용할 OBJ 메쉬를 내보냅니다.
빌드 및 벤치마킹
프로젝트는 C++20으로 작성되었으며 Makefile 또는 CMake 3.16+으로 컴파일할 수 있습니다. 최대 성능을 위해 빌드 시스템은 기본적으로 -O3 최적화, CPU에 특화된 튜닝을 위한 -march=native, 그리고 링크 타임 최적화(LTO)를 적용합니다.
Luz는 또한 렌더, 디노이즈, 후처리 시간을 상세히 분해해 보여주는 결정론적 벤치마크 하니스도 포함하고 있어, 개발자가 코드 변경이 성능에 미치는 영향을 측정할 수 있습니다.
커뮤니티 관점 및 개발
사용자 martiano가 개발한 Luz는 "Ray Tracing in One Weekend" 시리즈에서 영감을 받은 개인 프로젝트로 시작되었습니다. 저자는 초기에는 AI 없이 코딩했지만, 최근 정리와 기능 추가에 AI 도구를 활용했다고 언급했습니다.
개발자 커뮤니티 내 논의는 그래픽 프로그래머에게 "통과 의식"처럼 여겨지는 레이 트레이서 제작의 지속적인 매력을 강조합니다. 일부 사용자는 "AI 없이"가 "Rust로 작성됨"과 유사한 마케팅 후크가 되었다고 지적하는 반면, 다른 이들은 레이 트레이싱이 개념적으로는 단순하지만 구현상의 복잡성 때문에 보람 있는 기술적 도전이라고 강조합니다.
"레이 트레이싱은 개념적으로는 매우 단순하지만, 구현상의 모든 도전 때문에 여전히 많은 관심을 받는 문제이다."
기술 사양 요약
| Feature | Implementation |
|---|---|
| Language | C++20 |
| Dependencies | Zero third-party libraries |
| Acceleration | BVH with binned SAH |
| Sampling | Monte Carlo / Adaptive |
| Denoising | NFOR-style feature-buffer |
| Compatibility | macOS, Linux, Windows |