유니티 쉐이더 - 툰 쉐이더
오늘 할 툰 쉐이더는 아웃라이너를 frensel로 표현한 방법이다.
cull back cull front를 이용한 쉐이더 방식이 아니다.
우선 툰 쉐이더를 만들기 전에 half Lamber공식을 이용한 기본적인 쉐이더를 만들어 준다.(자세한건 간단하니 검색)
그러고 나서 끊어지는 음영을 처리해줘야 하는데,
Half람버트의 빛의 강도 공식
float ndot = dot(s.Normal, lightDir)*0.5f+0.5f;
여기서 ndot의 값을 변경해주어 표현하면 된다.
그 표현 방법이 if문이나 ceil을 이용하는 방법인데
if문을 이용하는 방법은 아래와같고 굉장히 무겁다.
if(ndot>0.7f)
{
ndot=1;
}
else if(ndot>0.4f)
{
ndot=0.7;
}
ceil을 이용하는 방법은
ceil은 소수점아래를 올리는 것이다.
※0.01~1.0 = 1
※1.01~2.0 = 2
그러므로 이때 그림자를 5분할 하고 싶다면
ndot*=5;(0~5)값을 나타냄
ndot=ceil(ndot)/5;(나누어 줘서 0~1사이 값으로 나타내기)
하지만 이렇게하면 좀 더 세부적으로 표현할 수 없다.
이제 외곽선을 표현해볼것인데.
림을 이용하여 표현해 볼거다.
림은 표현방식이 빛의강도와 다르게
viewDir과 Normal을 내적한 값이다.
이때 이를 abs(절대값)을 취해서
if(rim>0.3)
rim=1;
else
rim=-1;// 노멀과 viewDir의 사이각이 크면 외곽선 처리를 해줌 (보통 가장자리거나 눈 아래같은 곳이겠지!)
그럼 이런식으로 된다.
끝!
덧붙여서, Diffuse Wrapping 방식은 지정된 텍스처를 음영으로 이용해서 음영을 표현하는 방식인데
내가 지금 자료가 없는 관계로 나중에 찾아서 해보거나 자료를 찾아보길 바란다!