Global Illumination - Ray Tracing

 

Ray Tracing

 

 

Ray Tracing 기법은 물리적으로 정확한 조명을 계산하여 현실적인 이미지를 생성한다.

 

이미지를 생성하기 위해 이미지 평면의 각 픽셀에서 광선의 경로를 추적하고,

빛이 가상의 객체와 상호작용할 때 발생하는 다양한 효과를 시뮬레이션한다.

 

 

 

ViewShadow Ray를 사용하여 구현하는데

여기에서 view ray는 카메라에서 시작해 장면의 객체에 도달하는 광선을 말하고

shadow ray는 객체에서 광원으로 향하는 광선으로, 그림자 여부를 결정한다.

 

 

 

카메라(view)에서 광선을 쏘아 장면 속 객체와의 충돌 지점을 계산하면

이 충돌 지점에서 반사, 굴절, 흡수 등 빛의 물리적 상호작용을 시뮬레이션한다.

 

 

 

 

 

 

 

 

 


Ray Tracing의 기본 아이디어는 광원이 방출한 빛의 경로를 관찰자의 시점까지 추적하는 것이다.

 

광원으로부터 나오는 자연적인 빛의 흐름인 Forward Mapping (전방 매핑)은 광원의 빛이 객체와 상호작용 후 관찰자에게 도달하기 때문에 계산 비용이 매우 크다.

 

하지만, 광선을 관찰자(카메라)에서 시작해서 각 샘플을 통해 광원이나 다른 객체를 추적하는 Backward Mapping (역방향 매핑, Ray Tracing)은 더 적은 광선으로 효율적 계산 가능하다.

 

 

 

 

소스에서 모든 광선을 추적하면 비효율적이므로, 관찰자로부터 거슬러 추적하는 방식을 선택한 Ray Tracing은

효율성을 위해 Forward Mapping보다 Backward Mapping을 주로 사용한다.

 

 

 

 

 

 

 

 

 

Ray Tracing 알고리즘

 

 

2D 이미지 공간으로 가정한 상황에서 관찰자는 z축에서 평행 투영 또는 원근 투영을 사용한다고 가정한다.

 

기본적으로 이미지 픽셀의 중심에서 출발하여 장면으로 들어가는 1차 광선(Primary Ray) 생성하면

광선과 가장 가까운 객체에서 광선이 처음으로 충돌하는 객체를 식별하여 교차점을 계산한다.

 

교차점을 기반으로 조명 모델을 사용하여 해당 지점에서 빛의 직접적인 기여도를 계산하고

반사광선(Reflection Ray) 및 굴절광선(Refraction Ray)을 재귀적으로 생성해서 추가적인 계산을 한다.

 

 

 

 

 

 

 

Ray Tracing vs. Scan Conversion

 

 

camera view 앞에 있는 pixel buffer를 스캔하는 방식이 전에 배웠던 Scan Conversion과 유사하지 않나 생각이 들 수 있다.

 

 

Scan Conversion은 기본적으로 3D → 2D 변환을 통해 이미지를 생성한다.

기하학적 객체를 삼각형 단위로 변환 후, 각 삼각형을 2D 이미지 평면으로 매핑한다.

 

객체 단위로 렌더링하고, 단순하지만 광학 효과는 제한적이다.

 

 

 

반면, Ray Tracing은 3D → 이미지로 변환한다.

추가적인 삼각형 변환 과정 없이, 픽셀 단위로 광선을 추적하여 기하광학적 효과를 시뮬레이션한다.

 

이를 통해 물리적으로 더 정확한 반사, 굴절, 그림자 표현이 가능하다.

 

 

 

두 경우를 비교해보자면

Scan Conversion은 빠르지만 광학 효과가 제한적이고

Ray Tracing은 계산량이 많지만 현실감 높은 결과를 생성할 수 있다.

 

 

 

 

 

 

광선 방정식

 

 

기본적으로 1차 선형 방정식이다.

R(t) = E + t(P − E),   t ∈ [ 1, +∞ ]

 

  • : 카메라의 위치 (광선의 시작점).
  • : 화면 픽셀의 중심점.
  • : 광선의 진행 거리.
  • : 카메라를 통과하는 초기 상태.
  • t = 1: 화면 픽셀 중심에서 광선이 시작.

 

 

 

 

 

만약 광선이 구를 지나서 교차점을 생성할 경우

 

우선, 객체를 포함하는 경계 볼륨(박스나 구)을 사용하여 교차 계산을 단순화시키고

광선이 경계 볼륨과 교차하지 않으면 내부 객체 계산을 생략한다.

 

 

 

교차점이 발생한다면

위의 Ray 방정식에 구의 방정식을 대입하여 2차방정식의 해를 근의공식을 통해 구하고,

해의 조건이 2개 이상인지, 1개인지, 아니면 해가 없는지 등을 통해 ray의 intersection 형태 여부를 알 수 있다.

 

 

또한 ray가 물체의  먼저 닿는 부분은 두 개의 해 중에서 작은 부분에 해당한다.

 

 

 

이렇게 처음 ray와의 교차점을 찾고, 교차점과 원의 중심 거리를 통해 (각 위치를 빼서) normal vector를 구한다.

 

 

 

 

 

 

 

구가 아닌 일반 평면 물체와 교차점이 발생할 경우

이 때의 표면은 평평하기 때문에 비교적 쉽게 바로 normal vector를 구할 수 있다.

 

 

 

 

 

 

 

삼각형과 ray가 만나서 교차점을 발생시키는 경우는

