본문 바로가기
게임 공부/Computer graphics

조명(Lighting) 기초

by woohyeon 2021. 3. 12.
반응형

youtu.be/Kuqm8Y3tUxY

시작하기 전에 위 영상을 한번 보고 시작하는 것도 좋다.


Lighting (조명)

현실적인 3D 오브젝트를 표현하기 위해서 빛은 중요한 요소이다. 우리가 눈으로 볼 수 있는 물체들은 그 물체에 부딪힌 빛이 우리 눈에 반사되어 볼 수 있게 되는 것이다.

이러한 빛들은 태양 또는 전등과 같이 광원이 직접 방사하는 직접광과 물체, 먼지 등에 반사되어 생기는 간접광이 있다.

image

출처: https://kblog.popekim.com/2011/12/04-part-1.html

게임에서 오브젝트에 조명 효과를 주기 위해선, 오브젝트에 닿은 빛이 반사되어 카메라에 들어오는 빛의 세기(양)을 얻을 수 있어야 한다. 이러한 빛은 직접광일 수도, 간접광일 수도 있는데 직접광만을 고려하여 결과를 산출하는 것을 지역 조명 모델(local illumination model)이라 한다. 반면 간접광까지 고려하는 모델을 전역 조명 모델(global illumination model)이라 한다.

간접광까지 모두 처리하기 위해선 모든 오브젝트들을 잠재적 광원으로 보아야 한다. 모든 오브젝트들에 반사된 빛들을 고려해야 하기 때문에 훨씬 계산이 어렵다. 이러한 간접광들을 계산하기 위한 방법으로 광선추적(ray-tracing)이란 기법이 있다. 광선 추적은 기초로 다루기엔 어려운 주제이기에 이러한 것이 있다는 것만 알아두자.

그래픽스 분야에서 주로 사용되는 모델은 지역 조명 모델로, 이 모델을 사용하는 퐁 모델(Phong model)을 알아볼 것이다. 아래에 설명할 내용들은 모두 퐁 모델을 기반으로 하는 설명이다. 또한 광원의 종류는 매우 멀리 떨어져 있고, 모든 지점에 도달하는 빛의 방향이 서로 평행한 Directional Light라고 가정한다. 즉 태양과 같은 광원이다. 

아래에서 살펴볼 3가지 반사는 다음과 같다.

  • 난반사(Diffuse reflection)
  • 정반사(Specular reflection)
  • 주변반사(Ambient reflection(light))

간단하게 그림으로 먼저 확인해보면 다음과 같다.

image


https://xoax.net/comp_sci/crs/graphics_3D/lessons/local_illumination/




Diffuse Reflection (난반사)

반사되는 빛은 난반사(Diffuse Reflection)정반사(Specular Reflection)로 나뉜다. 여기선 게임에서 많이 사용되는 램버시안 모델(Lambertian model)을 사용한다. 램버시안 모델에서 난반사는 다음과 같이 표면에 닿은 빛이 모든 방향으로 같은 세기를 가지고 고르게 반사된다고 가정한다.

image


출처: https://www.photokonnexion.com/definition-diffuse-reflection/

동일한 세기의 빛이 모든 방향으로 고르게 반사되기 때문에 카메라를 어떤 곳에 놓던지 p 점의 색상은 동일하게 보인다. 이러한 난반사는 표면의 재질에 따라 결과가 달라질 수 있다. (관련하여 잠시 뒤 설명)

image

난반사로부터 들어온 빛의 양을 구하기 위해선 아래와 같이 입사광(l)과 표면에 대한 법선(n) 사이의 각도(Θ)가 필요하다. (그림의 입사광 l은 방향이 위 그림과는 반대로 되어 있는데, 이는 계산 시 아래와 같이 벡터의 밑을 맞춰주어야 올바른 사이각을 구할 수 있기 때문이다)

image

램버시안 모델에서 반사된 빛의 양은 Θ에 대한 cos 값으로 정의된다. cos은 각이 작을 수록 값이 커지고, 각이 클 수록 값이 작아지기 때문에 아래 설명할 성질과 잘 맞는다. cos은 각이 0일 때 최대 값인 1을 가지고 직각일 때 최소값인 0을 가진다. 따라서 다음과 같이 입사광이 표면의 노멀과 일치할 때 받게 되는 빛의 양은 최대이며, 두 벡터가 수직일 때 빛을 아예 못 받게 된다. 광원이 더 아래쪽으로 갈 경우 각도가 90도를 넘어가며 cos 값은 음수가 되는데, 이 경우를 위해 음수는 모두 0으로 변경된다. 그래서 보통 max(cos, 0) 으로 표현한다.

image

그런데 이 카메라에 들어오는 빛의 양을 구하는 cos 값은 내적(dot product)으로도 표현할 수 있다. 빛을 벡터 l, 노멀(법선)을 벡터 n이라 했을 때, 두 벡터에 대한 내적은 다음과 같다.

l·n = |l| * |n| * cosΘ

그런데 l과 n의 길이를 1이라고 가정해보자. 그러면 두 벡터에 대한 내적은 cosΘ와 동일해진다. 즉 두 벡터의 길이가 1이면 코사인 값은 두 벡터에 대한 내적과 동일하게 된다.

두 벡터의 좌표가 주어졌을 때 두 벡터에 대한 내적은 다음과 같다.

l = (a1,b1,c1)
n = (a2,b2,c2)

