[유니티 셰이더] 툰셰이더 기초 1 - Lambert BRDF

오늘의 키워드
- 셰이더
- Lambert
- 툰 셰이더
안녕하세요, 오늘은 셰이더에 대해서 공부한 것을 포스팅해보고자 합니다.
몇 년 전 부터 게임 업계에서 툰 셰이더를 사용하는 서브컬처 게임이 아직까지 매우 인기를 끌고 있습니다.
또한 이러한 툰 셰이더를 활용한 버튜버 또한 매우 인기가 있죠.
최근 많은 사람들이 사용하는 퀄리티 높은 셰이더라고 하면 역시 닐로툰 대표적이지 않을까 생각합니다.

게임 개발에 있어서 데이터 관리, 로직 구현도 중요하지만, 시각적인 부분도 빠질 수 없는 만큼, 셰이더에 대해서 공부하기 해볼까 합니다.
참고 자료
이득우 님의 셰이더 강의 영상을 참고해서 공부를 했습니다.
툰 셰이더 Toon Shader
툰 셰이더는 Lambert 방식으로 계산된 빛을 단순하게 나눠서(계단화해서), 만화처럼 딱 끊기는 명암을 만드는 방식입니다.

따라서 툰 셰이더는 현실처럼 부드러운 빛과 그림자가 표현되지 않고, 밝은 부분과 어두운 부분이 명확하게 나뉘어 표현됩니다.

Lambert (람베르트) 반사

람베르트(Lambert) 반사란 빛이 표면에 닿는 각도에 따라 밝기가 결정되는 가장 기본적인 확산 반사의 양이 점점 감소 됩니다.
그리고 빛이 들어왔을 때, 어느 방향으로 얼마나 반사되는지를 정의하는 함수가 바로 Lambert BRDF 입니다.

밝기 = N · L = cos θ
앞서 살펴봤듯이, Lambert 반사에서 표면의 밝기는 빛이 닿는 각도, 즉 법선 벡터 N과 빛 방향 벡터 L의 내적으로 결정됩니다.
원래는 θ값을 알기 위해서 Acos을 이용하여 계산을 하지만, Acos는 연산 비용이 크기 때문에, 게임에서는 이를 위해서 내적 (Dot)을 사용합니다.
이러한 람베르트 반사를 표현하기 위해서 유니티의 Shader Graph를 사용해봤습니다.

오브젝트 -> 빛 방향 계산

빛의 방향을 출력하는 Main Light Direction 노드가 있지만, 이는 빛 -> 오브젝트의 방향을 출력하기에, Negate를 이용해서 해당값을 반전시켜줍니다.
이로 인해 오브젝트 -> 빛의 방향을 계산해낼 수 있습니다.
법선 벡터 N

법선 벡터 N의 경우, Normal Vector 노드를 통해서 출력해낼 수 있습니다.
Dot(N, L)

두 벡터의 내적을 계산해냅니다. 내적 계산은 Dot Product 노드를 사용합니다.
색 반영

마지막으로 Dot 출력 값과 프로퍼티로 뺀 컬러의 출력값을 Multiply 노드로 곱해서 BaseColor에 반영해줍니다.
결과
