OpenGL Lighting Equation 요약 설명

Latex 연습

Table Of Contents

숙제 4. OpenGL Lighting Equation 요약 설명

20190002 강다혜

OpenGL은 퐁의 조명 모델에 기반을 두고, 각 vertex에 사용할 색을 계산한다. 조명 공식을 통해서 각 각 vertex에 대한 RGBA 색을 구할 수 있는데, RGB 채널과 A 채널은 서로 다른 계산 방식을 취하고, 여기에서는 RGB 채널에 대한 계산만 다룬다.

OpenGL의 조명 공식은 크게 물질 자체의 방사 색깔, 전역 앰비언트 반사, 그리고

n
개의 조명의 반사 효과를 모두 더하여 계산된다. 따라서
\bold{c} =
물질의 방사 색깔 + 전역 앰비언트 반사 +
n
개의 조명의 반사 효과의 합으로 구성된다.

물질의 방사 색은

\bold{e}_{cm}
으로 나타내고, 전역 앰비언트 반사는 물질의 앰비언트 색깔인
\bold{a}_{cm}
와 광원들이 장면 전체에 종합적으로 미치는 간접 조명 효과를 고려하기 위한 광원의 색깔인
\bold{a}_{cs}
을 곱한 값인
\bold{a}_{cm} * \bold{a}_{cs}
로 나타낸다. 따라서 여기까지의 조명 공식은
\bold{c} = \bold{e}_{cm} + \bold{a}_{cm} * \bold{a}_{cs} + \sum^{n-1}_{i = 0}
i
번째 조명의 반사 효과 가 된다.

조명의 반사 효과는 쉐이딩을 하려는 지점의 꼭지점 좌표

V
와 그 점에서의 법선 벡터
\bold{n}
과 조명 인자를 사용하여 계산한다. 광원이 여러개가 있을 경우에, 지역적인 반사 효과는 각 광원에 대한 효과를 더하게 되는데, 우선은
i
번째 광원의 지역적인 효과를 알아보고, 나중에 이를 모두 더하여 조명 공식을 완성하겠다.

광원이 물체에 영향을 미치는 방법으로는 앰비언트 반사, 난반사, 정빈사의 3가지가 있다. 위의 조명 공식에서

\bold{a}_{cm} * \bold{a}_{cli} + (\bold{n}\odot \overrightarrow{\bold{\text{VP}}}_{pli})\bold{d}_{cm} * \bold{d}_{cli} + (f_i)(\bold{n}\odot \bold{\hat{h}}_i)^{s_{rm}}\bold{s}_{cm} * \bold{s}_{cli}

부분은

i
번째 광원에 대한 앰비언트 반사, 난반사, 정반사 값을 모두 더한 것이다.

위 공식에서

\bold{a}_{cm} * \bold{a}_{cli}
i
번 광원에 대한 지역 앰비언트 반사 색이다.
\bold{a}_{cm}
은 위에서와 같이 물질의 앰비언트 색을 나타내고,
\bold{a}_{cli}
i
번째 광원이 지역 앰비언트 반사에 직접적으로 영향을 미치는 광원의 색깔이다.

다음으로 난반사의 계산식은

(\bold{n}\odot \overrightarrow{\text{VP}}_{pli})\bold{d}_{cm} * \bold{d}_{cli}
이다.
\overrightarrow{\text{VP}}_{pli}
의 의미를 알아보기 위해서 3차원 공간에서의 두 개의 동차 좌표
\text{P}_1
\text{P}_2
가 주어졌을 때,
\overrightarrow{\text{P}_1\text{P}_2}
벡터는 다음과 같이 정의한다.
\text{P}_1
\text{P}_2
w
좌표를 각각
w_1, w_2
라고 가정할 때, 1.
w_1, w_2
가 모두 0이 아니라면
\overrightarrow{\text{P}_1\text{P}_2}
는 점
\text{P}_1
에서
\text{P}_2
로 향한 방향으로 길이가 1인 단위 벡터를 의미한다. 2.
w_2
만 0이라면,
\overrightarrow{\text{P}_1\text{P}_2}
\text{P}_2
에 해당하는 벡터의 길이를 1로 만들어 준 단위 벡터를 나타낸다. 3.
w_1
만 0이라면,
\overrightarrow{\text{P}_1\text{P}_2}
\text{P}_1
이 나타내는 방향의 반대 방향에 대하여 길이가 1인 벡터를 의미한다. 4.
w_1, w_2
가 모두 0이라면
\overrightarrow{\text{P}_1\text{P}_2}
\text{P}_2 - \text{P}_1
이 가리키는 방향으로의 단위 벡터를 나타낸다.

이러한 정의를 통하여

