유니티 쉐이더 - 툰 쉐이더

오늘 할 툰 쉐이더는 아웃라이너를 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 방식은 지정된 텍스처를 음영으로 이용해서 음영을 표현하는 방식인데

내가 지금 자료가 없는 관계로 나중에 찾아서 해보거나 자료를 찾아보길 바란다!

  Comments,     Trackbacks