서의 공간

[T24.0] Lighting 본문

Graphics API/DirectX 11 - Chili

[T24.0] Lighting

홍서의 2020. 12. 5. 10:29

1. 빛의 삼원색

[그림 24.0.1] 빛의 삼원색

2. 람베르트 코사인 법칙

수직에 가까운 각도로 표면에 입사하는 빛은 스치듯이 입사하는 빛보다 표면을 더 세게 때린다. 이로부터, 노멀 벡터와 빛 벡터 사이의 각도에 기초해서 빛의 세기를 돌려주는 하나의 함수를 생각해 볼 수 있다. 그 함수의 값은 노멀 벡터와 빛 벡터가 정확히 같은 방향일 때 최댓값이어야 하며, 노멀 벡터와 빛 벡터의 각도가 커짐에 따라 점차 감소해야 한다. 그리고 \(\theta>90^\circ\)이면 빛이 표면의 뒤쪽을 때린 것이므로 함수의 값, 즉 빛의 세기는 0이어야 한다. 람베르트 코사인 법칙(Lambert's cosine law)에서 그러한 함수를 유도할 수 있다.

\[f(\theta)=\text{max}(cos\theta,0) = \text{max}(L\cdot n,0)\]

여기서 L과 n은 단위벡터이다. [그림 24.0.3]은 \(\theta\)의 변화에 따라 빛의 세기가 0.0에서 1.0으로 변하는 방식을 보여준다.

[그림 24.0.2] 빛 벡터 \(\mathbf{L}\)과 노멀 벡터 \(\mathbf{n}\)의 각도에 따라 단위 면적 \(dA\)에 받는 빛의 양은 다르다.
[그림 24.0.3] 함수 \(f(\theta) = \text{max}(cos\theta, 0) = \text{max}(L\cdot n, 0)\)의 그래프. 정의역은 \(-2\le\theta\le 2\)이다. \(\pi /2 \approx 1.57\)임을 주목할 것.

3. Diffuse light

분산광의 계산은 두 부분으로 나눌 수 있다. 첫 번째는 분산광의 색과 표면의 분산광 재질 색상이 관여한다. 헷갈리지 말아야 할 것은 여기서 분산광의 색은 광원 오브젝트의 속성이고(개념적으로 광원이 방출하는 빛의 색상), 분산광 재질 색상은 오브젝트의 속성이다(예: Box, 개념적으로 오브젝트가 빛을 얼마나 흡수하고 반사하는지). 분산광의 색과 분산광 재질 색상을 성분별로 곱하면 반사된 분산광의 색상이 나온다. 예를 들어 입사 분산광이 \(l_d=(0.8,\ 0.8,\ 0.8)\)이고 분산광 재질 색상이 \(m_d=(0.5,\ 1.0,\ 0.75)\)라고 하자. 그러면 그 점에서 반사된 분산광(의 색상)은 다음과 같이 주어진다.

\[D=l_d\otimes m_d=(0.8,\ 0.8,\ 0.8)\otimes (0.5,\ 1.0,\ 0.75) = (0.4,\ 0.8,\ 0.6)\]

분산광 계산의 두 번째 부부은 이 반사광의 세기를 람베르트 코사인 법칙에 의거해서 조정한다. 즉, 빛 벡터와 표면 법선의 각도에 따라 반사광의 세기를 조율하는 것이다. \(L\)이 빛 벡터이고 \(n\)이 표면 노멀 벡터라고 할 때 \(k_d=\text{max}(L\cdot n,\ 0)\)이라고 하자. 그러면 그 점에서 반사된 분산광은 다음과 같이 주어진다.

\[c_d = k_d\cdot l_d\otimes m_d = k_d D\]

4. Ambient light

방에 있는 전구가 하나이고, 탁자 위에 주전자가 하나 있다고 하자. 전구의 빛은 주전자의 한쪽만 직접 비춘다. 그렇다고 해서 주전자의 반대쪽이 완전히 검지는 않다. 이는 벽이나 방의 다른 물체에 반사된 빛이 주전자의 반대쪽을 비추기 때문이다. 이런 간접광의 효과를 내기 위해, 위 조명 공식에 다음과 같은 주변광 항을 도입한다.

\[A=l_a\otimes m_a\]

여기서 \(l_a\)는 주변광, 즉 광원 오브젝트의 한 속성이다. 그리고 \(m_a\)는 주변광 재질 색상으로, 오브젝트의 한 속성이다. 모든 주변광은 물체를 균일하게 비춘다. 주변광의 계산에는 실질적인 물리 계산이 전혀 관여하지 않는다. 가상의 빛인 주변광은 장면 전체에서 반사, 분산되어 도달한 간접광이 물체를 모든 방향에서 고르게 비춘다는 가정을 깔고 있다. 다음은 주변광 항을 분산광에 합한 새로운 조명 방정식이다.

\begin{align}LitColor &= l_a\otimes m_a + k_d\cdot l_d\otimes m_d\\&=A+k_d D\end{align}

5. Specular light

반영광이 반사되는 영역을 규정하는 원뿔은 반사 벡터 \(\mathbf{r}\)에 대한 각도 \(\phi_{max}\)로 정의된다. 반영광의 세기는 \(\phi = 0\)일 때 최대이고, \(\phi\)가 \(\phi_{max}\)에 가까워짐에 따라 점차 0으로 감소한다. [그림 24.0.5]는 코사인 함수를 여러 가지 지수 \(p\ge 1\)들로 거듭제곱한 그래프이다. 본질적으로, 이 반영 지수 \(p\)를 얼마로 두느냐에 따라 빛의 세기가 0으로 떨어지는 원뿔 각도 \(\phi_{max}\)가 달라진다. 결과적으로, 응용에서는 이 매개변수 \(p\)를 조정함으로써 표면이 반짝이는 정도(shininess; 광택도)를 간접적으로 조정한다. 반사 원뿔이 작으면 매끄럽고 빛나는 표면(빛을 더 날카롭게 반사한다). 반사 원뿔이 크면 윤이 나지 않는 표면이 된다. \(\mathbf{v}\)와 \(\mathbf{r}\) 둘다 단위벡터이므로 \(cos\phi = \mathbf{v}\cdot\mathbf{r}\)임에 주의.

[그림 24.0.4] \(I\)는 입사광선이다. 반영광은 모든 방향으로 반사되는 것이 아니라 일반적인 반사 원뿔 항향으로 반사된다. 그 원뿔의 크기는 하나의 매개변수로 제어할 수 있다. 시점 벡터 v가 반사 원뿔 안에 있으면 반사광이 눈에 도달하고, 그렇지 않으면 도달하지 않는다. 시점 벡터 v와 반사 벡터 r 사이의 각도 \(\phi\)가 작을수록 반영광이 눈에 더 많이 도달한다.
[그림 24.0.5] 코사인 함수를 여러 가지 지수 \(p\ge 1\)들로 거듭제곱한 그래프.

한 점에서 반사되어서 눈으로 들어오는 반영광의 양은 다음과 같이 주어진다.

\begin{align}c_s &= k_s\cdot l_s \otimes m_s\\&=k_s S\end{align}

여기서

\[k_s = \begin{cases}\begin{align}\text{max}(\mathbf{v}\cdot\mathbf{r},\ 0)^{p}&,\ L\cdot n>0\\0&,\ L\cdot n\le 0\end{align}\end{cases}\]

이다. 색상 \(l_s\)는 광원 오브젝트의 반영광 속성이다. 반영광 재질 색상 \(m_s\)는 오브젝트의 머티리얼 속성이다. 계수 \(k_s\)는 반영광 세기를 \(\mathbf{r}\)과 \(\mathbf{v}\)사이의 각도에 따라 비례하는 역할을 한다. [그림 24.0.6]에서 보듯이, 각도에 따라서는 표면이 분산광은 전혀 받지 않지만(\(L\cdot n<0\)) 반영광은 받는 상황도 생길 수 있다. 그러나 분산광은 전혀 받지 않는 표면이 반짝인다는 것은 비상식적이므로, 그런 경우에는 \(k_s=0\)으로 설정한다.

[그림 24.0.6] 빛이 표면의 뒤를 때린 경우에도 반영광이 눈에 도달하는 상황이 벌어질 수도 있다. 이런 비합리적인 상황을 피하기 위해, 이런 경우에는 \(k_s=0\)으로 설정한다.

이러한 반영광을 도입한 새 조명 모형은 다음과 같다.

\begin{align}LitColor&=l_a\otimes m_a+k_d\cdot l_d\otimes m_d + k_s\cdot l_s\otimes m_s\\&=A+k_d D+k_s S\end{align}

\[k_d=\text{max}(L\cdot n,\ 0)\]

\[k_s = \begin{cases}\begin{align}\text{max}(\mathbf{v}\cdot\mathbf{r},\ 0)^{p}&,\ L\cdot n>0\\0\ &,\ L\cdot n\le 0\end{align}\end{cases}\]

'Graphics API > DirectX 11 - Chili' 카테고리의 다른 글

[T24.2] Lighting  (0) 2020.12.05
[T24.1] Lighting  (0) 2020.12.05
[T21.3] Box, Hill, Sphere, Cylinder, Skull, Wave  (1) 2020.12.01
[T21.2] Drawble System  (0) 2020.11.30
[T21.1] Bindable System  (0) 2020.11.29
Comments