\overrightarrow{\text{VP}}_{pli}
의 의미를 알아볼 수 있다.
\text{V}
는 현재 조명 계산을 하려는 꼭지점의 좌표이므로
w
좌표는 0이 아니라고 가정해도 된다.
\text{P}_{pli}
는 점 광원을 사용할 경우, 광원의 위치를 나타내며
w
좌표는 0이 아니고, 평행 광원을 사용할 경우, 광원의 방향을 나타내며
w
좌표는 0이다. 따라서
\overrightarrow{\text{VP}}_{pli}
는 광원에서 빛이 들어오는 방향의 반대 방향에 대해서 길이가 1인 벡터가 된다. 그리고 나서
\bold{n}
벡터와 내적을 취해
\bold{n}\odot \overrightarrow{\text{VP}}_{pli}
식을 얻게 된다. 이 식이 양수일 경우에만 그 값을 취하고, 음수일 경우, 즉 뒤에서 들어오는 빛일 경우에는 고려하지 않고, 0을 취한다.

\bold{d}_{cm}
는 물질의 난반사 색이고,
\bold{d}_{cli}
i
번째 광원이 난반사에 직접적으로 영향을 미치는 광원의 색깔이다.

정반사의 계산식은

(f_i)(\bold{n}\odot \bold{\hat{h}}_i)^{s_{rm}}\bold{s}_{cm} * \bold{s}_{cli}
이다.

해프웨이 벡터

\bold{h}_i
는 다음과 같이 정의된다.