l·n = a1*a2 + b1*b2 + c1*c2 = cosΘ

두 벡터의 길이가 결과에 영향을 미치지 않는다면 우리는 위와 같이 cos값 대신 간단하게 곱셈과 덧셈만으로 결과를 얻을 수 있다. 다행히 우리가 원하는 것은 두 벡터가 이루는 각이기 때문에 길이가 1이든 100이든 두 벡터가 이루는 각은 동일하다. 따라서 임의로 벡터의 길이를 1로 변경해도 결과에 영향을 미치지 않는다.

결국 한 점에 난반사된 빛이 카메라에 들어오는 양은 다음과 같다.

max(dot(n, l), 0)

 

하지만 최종적으로 보이는 색상을 얻으려면 하나의 계산이 더 필요하다. 위에서 구한 것은 난반사광의 양이고, 실제론 빛의 색상과 물체 표면의 디퓨즈 계수(Diffuse Reflectance) 또한 고려해야 한다.

만약 흰색 빛(1,1,1)이 비춘 점 P가 파란색(0,0,1)으로 보였다고 가정하자. 맨 처음에 설명했듯이 우리는 물체에 반사된 빛을 보는 것이기 때문에, 이는 점 P가 파란색을 반사했다는 의미가 된다. 즉 점 P가 흰색 빛의 R, G를 흡수하고 B만 반사함으로써 발생한 현상이다. P가 빨간색(1,0,0)으로 보였다면 G, B를 흡수하고 R을 반사한 것이다.

이처럼 결국 다음과 같이 빛의 RGB와 물체의 RGB를 서로 곱한 것이 최종적으로 보이는 색상이 된다.

(1,1,1) * (0,0,1) = (1*0, 1*0, 1*1) = (0,0,1)

 

결국 최종적으로 보이는 색상은 다음과 같이 카메라로 들어오는 반사된 빛의 양 * 빛의 색상 * 물체의 디퓨즈 계수 정도가 된다.

max(dot(n, l), 0) * light color * diffuse reflectance

 

다음은 난반사된 빛을 통해 바라보는 물체의 예이다.

image



Specular Reflection (정반사)

난반사와 달리 빛이 여러 방향으로 반사되지 않고 한 방향으로만 반사되는 것을 정반사라고 한다. 실생활에서 보면 공연장같은 곳에서 한 곳으로만 빛을 쐬는 하이라이트 같은 효과가 정반사광의 예이다. 정반사는 아래와 같이 입사각과 반사각이 동일하다.

image

정반사된 빛의 세기를 구하려면 정반사광에 대한 벡터와 카메라의 방향 벡터가 이루는 각에 대한 cos 값을 구한 뒤 거듭제곱을 여러번 해야 한다.

즉 다음의 그림에서 정반사 된 빛 벡터가 r, 카메라(view) 벡터가 v라 했을 때 두 벡터가 이루는 각 p에 대한 cos값의 거듭제곱 형태이다.
(i.e. cos(p)^4)

image


아래에서 볼 수 있듯이 거듭 제곱에 사용되는 값은 표면의 반짝임 혹은 매끈함의 정도(sh)를 의미한다. cos은 [0,1] 범위의 값을 가지기 때문에 여러번 곱해질 수록 값이 작아질 것이다. 즉 매끈함의 정도가 클 수록 아래와 같이 정반사를 관찰할 수 있는 범위가 좁아진다.

v가 r에서 멀어질 수록, 즉 두 벡터가 이루는 각이 커질 수록 cos값은 작아지기 때문에 볼 수 있는 빛의 세기는 약해진다. r=v 일 경우 두 벡터가 이루는 각은 0이기 때문에 cos 값이 1이 되고, 매끈함의 정도에 관계없이 항상 최대가 된다.

image


지금까지 본 것은 빛의 양을 의미하고, 난반사와 동일하게 색상값을 추가로 정해주어야 한다. 다만 난반사와 달리 정반사는 보통 물체 표면의 색상을 따라가지 않는다. 위와 같이 빛의 색상인 흰색으로 보이는 것을 볼 수 있다. 아래와 같이 현실 세계에서도 동일하다.

때문에 물체 표면의 색상이 아닌 보통 gray-scale(회색조)로 그 값을 정해준다. 회색조는 R=G=B인 색상값을 의미한다. (0.5,0.5,0,5)와 같은 값을 줌으로써 빛의 색상을 따라가되, 정도만 조정해준다. 

다음 그림은 오로지 정반사만을 고려했을 때 카메라에 보이는 물체의 모습이다.
왼쪽은 20번의 거듭제곱을 진행했으며, 오른쪽은 60번의 거듭제곱을 진행한 것이다. (스페큘러 색상이 노란색으로 나오는데, 아마 빛의 색상을 노란색으로 했던 것 같다.)

image

 

다음 그림은 정반사와 난반사를 모두 고려했을 때 카메라에 보이는 물체의 모습이다.

image



Ambient Reflection(간접 반사, 주변 반사)

Ambient는 주변이란 뜻이다. 즉 Ambient reflection는 여러 물체에 닿아 반사된 간접광들을 의미한다. 깊이 들어가면 복잡하지만, 이해를 위해 단순히 위 구체의 안보이는 부분을 밝히기 위해 주변광을 조금 설정한다고 하면 다음과 같은 구체를 볼 수 있다.

image






댓글