P와 각 꼭짓점 T들의 벡터를 외적하여 법선 벡터 N을 얻고,

P-P0 벡터와 N을 내적하여 그 각도가 0보다 작다면 False를 반환한다.

 

 

 

 

 

 

 

그런데 Ray Tracing은 픽셀 단위로 광선을 추적하므로 계산 비용이 높다.

고비용 계산 문제를 해결하기 위해 Bounding Volume, BVH, 공간 분할 기술 등이 활용된다.

 

 

 

 

 

 


Bounding Volumes (경계 볼륨)

 

 

간단한 모양의 경계 볼륨(구 또는 박스)과 먼저 교차를 검사한다.

광선이 경계 볼륨과 교차하지 않으면 내부의 복잡한 계산을 완전히 생략할 수 있기 때문에 사용한다.

 

 

원래는 복잡한 장면 구조를 검사해야 하지만(왼쪽), 경계 볼륨(박스)을 사용하여 교차 계산을 단순화했다.(오른쪽)

 

 

 

 

 

 

Bounding Volume Hierarchies (BVH)

 

 

계층 구조(트리)로 경계 볼륨을 구성하여 intersection 테스트를 가속화시키는 방법이다.

노드의 경계 볼륨과 교차할 경우에만 하위 객체를 검사한다.

즉, 특정 노드에서 광선과 교차하지 않으면 해당 노드의 하위 경계 볼륨은 계산에서 제외된다.

 

 

 

위 트리에서 루트 노드(root node)는 전체 장면(scene)을 감싸는 큰 경계 볼륨으로 시작한다.

각 노드(node)는 더 작은 경계 볼륨으로 분할되고, 최종적으로 각 리프 노드(leaf node)는 개별 객체를 포함하는 구조다.

 

 

 

 

 

 

 

 

 

 

Advanced Ray-Tracing Techniques (고급 레이 트레이싱 기법)

 

 

이제 Ray Casting 기법을 사용하여 광원과 직접적인 상호작용을 계산한다. (local illumination)

 

기본적인 ray 유형은 다음과 같다.

  • Shadow Ray (그림자 광선): 광원이 가려져 그림자가 생기는지 판단.
  • Reflection Ray (반사 광선): 광선이 표면에 반사되는 경로를 계산.
  • Refracted Ray (굴절 광선): 광선이 물체를 통과하며 굴절되는 경로를 계산.

 

 

 

 

 

 

 

 

Shadow Rays (그림자 광선)

 

S는 표면의 교차점, L은 광원의 위치다.

 

이렇게 광선이 광원으로 향하는 경로에서 장애물(가리는 물체)을 탐지하여 그림자를 계산한다.

 

광선 경로에 장애물이 없는 경우는 광원이 표면을 직접적으로 비추고,

광선 경로에 장애물이 있는 경우는 표면에 그림자가 생긴다.

 

 

 

 

 

 

그래서 경로상에 장애물이 없다면 일반 조명 모델(예: Phong 모델)로 표면을 계산하고

장애물이 있다면 광원은 생략하지만 주변광(ambient light)은 유지시킨다.

 

 

 

 

 

 

 

Reflection Ray (반사 광선)

 

S는 표면에서의 교차점, B는 반사 벡터를 나타낸다.

 

 

재귀적 셰이딩 (Recursive Shading)을 사용하여 반사를 계산한다.

 

  1. 광선이 표면에 반사된 후 다음 광선을 따라 계속 추적.
  2. 반사된 광선도 마치 관찰자의 시야 광선처럼 처리.
  3. 각 반사 지점에서 색상을 계산하고 결과를 합산.

 

 

 

 

 

 

 

 

Refracted Ray (굴절 광선)

 

 

투명한 물질의 빛을 굴절시킨다.

스넬의 법칙(Snell's Law)을 사용해 빛의 굴절 계산한다.

이 법칙에서 n은 입사 및 투과 매질의 굴절률, θ는 입사 및 굴절각을 말한다.

 

 

 

 

 

 


 

 

 

 

 

 

Distributed Ray Tracing (분산 레이 트레이싱)

 

 

여러 방향으로 분산된 광선을 추적해 더 부드럽고 사실적인 효과를 생성한다.

 

이를 이용하여 아래에 구현 가능한 여러가지 효과들이 있다.

 

 

 

 

 


Soft Shadow (부드러운 그림자)

 

면적 광원에서 그림자가 부드럽게 변하는 효과.

그림자 광선을 광원 전체에 분산하여 계산한다.

 

 

 

 

 

 

Glossy Reflection (반짝이는 반사)

 

표면이 완벽히 매끄럽지 않은 경우 반사가 퍼지는 효과.

 

 

 

 

 

 

 

Glossy Translucency (반투명 효과)

 

빛이 재질을 통과하며 흐릿하게 분산.

    •  

 

 

 

 

 

Motion Blur (모션 블러)

 

시간 변화에 따라 광선을 분산시켜 움직임을 표현.

  •  

 

 

 

 

 

 

Depth of Field (초점 심도)

 

렌즈 효과를 시뮬레이션하여 특정 거리에서만 초점을 맞춘다.

 

카메라와 달리, 렌즈를 사용하는 경우 초점 거리 외의 영역이 흐려지기 때문에

광선을 렌즈 어셈블리 전반에 걸쳐 분산하여 초점 심도 효과를 생성한다.

 

 

초점 평면(Focal Plane)에 위치한 광선만 선명하게 렌더링하여 구현한다.

픽셀당 다중 광선을 통해 흐림 효과를 구현한다.