\bold{h}_i = \left \{ \begin{array}{cc} \overrightarrow{\text{VP}}_{pli} + \overrightarrow{\text{VP}}_{e}, \qquad\quad v_{bs} = \text{TRUE,} \\ \overrightarrow{\text{VP}}_{pli} + (0\;0\;1\;0)^t,\quad v_{bs} = \text{FALSE}\end{array} \right.

여기서 해프웨이 벡터는 광원에 대한 방향과 관찰자 방향의 중간 방향으로의 단위 벡터로 정의되는데, 광원에 대한 방향은

\overrightarrow{\text{VP}}_{pli}
이고, 관찰자의 방향은 지역 관찰자를 사용하는지 여부에 따라서 다르게 선택된다. 만약 지역 관찰자를 사용한다면
v_{bs}
\text{TRUE}
이고, 관찰자가 눈 좌표계의 원점
\text{P}_e = (0\;0\;0\;1)^t
에 있는 경우이다. 따라서 꼭지점 좌표
\text{V}
에서 원점으로 향하는 벡터
\overrightarrow{\text{VP}}_{e}
가 관찰자 방향이 된다. 지역 관찰자를 사용하지 않는다면, 즉 무한 관찰자를 사용한다면
v_{bs} = \text{FALSE}
이고 눈 좌표계에서 양의
z_e
축 방향인
(0\;0\;1\;0)^t
이 관찰자 방향이 된다. 그리고 해프웨이 벡터는 단위 벡터가 되어야 하므로
\bold{\hat{h}}_i
를 사용한다.

정반사 또한 난반사처럼 광원이 표편의 앞쪽에서 빛을 비추는 경우만 고려하기 때문에,

f_i
를 사용하여 이 부분에 대한 처리를 한다.
f_i
\bold{n}
벡터와
\overrightarrow{\text{VP}}_{pli}
벡터 사이의 각도가 90도보다 크면 1, 아니면 0의 값을 가진다. 따라서 광원이 앞에서 빛을 비추지 않는 경우, 0을 곱해 뒤쪽에서 들어오는 빛은 고려하지 않게 된다.

\bold{s}_{cm}
는 물질의 정반사 색이고,
\bold{s}_{cli}
i
번째 광원이 정반사에 직접적으로 영향을 미치는 광원의 색깔이다.

이렇게

i
번째 조명에 대해서 얻어진 식은
\bold{a}_{cm} * \bold{a}_{cli} + (\bold{n}\odot \overrightarrow{\bold{\text{VP}}}_{pli})\bold{d}_{cm} * \bold{d}_{cli} + (f_i)(\bold{n}\odot \bold{\hat{h}}_i)^{s_{rm}}\bold{s}_{cm} * \bold{s}_{cli}
인데, 실제로는
att_i
spot_i
를 곱해 얻은 식인

(att_i)(spot_i)[\bold{a}_{cm} * \bold{a}_{cli} + (\bold{n}\odot \overrightarrow{\bold{\text{VP}}}_{pli})\bold{d}_{cm} * \bold{d}_{cli} + (f_i)(\bold{n}\odot \bold{\hat{h}}_i)^{s_{rm}}\bold{s}_{cm} * \bold{s}_{cli}]

을 반사 색깔로 사용한다.

att_i
는 빛의 감쇠 효과를 위한 값이고, OpenGL에서는 다음과 같이 정의된다.

att_i = \left \{ \begin{array}{cc} {1 \over {k_{Oi} + k_{1i}\parallel\text{VP}_{pli}\parallel + k_{2i}\parallel\text{VP}_{pli}\parallel^2}},\quad \text{P}_{pli}\text{'s}\;w\neq 0, \\ 1.0, \qquad\qquad\qquad\qquad\text{otherwise}\end{array} \right.

광원이 무한의 거리만큼 떨어진 평행 광원인 경우,

\text{P}_{pli}
w
좌표가 0이다. 이 경우에
att_i
는 1.0이 되므로 위 식에는 영향을 미치지 않는다. 광원이 점 광원인 경우, 임의의 벡터
\text{d}
에 대해서
\parallel\text{d}\parallel
는 이 벡터의 길이라고 할 때,
\parallel\text{VP}_{pli}\parallel
는 쉐이딩 지점에서 광원까지의 거리가 된다. 따라서 거리에 대한 이차식의 역수를 사용하여 빛의 감쇠 효과를 나타낼 수 있고, 이 식에서
k_{0i}
i
번 광원의 상수 감쇠 인자를,
k_{1i}
i
번 광원의 1차 감쇠 인자를,
k_{2i}
i
번 광원의 2차 감쇠 인자를 나타낸다.

spot_i
i
번째 광원이 스폿 광원일 경우에 이를 처리하기 위해 사용하고, 다음과 같이 정의된다.

spot_i = \left \{ \begin{array}{cc} (\overrightarrow{\text{P}_{pli}\text{V}}\odot\bold{\hat s}_{dli})^{s_{rli}} c_{rli} \neq 180.0 \;\&\; \overrightarrow{\text{P}_{pli}\text{V}}\odot\bold{\hat s}_{dli} \geq \text{cos}c_{rli},\\ \qquad 0.0, \qquad\quad c_{rli} \neq 180.0 \;\&\; \overrightarrow{\text{P}_{pli}\text{V}}\odot\bold{\hat s}_{dli} < \text{cos}c_{rli},\\ 1.0, \qquad\quad c_{rli} = 180.0\qquad\qquad\qquad\qquad\quad\end{array} \right.

스폿 광원의 절단 각도

c_{rli}
의 디폴트 값은 일반 점 광원을 사용하는 것에 해당하는 180.0이고, 이 때의
spot_i
값은 1.0이므로 위의 조명 공식에 아무 영향을 미치지 않는다. 스폿 광원에 180.0이 아닌 값을 줌으로써 스폿 광원을 사용할 수 있다. 스폿 조명 효과는 점
\text{V}
가 절단 각도 범위 내에 들어올 경우에만 적용된다. 따라서 스폿 조명의 범위 밖에 있는 vertex의 경우에는 반사색이 검은색이어야 한다. 어떤 vertex가 스폿 조명의 바깥에 있으려면, 조명의 위치에서 꼭지점을 향한 방향에 대한 단위 벡터인
\overrightarrow{\text{P}_{pli}\text{V}}
와 스폿 조명의 중심축 방향에 해당하는 단위 벡터 와 내적을 취한 값이
\text{cos}c_{rli}
보다 작아야 한다. 따라서 이 경우
spot_i
는 0.0이 되고, 해당 조명에 대한 반사색은 0.0, 즉 검은색이 된다. 만약 V가 스폿 조명 범위 내에 들어온다면, 주변으로 갈 수록 어두운 효과를 내기 위해서
\text{cos}^{s_{rli}}\psi
에 해당하는 값, 즉
(\overrightarrow{\text{P}_{pli}\text{V}}\odot\bold{\hat s}_{dli})^{s_{rli}}
을 사용하여 스폿 조명 효과를 내 준다.

이러한 과정을 거쳐서

i
번째 조명이 물체 표면에 미치는 영향을 표현할 수 있었다. 따라서
n
개의 광원이 있다면, 이 조명들이 모두 물체 표면에 미치는 영향은 이 조명들이 미치는 영향을 각각 더한 값인
\big( \sum^{n-1}_{i = 0}(att_i)(spot_i)[\bold{a}_{cm} * \bold{a}_{cli} + (\bold{n}\odot \overrightarrow{\bold{\text{VP}}}_{pli})\bold{d}_{cm} * \bold{d}_{cli} + (f_i)(\bold{n}\odot \bold{\hat{h}}_i)^{s_{rm}}\bold{s}_{cm} * \bold{s}_{cli}] \big)
이고, 여기에 전역 앰비언트 반사
\big( \bold{a}_{cm} * \bold{a}_{cs} \big)
와 물질의 방사 샐깔
\big( \bold{e}_{cm} \big)
을 더해 아래와 같은 OpenGL의 기본 조명 공식을 얻을 수 있다.

\bold{c} = \bold{e}_{cm} + \bold{a}_{cm} * \bold{a}_{cs}+ \sum^{n-1}_{i = 0}(att_i)(spot_i)[\bold{a}_{cm} * \bold{a}_{cli} + (\bold{n}\odot \overrightarrow{\bold{\text{VP}}}_{pli})\bold{d}_{cm} * \bold{d}_{cli} + (f_i)(\bold{n}\odot \bold{\hat{h}}_i)^{s_{rm}}\bold{s}_{cm} * \bold{s}_{cli}]