(DirectX : Basic) 21. Lighting-1

Posted by : at

Category : DirectX


말 그대로 조명을 어떻게 넣느냐에 대한 설명이다.

조명은 세 가지로 나뉜다

  1. diffuse(난반사) : 들어오는 빛의 각도에 따른 빛 계산
  2. ambient(환경) : 환경광에 의한 빛 반사
  3. specular(정반사) : 들어오는 빛의 정(가장센) 빛 반사

Normal Vector (diffuse)

빛이 수직반사되어 나오는 빛을 Normal Vector라 하자.
또한 들어오는 빛과 Normal Vector 사이의 값을 a라 하자


 (빛)(L)
 \
  \       (Normal Vector)(N)
   \             |
    \            |
     \           |
      \     (a)  |
                 |
--------------------------------------
            (   물체   )

이런 Normal Vector는 들어온 빛에 특정 값을 곱하여 리턴하게 된다.
예를들어 RGB(100, 100, 100)으로 빛이 들어왔다면
Normal Vector는 RGB(50, 50, 50)이런 식이다.

그럼 Normal Vector를 어떻게 구해야 할까? -> 빛*cos(a) 빛의 각도를 반영해 준다.

아니 그럼 cos(a)를 구하려면 a를 알아야하는데 어떻게 구하는데??
-L*N = 1*1*cos(a) L과 N이 단위 벡터이기에 -L과 N을 내적하면 cos(a)를 구할수 있다.

이렇게 구하는 이유가 빛을 어떻게 받느냐(비스듬히, 직각으로 등)에 따라 반사되는 빛을 계산하기 위함이다.


ambient(환경광)

빛을 직접받는 부분이 아니더라도 간접적으로 빛을 받을 수 있다.
(가령 책상위에 등불이 있고 책상아래 물체가 있다면 빛을 직접적으로 못 받더라도 책상아래 물체는 보이게 된다.)

이런 ambient는 연산의 마지막에 특정값을 더해주는 형태로 구현하게 된다.


specular(정반사)


 (빛)(L)
 \              (정반사)(R)
  \      (N)      /
   \      |      /
    \     |     /
     \    |    /
      \(a)|   /
       \  |  /
--------------------------------------
     (   물체   )

정반사 벡터는 딱 정반사(a각으로 반사되는) 되는 벡터가 가장 세고
딱 정반사 되는 벡터의 + or - 되는 벡터는 그 만큼 세기가 작아질 것이다.

일단 딱 정반사 되는 벡터 R을 먼저 구해보자.

          (N)
   \-------|
    \      |
     \     |
 (-L) \    | cos(a)
       \(a)|
        \  |
         \ |

-LN은 단위 벡터이고 내적시에 cos(a)을 구할수 있었고
(더 쉽게는 -L이 단위 벡터라 크기가 1이고 밑변이 cos(a)가 된다고 생각)

우리가 L을 알기에 L에 cos(a) 벡터만 2번 더하면 R을 쉽게 구한다.


그럼 특정 POINT에서 오는 값? (예를들어 횟불)은 어떻게 처리할까?

지금까지 위에서 설명한 값들은 태양 빛 어럼 전역에서 오는 빛을 의미했고
특정 POINT에서 오는 빛의 값은 빛이오는 위치, 거리 등이 필요하다

           /
          /
         /    (물체)
        /
   (광원)
        \
         \
          \
           \
            \

광원과 물체를 잇는 벡터 A를 정의하고
광원에서 수직으로 나가는 단위벡터 LA와 내적시 A*L*cos(a)가 되며
그 내적 값은 광원과 물체의 x축 거리가 된다
x축 거리가 멀어지면 빛을 처리할지 말지를 결정해서 빛을 계산하면 된다.

광원에서 지원하는 각은 구하기 쉽기에 생략(대략 A와 L의 내적후 나온 cos의 acos하면 각도가 나오고 그 각도가 빛을 지원하는 각인지만 확인하면 됨.)


About Taehyung Kim

안녕하세요? 8년차 현업 C++ 개발자 김태형이라고 합니다. 😁 C/C++을 사랑하며 다양한 사람과의 협업을 즐깁니다. ☕ 꾸준한 자기개발을 미덕이라 생각하며 노력중이며, 제가 얻은 지식을 홈페이지에 정리 중입니다. 좀 더 상세한 제 이력서 혹은 Private 프로젝트 접근 권한을 원하신다면 메일주세요. 😎

Star
Useful Links