14 — 레이트레이싱 (Ray Tracing)
출처: SSU 컴퓨터 그래픽스 슬라이드 —
SSU_Intro2CG_14_RayTracing.pdf주차: 14주차
⚠️ 기말 시험범위 제외 — 개념 참고용
교수님이 레이트레이싱은 기말 시험에 출제하지 않는다고 안내했습니다. 이 페이지는 암기·계산 대비용이 아니라 전체 그림을 닫기 위한 짧은 개념 정리입니다. 시험 직전이라면 10–13장과 기말 대비에 시간을 쓰세요.
래스터화(10장)가 삼각형마다 도는 객체 중심이라면, 레이트레이싱은 픽셀마다 광선을 쏘는 이미지 중심 접근입니다. 반사·굴절·그림자 같은 전역 효과를 자연스럽게 담아 사실적인 이미지를 만들지만 느립니다.
1. 큰 그림
- 전역조명(Global Illumination) 은 풀기 어렵습니다 — 광선이 여러 물체와 여러 번 반사되기 때문. 래스터화는 프리미티브를 하나씩 그리므로 다중 반사를 못 다룹니다.
- 전역 접근법: Ray Tracing, Radiosity.
1.1 Forward vs Backward
- Backward(빛 기준 전진): 광원에서 빛을 따라감 → 대부분 광선이 눈에 도달 못 해 비효율.
- Forward(눈 기준 역추적): 눈에서 화면의 한 점을 지나 역으로 추적 → 보이는 광선만 계산해 효율적.
- 보통 "ray tracing" 은 forward(눈에서 출발) 를 가리킵니다.
1.2 래스터화 vs 레이트레이싱 ⭐️
| Rasterization | Ray Tracing | |
|---|---|---|
| 중심 | 객체 중심 (object-centric) | 이미지 중심 (image-centric) |
| 루프 | 삼각형마다 → 덮는 픽셀 | 픽셀마다 → 광선으로 가장 가까운 물체 |
| 가시성 | z-buffer | 광선별 최근접 교차 |
| 속도/품질 | 빠름 / 실시간 | 느림 / 사실적 |
// Ray tracing 의 바깥 루프
for (each pixel in image) {
Ray R = computeRayPassingThroughPixel(x, y);
float tclosest = INFINITY; Triangle closest = NULL;
for (each triangle in scene)
if (intersect(R, triangle, hit) && hit < tclosest) { tclosest = hit; closest = triangle; }
if (closest) image(x,y) = shadeAtHit(closest, tclosest);
}2. 광선의 종류와 재귀
출처: 슬라이드 — Types of Rays / Recursive Ray Tracing (Whitted, 1979)
2.1 광선의 종류
- Primary ray (1차): 눈 → 이미지 평면 → 장면. 안 맞으면 배경색, 맞으면 2차 광선 + 조명 계산.
- Secondary ray (2차): 교차점에서 새로 발사.
- Reflection (R): 반사 방향. Phong 조명에 사용.
- Transmission (T): 굴절 방향(투명).
- Shadow (S): 광원 쪽으로 쏴 그림자 여부 판단. 그림자 광선은 추가 광선을 낳지 않음.
2.2 Ray Tree
교차점마다 2차 광선이 갈라져 광선 트리를 이룹니다(노드=교차점, 엣지=광선). 재귀 종료 조건:
- 어떤 물체와도 안 만남 / 최대 깊이 도달 / 빛이 최소값 이하.
평가는 아래에서 위로(depth-first), 자식 색으로 부모 색 계산.
color trace(point p, vector d, int step) {
if (step > max) return background_color;
q = intersect(p, d, status);
if (status == light_source) return light_source_color;
if (status == no_intersection) return background_color;
n = normal(q);
local = phong(q, n, reflect(q,n));
reflected = trace(q, reflect(q,n), step+1);
transmitted = trace(q, transmit(q,n), step+1);
return local + reflected + transmitted;
}2.3 굴절 (Snell 법칙)
빛이 매질을 지날 때 굴절률에 따라 꺾임 (진공 1.0, 물 1.33, 유리 1.52, 다이아몬드 2.42 등).
3. 광선-물체 교차 (Ray Intersection)
출처: 슬라이드 — Ray Intersection
광선: (원점 , 단위 방향 ).
3.1 Ray-Sphere
구 에 대입 → t 에 대한 이차방정식. 판별식으로 분기:
- : 교차 없음
- : 한 점에서 접함
- : 두 점(진입·진출).
3.2 Ray-Plane
평면 → ( 일 때 유효).
3.3 Ray-Triangle
- 광선-평면 교차로 교차점을 구하고,
- 그 점이 삼각형 안인지 판정 — edge function / 무게중심좌표로 (래스터화와 같은 문제!). 결국 외적 계산.
- Möller-Trumbore (1997) 알고리즘: 를 한 번에 풀고 로 판정.
3.4 Ray-Box / AABB
박스 = 여러 평면. 축 정렬 박스(AABB) 는 슬랩(slab)별 구간의 교집합으로 빠르게 판정.
4. 교차 가속 (Acceleration)
출처: 슬라이드 — Accelerating Ray Intersection
레이트레이싱 시간의 약 75% 가 교차 판정. 모든 광선 × 모든 물체는 너무 느리므로:
- Bounding Volume: 복잡한 물체를 단순 볼륨(Sphere/AABB/OBB)으로 감싸 먼저 볼륨을 검사 → 안 맞으면 물체도 안 맞음.
- Space Partitioning: 3D 공간을 셀로 분할, 셀별 물체 등록 → 광선이 지나는 셀의 물체만 검사.
- Uniform grid, Octree(계층 분할), BSP tree(초평면으로 반공간 분할).
5. 강점과 약점
| 강점 | 약점 |
|---|---|
| 사실성 향상 | 전역조명을 근사만 (모든 광선 추적 불가) |
| 정반사·투명·그림자 | Color bleeding(난반사 간접광) 어려움 |
| 은면 제거 자동 | 픽셀당 계산이 매우 느림 |
| 설계가 단순 | 하드웨어 가속이 어려움 |
최소 레이트레이서는 명함 한 장에 들어갈 만큼 단순(Paul Heckbert)하지만, 다중 구·재귀 반사·굴절·그림자·은면제거·Phong 조명을 모두 담을 수 있습니다.
🔗 학습 마무리
- 이전: 13 — 텍스처 매핑
- 시험 대비 (여기 집중!): 기말 대비 — Numerical Hard Mode
- 레이트레이싱의 교차 판정은 결국 래스터화의 edge function / barycentric 과 같은 도구를 씁니다 — 그 부분은 시험범위이니 연결고리로 기억해 두세요.