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}]