조명(illumination) model은 지역 조명(local illumination)과 전역 조명(global illumination) 두 가지로 구분된다.
퐁 모델은 지역 조명 모델인데,
이는 조명 대상인 물체의 표면 재질과 광원의 속성만 이용해 해당 표면의 색상을 결정할 뿐,
같은 공간에 있는 다른 물체는 고려하지 않는다. (그림(a))
(amibent 항은 간접 조명을 담당하지만, 과도하게 단순화 되어 있어서 사실적인 영상을 만들지 못한다.)
전역 조명 모델은 간접 조명 효과를 담아내기 위해서, 모든 물체를 잠재적인 광원으로 취급한다. (그림(c))
1차 광선(primary ray)
2차 광선(secondary ray): shadow ray, reflection ray, refraction ray
1차 광선 이 어떤 물체와 부딪히면, 그 교차점이 그림자 안에 있는가를 검사하기 위해서,
2차 광선인 shadow ray 을 각 광원을 향해 발사한다.
만약 shadow ray 광원으로 가는 도중 다른 물체와 부딪히면 ➡️ 물체는 광원의 직접적인 영향권에 있지 않으며 그림자 영역에 놓인 것으로 판정한다.
반면, 이 광원에 도달하게 되면 ➡️ 이 광원으로부터 에 입사하는 빛을 이용해 의 직접 조명 색상을 결정한다. (이를 위해서 퐁 모델을 쓸 수 있다.)
shadow ray말고도, 두 가지 2차 광선이 발사된다.
하나는 reflection(반사) ray 인데, 이는 1차 광선이 물체의 normal을 중심으로 반사된 것이다.
또 하나는 refraction(굴절) ray 인데, 이는 1차 광선이 반투명한 물체에 부딪힐 때 발생한다.
refraction ray의 방향은 굴절의 법칙에 따라 정해진다.
재귀적 알고리즘
Ray Tracing 알고리즘은 Ray Tree로 설명될 수 있는 재귀적인 알고리즘이다.
reflection ray, refraction ray가 어떤 물체에도 부딪히지 않고 장면을 벗어날 때 까지 또는 미리 정의된 재귀 단계에 도달할 때까지 확장된다.
예를 들어, Ray Tree 노드 를 생각해보자.
를 tracing해서 얻은 색상은 의 specular 계수와 곱해지고,
를 tracing해서 얻은 색상은 의 투과율(transmission 계수)와 곱해진다.
이 둘은 를 통해서 계산된 '직접 조명 색상'에 더해지고,
그 결과는 부모 노드인 으로 전달된다.
Ray tree의 모든 노드에서 이와 같은 작업이 재귀적으로 진행되면, 최종적으로 root 노드에서의 색상을 얻을 수 있다.
이것이 바로 1차 광선이 부딪힌 점의 색상이 된다.
radiosity 알고리즘은 diffuse 표면을 가진 물체들 사이에서 반사되는 빛을 계산한다.
표면에 부딪힌 빛은 반사되어 다른 물체를 비추게 되므로,
장면을 구성하는 모든 표면은 광원과 같은 역할을 한다.
즉, radiosity 알고리즘은 광원과 이것에 의해 조명되는 물체를 구분하지 않는다.
radiosity를 이용한 전역 조명을 구현하기 위해서는,
1) scene 안에 존재하는 모든 표면을 잘게 나눠 patch들을 만든다.
2) patch 사이의 form factor를 계산한다.
이는 한 patch에서 다른 patch가 얼마만큼 보이는지 계산한 것인데, 두 patch 간 거리 및 각 patch의 방향에 좌우된다.
만약 patch 간 거리가 크고, patch가 서로 정면을 보지않고 기울어져 있다면, form factor는 작은 값을 가질 것이다.
한 patch의 radiosity는 그 patch로부터 나오는 빛의 속도라고 정의되는데,
그 patch가 '직접 빛을 발산하는 속도'에, 그 patch가 '빛을 반사하는 속도'를 더한 것으로 결정된다.
patch 의 radiosity
patch 의 radiosity
patch 의 초기 radiosity
patch 의 반사 계수
: form factor
: patch 에 들어오는 빛(irradiance)
이 식을 다르게 표현하면 아래와 같고,
scene의 모든 patch에 이 식을 적용하면 다음과 같은 linear system을 얻을 수 있고,
이를 풀면 모든 patch의 radiosity를 구할 수 있다.
form factor를 구하는 계산은 다음과 같다.
사이의 visibility를 의미한다. 만약 에서 를 볼 수 있다면 1, 그렇지 않다면 0 값을 갖는다.
: diffrential area
: surface normal
: 와 를 잇는 벡터.
: 와 사이의 각도
radiosity 알고리즘은 실시간에 구현하기에 연산량이 너무 많다.
따라서 실시간 그래픽스의 경우, 보통 전처리 단계에서 이를 실행해서
를 Light map이라는 texture에 저장한 후, runtime에 이 texture를 사용한다.
light map이란?
퐁 모델의 diffuse 항 에서
는 물체로 들어오는 빛(irradiance)인데, 물체와 광원이 모두 고정되어 있다면
이는 변하지 않으므로 이를 미리 계산하여 texture에 저장할 수 있다.
이 texture를 light map이라고 부른다.
light mapping이란?
Run-time에는 light map에서 를 읽어오고,
image texture에서 diffuse 계수 를 읽어와서
둘을 결합한다.
이러한 기법을 light mapping이라고 한다.
light mapping의 장점
light mapping을 사용하면, run-time에 별다른 계산을 하지 않으므로, run-time 성능이 향상된다.
light map은 전처리 단계에서 생성되므로, 연산량이 많아 시간이 오래 걸리는 고급 조명 모델을 사용할 수 있다.
대부분의 light map은 radiosity 알고리즘을 통해 만들어진다.
light map을 만드는 방식
light mapping이 적용될 표면을 parameterization한 다음,
texture space에서 scan conversion을 한다.
이렇게 생성된 각 texel에 해당하는 물체 표면의 점을 구하고, 여기에 들어오는 빛을 계산한다.
계산된 값은 texture에 저장되는데, 이것이 바로 light map이다.
주변 환경을 반사하는 매끄러운 물체를 rendering하는 기법이다.
첫 번째로, environment map이라고 불리는 texture에 주변 환경의 영상을 담는 것이다.
가장 많이 쓰이는 environment map은 cube map이다.
가상의 정육면체, 그리고 그 중심에 위치한 camera를 이용한다.
이 정육면체의 여섯 개 면 각각을 향해서 수직과 수평 방향으로 모두 90도의 시야각(field of view)를 설정해 사진을 찍거나 rendering을 수행하면
여섯 개의 정사각형 이미지를 얻을 수 있다.
이를 정육면체에 붙여놓은 것을 큐브맵이라고 한다.
Cube mapping 구현
cube map은 물체를 감싸는 것으로 간주한다.
물체 표면의 점 가 주변 환경을 반사하도록 만들기 위해서,
카메라로부터 를 향해 ray 를 발사하고 이를 tracing 한다.
는 의 surface normal 을 기준으로 반사되어, 벡터를 결정한다.
은 cube map의 한 면과 교차하는데, 이 교차점을 이용해서 해당 면의 image texture를 필터링한다.
예를 들면, 교차점 주변의 네 개 texel을 bilinear interpolation한다.
이 결과가 바로 에서 반사되는 색상을 결정한다.
Cube mapping은 간략화된 ray tracing이라고 볼 수 있다.
왜냐하면, 2차 광선 중 reflection ray만 tracing하고, 재귀적인 과정을 거치지 않기 때문이다.
퐁 모델의 ambient reflection 항 는 간접 조명을 담당하는데,
표면상의 한 점을 향해 모든 방향에서 고루 ambient 빛이 들어온다고 가정한다.
하지만, 특정 방향으로는 ambient 빛이 들어올 수 없는 경우가 있다.
아래 그림처럼 으로 들어오는 ambient 빛은 아무 방해를 받지 않지만,
로 들어오는 ambient 빛은 물체의 다른 부분에 일부 가려진다.
ambient 빛이 가려지는 정도, 즉 occlusion drgree를 계산하고,
이를 이용해 ambient 항 의 값을 조절하는 기법을
ambient occlusion 이라고 한다.
의 occlusion degree는 보다 크므로, ambient 빛을 더 적게 받고, 결국 ambient 반사를 적게할 것이다.
점 에 반구를 놓아보면, 반구는 빈 공간과 채워진 공간을 구분될 수 있다.
occlusion degree는 전체 반구 공간에서 채워진 공간이 차지하는 비율로 근사된다.
반구에 고르게 sample point를 뿌리고, 이들이 빈 공간에 있는지 아니면 채워진 공간에 있는지 검사한다.
이를 구현하기 위해서는 먼저
rendering할 scene의 depth map을 생성한다.
위의 그림에서 물체 표면의 굵은 노란 선은 camera가 볼 수 있는 부분을 나타내는데,
이 표면의 screen space 깊이() 값이 depth map에 저장된다.
의 screen space 깊이 은 depth map에 저장된 보다 작으므로, 은 빈 공간에 속한 것으로 판정된다.
반면, 의 경우는 screen space 깊이 가 보다 크므로, 채워진 공간에 속한 것으로 판정된다.
최종적으로, 8개의 sample 중 3개가 채워진 공간에 속한 것으로 판정되므로, 의 occlusion degree는 로 판정된다.
퐁 모델의 ambient 항만을 사용한 경우와, ambient occlusion을 사용한 경우의 rendering 결과를 보면,
ambient occlusion이 물체 표면의 음영을 얼마나 잘 표현하는지 확인할 수 있다.
아래 자료는
polygon mesh만을 사용해 rendering한 것,
ambient 항만을 사용해 rendering한 것,
ambinet occlusion으로 rendering한 결과를 차례대로 보여준다.