Lightening 기본 개념
직접광 & 간접광
직접광 : direct light, 광원에서 바로 나오는 빛
간접광 : indirect light, 광원에서 나온 빛이 주변 환경에 부딪힌 뒤, 흡수되지 못하고 반사되는 일부 빛
간접광은 주변을 밝게 하면서 검은 그림자 일부에 영향을 준다.
local illumination
광원과 물체만 이용하여 빛을 계산하는 방법
직접광만 고려하고 간접광, 주변환경, 물체에 의한 그림자 등은 고려하지 않는다.
Blinn-Phong illumination 기법이 해당한다.
global illumination
주변 환경, 간접광, 물체간 상호 반사, 그림자 등까지 고려하여 물체의 밝기를 계산
계산량이 많지만 그 만큼 더 사실적인 표현이 가능하다.
Ray Tracing, Radiosity 등의 기법이 해당한다.
Radiosity
빛의 분산(물체에 닿은 빛이 주변으로 퍼지는 것)을 고려하여 밝기를 계산하는 방법
열역학의 복사열 전달 이론을 기반으로 계산한다.
이 계산에는 모든 물체가 난반사체라는 가정이 깔려있다.
빛을 받은 물체는 해당 빛을 모든 방향에 모두 같은 세기로 반사한다는 것이다.
실제로 이런 물체는 드물지만 계산의 편의를 위해 이렇게 계산한다.
이 그림을 보면 노란색 빛이 바닥에 닿아서 사방으로 반사되고, 빨간색 빛도 바닥에 닿아서 사방으로 반사된다.
각각 반사된 노란색, 빨간색 빛은 다시 벽으로 반사되면서 서로에게 영향을 줄 것이다.
Radiosity 방식으로 밝기를 계산할 때는 먼저 물체(mesh)를 사각형 단위로 쪼갠다.
(이 단위를 radiosity mesh 또는 patch 라고 부른다)
하나의 패치는 자신의 주변 사방으로부터 빛을 받는데, 이를 기반으로 패치가 받는 빛 에너지의 밀도(flux density)를 계산한다.
이 밀도가 패치의 색을 결정한다.
빛의 밀도는 form factor 를 사용하여 계산한다.
form factor 는 하나의 패치에서 다른 패치로 에너지가 이동하는 정도를 말한다.
패치 i의 면적을 Ai, i에서 j로 가는 빛 에너지를 Fij 라고 할 때
다음이 성립함을 이용하여 각 패치의 단위 면적당 빛 에너지의 밀도를 계산한다.
이때 모든 F 를 구하는 것이 어렵기 때문에 보통 반구형태로 잘라서 그 방향에서 오는 빛에 대한 form factor 만 계산한다.
또한 물체에서 패치를 나눌 때 무작정 나누면 계산이 많아지기 때문에 Adaptive subdivision 기법을 사용하여 메쉬가 자동적으로 나뉘도록 하는 방법을 사용한다. 이 방법은 그림자 경계와 같이 빛 에너지의 밀도가 크게 변하는 부분은 잘게 나누고, 밀도가 크게 변하지 않는 부분은 큰 조각으로 패치를 나누는 방법으로 계산량을 줄인다.
빛은 아주 미세한 영역까지 골고루 퍼지기 때문에 빛 에너지의 밀도를 계산할 때는 영역의 크기를 미분하여 아주 작은 면적에 대한 빛의 밀도를 계산한다.
이렇게 미분된 아주 작은 단위 영역에 대해 단위 시간동안 받는 빛 에너지의 밀도를 가리켜 radiosity 라고 한다.
단위 패치 dA의 법선벡터를 N, 광선벡터를 L 이라고 할 때,
이 빛에 의한 단위 패치의 빛 에너지 밀도를 radiance 라고 한다.
radiosity 는 이런 빛이 반구 모양에서 사방으로 들어올 때 그 모든 radiance 의 합으로 계산한다.
radiosity 는 모든 물체가 난반사를 하는 가정을 깔고 있기 때문에, 금속이나 거울과 같은 정반사 물체, 하이라이트는 표현할 수 없고, 계산 시간이 오래 걸린다는 단점이 있다.
하지만 뷰 포인트와 독립적인 illumination 을 구축할 수 있다는 장점이 있고, soft shadow 표현을 잘 하며, 한번 계산하고나면 이 값을 그대로 활용할 수 있어 frame 마다 새로 계산할 필요가 없다는 장점도 있다.
Ray Tracing 과 비교해보면 radiosity 는 비교적 편안한 분위기의 조명을 표현할 수 있다는 장점이 있다.
Ray Tracing
ray tracing 은 radiosity와 정반대의 특성을 갖는 밝기 계산 방법이다.
관찰자가 물체를 보는 것은 빛이 물체에 닿은 뒤 물체에서 반사된 빛이 사방으로 뻗어나가다 우연히 관찰자 (카메라) 쪽으로 들어온 빛에 의해 관찰자가 물체를 보게 되는 것이다.
하지만 광원에서부터 시작해서 카메라로 도착하는 빛의 경로를 추적하는 것은 거의 불가능하기 때문에,
(눈에 보이는 영역만 골라서 계산하는 것이 쉽지 않다. 그냥 다 계산해야 함)
거꾸로 관찰자로부터 광원을 향해 빛이 온 경로를 역추적하여 계산하는 방식을 사용하며, 이를 가리켜 Ray Tracing 이라고 한다.
Ray Casting
그래서 먼저 카메라에서 물체를 향해 View Ray 를 쏜다.
view ray 는 이미지 픽셀 개수만큼 쏠 것이다. (각 픽셀의 밝기 값을 모두 계산해야 하므로)
각 view ray 는 물체에 부딪힌다. 불체에 부딪힌 ray 를 다시 광원 방향을 향해서 쏜다.
이 과정에서 물체에 막히면 그 부분은 그림자가 되고, 막히는 부분이 없다면 그대로 물체의 색상으로 표현된다.
또한 위 그림과 같이 물체 앞에 물체가 있는 경우, 뒷 물체가 앞 물체에 가려지는 것도 ray tracing 을 사용하면 자연스럽게 표현할 수 있다.
사실 엄밀하게 지금까지 한 것은 카메라에서 물체로 한번만 광선을 쏘는 Ray Casting 이다.
(Ray Tracing 은 물체에서 정반사된 빛이 주변 환경과 실제 광원까지 도달하는 경로를 끝까지 추적하는 확장된 개념이다)
radiosity 에서는 난반사만을 다뤘다면, ray tracing 은 정반사(reflection)와 굴절(refraction)을 활용한다.
하나의 빛이 물체에 부딪히면 반사되어 뻗어나가고, 그 과정에서 다른 물체에 부딪히면 그 물체의 색이 영향을 받으므로 global illumination 이 된다.
Ray Tracing 을 계산하는 과정을 따라가보면 위와 같다.
먼저 eye point 와 스크린(viewing plane) 의 한 픽셀을 지나는 벡터 v 를 그린다.
이 벡터가 녹색 물체에 부딪히면 이 벡터와 물체(폴리곤)와의 교점을 구한다 (1)
위 그림과 같은 구의 경우에는 폴리곤으로 변환하지 않고 바로 교점을 구할 수 있고, 폴리곤의 경우에는 각 폴리곤마다 평면 방정식으로 바꾸어서 교점을 구한다. 그리고 이 교점이 폴리곤(또는 구) 내부에 있으면 그리고 외부에 있으면 그리지 않는다.
다음으로는 Blinn-Phong illumination 또는 lightening model 을 사용해서 교점의 색(밝기)을 구한다. (2)
그리고 정반사를 시킨다. 만약 물체가 불투명한 물체가 아니라면 굴절 (3) 도 시킨다.
굴절된 또는 반사된 벡터가 다른 물체와 부딪히면 교점을 구하고 색을 구하고 반사/굴절하는 과정을 반복한다.
또한 이 과정에서 필요한 경우 그림자 처리 (4) 도 함께 해준다. (ray casting 에서 보았듯 자연스럽게 알아서 됨)
4가지 과정에 대한 수식을 하나씩 정리해보면 다음과 같다.
1. 교점구하기
위 그림은 예시를 보여준다.
구의 방정식에서 c 벡터는 중심벡터, p 벡터는 구 위의 임의 벡터를 말한다.
광선 방정식에서 o 는 카메라의 초점 (시점), d 벡터는 방향벡터이고 t 값에 따라서 직선위 점을 결정할 수 있다.
이제 직선식을 구 방정식에 대입해서 교점을 구한다.
이를 정리하면 t 에 대한 2차방정식이 나오는데, 근이 없다면 교점이 없는 것이고, 중근이면 접하는 것이고, 근이 2개면 구와 충돌한 것이다.
구체적인 교점을 구하는 방법은 위와 같다.
구가 아닌 폴리곤과의 교점을 구할 때는 먼저 폴리곤에 대한 평면 방정식과 교점을 구한 뒤, 그 교점이 폴리곤(삼각형) 내부에 있는지 외부에 있는지 판별하는 순으로 구한다.
평면의 방정식을 구할 때는 법선벡터를 구해야하는데, 이는 각 폴리곤의 세 정점을 cross product 하여 구할 수 있다.
(위 그림에서 n = 꼴의 식)
2. 색상 (밝기) 구하기
교점의 밝기를 구할 때는 위와 같은 Blinn-Phong 수식을 사용하여 구한다.
이때 마지막에 I 에 대한 식이 한번 더 등장하는데 이 부분이 정반사와 굴절을 재귀적으로 고려하여 밝기를 계산하는 부분이다.
다른 물체로부터 반사/굴절된 빛이 이 물체 포인트에 닿았다면 그 포인트의 밝기는 더 높아질 것이다.
(이 부분 때문에 global illumination 이 되는 것이다)
반사를 처리할 때는 phong reflection model 을 사용한다.
반사에는 난반사와 정반사가 있는데, 난반사는 radiosity 가 다루고, 정반사는 ray tracing 으로 다룬다.
이는 ambient lighting, diffuse lighting, specular lighting 3가지를 고려하여 밝기를 구하는 방법이다.
bilnn-phong illumination 을 사용하면 diffuse lighting 까지 포함하여 밝기를 계산하기 때문에
ray tracing 을 하더라도 어느정도 난반사를 고려한 효과를 얻을 수 있다.
recursion 을 할 때는 정반사만 고려하여 계산하며, 이 3가지에 대해서는 뒤에서 더 자세히 정리한다.
3. 굴절 처리
재귀적으로 굴절 처리를 할 때, 굴절되는 빛의 각도는 snell 의 법칙을 사용하여 계산하면 된다.
4. 그림자 처리
마지막으로 그림자의 경우, 보통은 점광원으로 계산하면서 자연스럽게 계산이 되지만
점광원이 아닌 경우(위 예시는 area light)에는 위와 같이 직접 계산을 해주어야 한다.
이제 ray tracing 의 장점과 단점을 정리해보자.
ray tracing 의 장점은 가려진 은면처리, 명암(그림자) 표현, 반사, 굴절 표현, 사실적 표현이 잘 되는 장점이 있다.
하지만 각 포인트마다 재귀적으로 여러번 따라가서 계산하다보니 계산량이 많다는 단점이 있다.
또한 카메라를 기준으로 선을 쏴서 계산하기 때문에, 관찰자가 이동하면 매번 이동할 때마다 계산을 새로 해야한다.
그래서 ray tracing 기술의 핵심은 이 계산 시간을 줄이는 데 있다.
특히 ray tracing 의 연산량의 95%는 카메라로부터 나오는 시각 광선과 물체 사이의 교점을 구하는데서 나온다.
이를 개선하기 위한 방법으로 space subdivision 에서 정리했던 Bounding volumn, octree 를 사용한 공간 분할 등을 적용할 수 있다.
특히 octree 를 사용하면 작은 물체가 많을 때 효과적이다.
<교수님이 보라고 추천하신 동영상 내용 요약>
렌더링 = 3차원 모델 데이터를 2D 이미지로 변환하여 모니터에 표현하는 작업
렌더링 기법 3가지 = rasterization, ray tracing, radiosity
rasterization = 3D 게임같이 실시간 렌더링에 자주 사용되는 기법, ray tracing 정도의 디테일은 안 나온다.
3D 물체의 정점에 해당하는 부분을 스크린에 정사영 내린 뒤, 정점 색을 기반으로 면을 채우는 방식
하지만 물체의 앞, 뒤를 구분하지 못해서 Z-Buffer 라는 곳에 depth map 을 저장해두고 앞 뒤를 구분하여 구분한다.
ray casting = rasterization 에서 발전한 방식으로 카메라로부터 스크린 모든 픽셀에 대해서 ray 를 쏴서 계산하는 방식
근데 연산량이 너무 많아서 처음 등장했을 때는 주목받지 못했다.
ray tracing = ray casting 에서 발전한 방식이지만, 연산량이 많아서 실시간 렌더링에는 아직 적합하지 않다.
렌더링 속도를 높이기 위해 미리 lightmap 을 만들어서 밝기를 사전에 계산하기도 한다.
또 렌더링에 걸리는 시간을 줄이기 위해서 분산 렌더링 (distributed rendering) 을 할 수 있다.
그 예시로 render farm 이라는 것이 있는데, 네트워크로 연결된 여러 컴퓨터들이 각 프레임의 파트를 나눠서 렌더링한 뒤, host computer 에게 그 결과를 각자 보내면 결과를 합쳐서 렌더링 속도를 높이는 방법이다.
기타 렌더링 기법
Volume Rendering
위에서 정리한 기법은 물체의 표면을 렌더링하는 기법이었다면
MRI, CT 와 같이 물체의 내부 데이터도 함께 갖고 있고, 이를 기반으로 내부까지 렌더링하는데 사용되는 기법이다.
Point Sample Rendering
물체를 모델링할 때 raw data (point cloud) 를 사용하여 모델링하는 기법이 있었다.
이런 포인트를 촘촘히 샘플링해서 렌더링하는 기법이 Point Sample Rendering 이다.
물체가 복잡하거나 동적 조명이 존재하는 상태에서 모델링할 때 적합하다.
(복잡하다는 것은 너무 복잡해서 메시로 표현하는 것이 오히려 더 복잡한 경우를 말한다.
위 그림과 같은 나뭇잎을 메시로 모델링한다고 생각해보면 차라리 point cloud 가 더 나을 것이다)
Image-based Rendering (IBR)
image-based modeling 이 2D 이미지를 기반으로 3D 모델을 만드는 것이었다면
image-based rendering 은 2D 이미지를 조합하여 새로운 시점의 영상/이미지를 만드는 것이다.
이 외에도 image-based acceleration, image-based lighting 과 같이 이미지 기반으로 acceleration 이나 조명 정보를 추출할 수 있다.
IBR 은 사진을 기반으로 하므로, 영상(모델) 복잡도에 독립적이고 실제감이 높은 영상을 만들 수 있다.
하지만 물체가 이동하는 동적 환경에서는 영상이 왜곡되는 문제가 있고, 물체를 가까이서 보는 근접 영상의 경우에는 해상도 제한 때문에 정확하게 보이지 않는다는 단점이 있다.
HDRI (High-Dynamic Range Image)
dynamic range 는 '밝기의 범위' 를 말한다.
기본적으로 이미지는 0부터 255 까지의 '정수'로 밝기를 표현하고 있다.
따라서 밝기가 미세하게 변하는 과정을 표현할 수 없어 이미지를 자세히 보면 물체의 경계가 까끌까끌하게 보이는 현상이 있다.
이런 현상의 원인이 dynamic range 의 제한 때문에 발생하는 것인데, HDRI 는 밝기 값을 실수를 사용하여 표현함으로써 그 문제를 극복하는 기법이다.
조명 노출을 다르게 준 사진을 여러장 찍고, 이 사진들을 사용하여 high dynamci range iamge 를 얻어낼 수 있다.
Non-Photorealistic Rendering (NPR)
90년대 중반에 주목받은 기술로, 이제는 사실적인 결과를 얻기보다, 예술적인 결과를 얻어보자는 아이디어에서 등장했다.
크게 기존의 그림 도구를 사용한 듯한 느낌을 주는 디지털 도구로 결과를 만드는 Brush-oriented Painting 과 실제 사진을 후처리하여 예술적인 감성이 느껴지게 만드는 Post Processing 방식으로 나뉜다.
그 밖에도 AR (Augmented Reality, 증강현실) 과 같은 렌더링 기술도 있다.
'CS > 컴퓨터그래픽스와 메타버스' 카테고리의 다른 글
[그래픽스] 7. Bilnn-Phong illumination model (3) | 2025.06.11 |
---|---|
[그래픽스] 6. Scan Conversion (1) | 2025.06.11 |
[그래픽스] 4. Rendering (2) - Texture Mapping, Shadow Generation (1) | 2025.06.08 |
[그래픽스] 3. Rendering (1) - Shading (0) | 2025.06.08 |
[그래픽스] 2. Modeling (0) | 2025.06.08 |