miniRT
ray tracing
miniRT는 CPU 기반의 레이 트레이서(ray tracer)를 C로 직접 구현하는 과제이다. FDF의 와이어프레임 렌더링과 달리, 광선이 물체에 닿았을 때의 조명과 음영을 계산하여 보다 현실감 있는 3차원 렌더링 결과물을 만들어낸다.
- 개발 기간: 2024.06 ~ 2024.07
- 과정: 42 Seoul Inner Circle
- 언어: C
- GitHub: https://github.com/Budnarae/42_innercircle_course/tree/main/miniRT
- 팀 멤버:
- 담당 역할 : 광선-기하 교차 판정, Phong 조명 모델, 하드 섀도우, 범프맵 텍스처 매핑 구현
개요
레이 트레이싱은 카메라에서 각 픽셀 방향으로 광선(ray)을 쏘고, 그 광선이 씬(scene)의 물체와 교차하는 지점에서 조명을 계산해 색상을 결정하는 렌더링 기법이다.
miniRT는 .rt 파일로 작성된 씬 정보를 파싱하여 렌더링한다. 씬 파일에는 다음 정보가 담긴다.
| 요소 | 설명 |
|---|---|
| 환경광 (Ambient Light) | 씬 전체에 균일하게 적용되는 기본 밝기 |
| 카메라 (Camera) | 렌더링 시점, 방향, 시야각(FOV) |
| 광원 (Light) | 점광원의 위치와 밝기 |
| 구체 (Sphere) | 중심 좌표, 반지름 |
| 평면 (Plane) | 평면 위의 점, 법선 벡터 |
| 원기둥 (Cylinder) | 중심 좌표, 축 방향, 반지름, 높이 |
아래와 같이 실행한다.
./miniRT rtFileName.rt구현 내용
광선-기하 교차 판정 (Ray-Primitive Intersection)
카메라에서 쏜 광선이 구체, 평면, 원기둥과 교차하는지, 교차한다면 어느 지점인지를 기하학적으로 계산한다. 교차 지점의 법선 벡터를 구하는 것이 조명 계산의 출발점이 된다.
Phong 조명 모델
교차 지점의 색상을 결정하기 위해 세 가지 조명 성분을 합산한다.
- Ambient: 씬 전체에 균일하게 더해지는 기본 밝기
- Diffuse: 빛의 방향과 법선 벡터의 각도에 따라 결정되는 난반사
- Specular: 빛이 반사되어 카메라 방향으로 들어오는 정반사 하이라이트
하드 섀도우 (Hard Shadow)
교차 지점에서 광원 방향으로 새로운 광선(shadow ray)을 쏴, 중간에 다른 물체가 가로막고 있으면 해당 지점을 그림자로 처리한다.
씬 파일 파싱
.rt 파일을 읽어 씬을 구성하는 모든 요소(카메라, 광원, 오브젝트)를 파싱하고 내부 자료구조로 변환한다.
보너스 구현
- 씬 파일의 첫 번째 평면에 범프맵(bump map) 텍스처 매핑
- 씬 파일의 첫 번째 구체에 체크 무늬(checker pattern) 적용
실행 방법
예제 .rt 파일들은 maps 경로에 위치해 있다.
./miniRT ./maps/example.rt