기초 조명셰이더 난반사광
(게임속에서 직접광은 계산하지만 간접광은 수없이
반사의 반사를 거치므로 표현하기 어렵다고 한다.)
간접광 : 반사되는 빛
직접광 : 광원으로 직접 받는 빛
난 반사광(Diffuse Light)
우리가 물체를 볼 수 있는 이유는 다른 물체가 비추는 빛이 이 물체를 표면에 반사되기 때문에 볼 수 있는 것이다. 이 것이 난 반사광이라고 한다.
물체를 어느 방향에서 보든 명암이나 색조가 크게 변해 보이지 않는 이유가 여러 방향으로 고르게 퍼지는 난 반사광 덕분이다.
(그림 : https://kblog.popekim.com/2011/12/04-part-1.html)
수학적으로 난 반사광을 어떻게 계산하려면?
lambert모델(게임에서 주로 사용됨)을 살펴보면
입사광이 이루는 각의 코사인 값을 구하면 난 반사광의 양을 구 할 수 있다.
입사광과 법선의 두개의 각도에 따라 코사인 값은 아래와 같다.
0도 => 1
90도 => 0
90도를 넘는 순가 음수 값을 갖다가
180도에서 -1
음수 값은 아예 깜깜해지기 때문에 값 변경이 필요하다.
코사인값을 구하는 수학 공식을 보면
cosθ = (A ∙ B) ÷ (| A |ⅹ| B |);
두 개의 내적을 구한 뒤 두 벡터의 길이를 곱한 결과를 나눈 것과 같다.
여기서 두 벡터를 1로 정규화한다. (두 벡터가 이루는 각이 중요할뿐 길이는 중요하지 않기 때문에)
cosθ = (A' ∙ B')
두 벡터가 이루는 각의 코사인 값은 두 벡터의 내적과 같다는 의미이다.
셰이더에서 난 반사광을 계산하려면?
물체 표면 벡터는 정점에 저장되어 있기 때문에 그대로 가져오면 되고 입사광의 벡터는 광원의 위치에서
현재 픽셀 위치까지 긋고 그 그것의 벡터를 가져와야한다.
선을 긋는 것을 벡터의 뺄셈이라고 하는데, 모든 변수의 공간을 일치 시킨 뒤 현재 위치에서 광원의 위치를 빼면 입사광의 벡터를 구할 수 있다. (표면의 법선도 같은 공간에 있어야 함)
난 반사광 범위는 0~1이니까 위에서 코사인값을 0이하의 값은 0으로 1이상의 값을 1로 맞춰 줘야한다.
학습참고 출처 https://kblog.popekim.com/2011/12/04-part-1.html
'유니티 > 셰이더' 카테고리의 다른 글
셰이더) 램버트 라이트 (0) | 2019.03.06 |
---|---|
셰이더) 서피스 툰셰이더 #1 학습중 (0) | 2019.03.03 |
유니티) 기초 셰이더 #2 서피스 셰이더 (0) | 2019.02.28 |
유니티) 기초 셰이더 #1 (0) | 2019.02.24 |
유니티) 버텍스 및 프래그먼트 기초 셰이더 #2 (0) | 2019.01.11 |