본문 바로가기

포트폴리오 /DirectX 11

[ Eunbi's Farm - DirectX 11 ] 툰 쉐이딩과 림라이트 (Toon Shading & RimLight)


[ Rim Light & Toon Shading On ] 



[ Rim Light & Toon Shading Off] 




[ Toon Shading ] 


카툰 렌더링은 사실적인 렌더링 기법과 비교해서 친근한 느낌을 준다는 장점을 가지고 있습니다.

카툰 렌더링은 윤곽선과 음영을 얼마만큼 효과적으로 표현할수 있느냐에 따라서 결과가 달라집니다. 


카툰 렌더링은 모델 윤곽선을 라인 드로잉 스타일로 표현하는 방법과, 모델의 내부를 단순화된 음영으로 표현하는 두 가지 과정으로 나누어집니다. 포트폴리오에서는 두 가지를 모두 충족하는 툰 쉐이딩을 구현하였습니다. 



1. 모델 내부를 단순화된 음영으로 표현하는 기법 


디퍼드 라이트를 이용하므로, LightACC를 해주는 부분에서 빛의 감쇄를 3등분으로 나누어 주는 연산을 하였습니다. 예를 들면, 0부터 0.3까지는 0.3으로, 0.3부터 0.6까지는 0.6으로, 나머지는 1.0으로 처리해주는 것입니다. 


람베르트 코사인 법칙에 의해 빛의 휘도(Luminance)는 빛의 입사벡터와 물체표면의 법선벡터가 이루는 각도의 코사인에 비례합니다.




ceil함수? 무조건 올림함수


diffuse가 0~1사이의값-> 0~3사이의 값으로 변환 ->ceil적용 (값이 0, 1, 2, 3 중 하나가 됨 )-> 3으로 나누면 최종 결과값이 0, 0.3, 0.6, 0.9중 하나가 된다.  





2. 외곽선을 따는 기법 


[ Rim Light ] Fresnel( 프레넬 )공식을 이용한 림라이트 구현


Lambert 공식은 N dot Light 즉, 노멀벡터와 조명벡터를 dot연산한 공식이었습니다. 

두 벡터의 각도가 같으면 밝고, 90도가되면 어두워져 검정색이 되었습니다. 


RimLight는 ViewDir을 이용합니다. 

ViewDir은 버텍스에서 바라보는 카메라의 방향입니다. 

 N dot L 대신 N dot ViewDir을 하면 뷰 벡터는 마치 라이팅 처럼 연산이 되어, 카메라가 마치 조명처럼 인식되어 내가 바라보는 방향이 계속 밝아질 것입니다. 


마치 카메라가 조명인 것처럼 카메라를 바라보는 면이 밝아지고, 카메라와 각도가 벌어질수록 어두워집니다. 

scene에서 뷰를 이리저리 회전해도 이 빛의 각도는 변하지 않습니다. 카메라가 조명인 것처럼 연산되었기 때문입니다.


이 결과를 뒤집어줍니다. 

Emission = 1 - rim;


그러면 각도를 바꾸어도 언제나 외각이 밝아보이면서 RimLight가 만들어집니다. 

그렇지만 이렇게만 해준다면 어두운 외곽선이 매우 두껍고 테두리처럼 보이지 않을 것입니다. 

어두운부분이 한참 존재하다 어두워 지려면 지수형태의 그래프가 나와야 하므로, pow함수로 제곱을 해 주면 됩니다. 

제곱이 더 커질수록 가장자리가 뚜렷해 질 것입니다. 그렇기때문에, rimpower를 제곱의 계수로 설정해줍니다.