말 그대로 조명을 어떻게 넣느냐에 대한 설명이다.
조명은 세 가지로 나뉜다
- diffuse(난반사) : 들어오는 빛의 각도에 따른 빛 계산
- ambient(환경) : 환경광에 의한 빛 반사
- 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)|
\ |
\ |
-L
과 N
은 단위 벡터이고 내적시에 cos(a)
을 구할수 있었고
(더 쉽게는 -L
이 단위 벡터라 크기가 1이고 밑변이 cos(a)
가 된다고 생각)
우리가 L
을 알기에 L
에 cos(a) 벡터만 2번 더하면 R
을 쉽게 구한다.
그럼 특정 POINT에서 오는 값? (예를들어 횟불)은 어떻게 처리할까?
지금까지 위에서 설명한 값들은 태양 빛 어럼 전역에서 오는 빛을 의미했고
특정 POINT에서 오는 빛의 값은 빛이오는 위치, 거리 등이 필요하다
/
/
/ (물체)
/
(광원)
\
\
\
\
\
광원과 물체를 잇는 벡터 A
를 정의하고
광원에서 수직으로 나가는 단위벡터 L
을 A
와 내적시 A*L*cos(a)
가 되며
그 내적 값은 광원과 물체의 x축 거리가 된다
x축 거리가 멀어지면 빛을 처리할지 말지를 결정해서 빛을 계산하면 된다.
광원에서 지원하는 각은 구하기 쉽기에 생략(대략 A와 L의 내적후 나온 cos의 acos하면 각도가 나오고 그 각도가 빛을 지원하는 각인지만 확인하면 됨.)