유니티 셰이더 그래프 예제 12 메인라이트 가져와서 조명모델 & 카툰셰이딩 만들기, Unity 2021 ShaderGraph Get MainLight make new LightModel and CartoonShader
이번에는 라이트 정보를 가져와서, 간단한 NdL 모델을 하나 만들어 보고,또 그 라이트를 이용해서 간단하게 카튠 셰이딩도 하나 해보도록 하자.
조명 모델을 만들어 넣을 거니까, 기존 조명을 참조하는 시스템을 쓰지 않는다.
그러니까
Unlit Shader Graph를 하나 생성한다. 이름은 정당히 원하는 것으로 하고,
MainLight 정보를 참조하기 위한 ShaderGraph 노드는 없다.
그래서 우리는 Custom Function Node라는 우리가 직접 코딩을 해야 하는 노드를 써야 한다.
custom 펑션 노드는 2019부터 추가가 된 노드인데
변화가 많았다. 내부 코딩규약도 달려졌고 해서 특정 코딩을 해뒀는데, 상위 버전에서 100% 호환을 보장하지 않는다.
코드니까....
여기에서 유니티 버전을 명시해두겠다.
해당 버전에서 동작함을 보장한다.
일단 만들어 보자. Custum Function
해당 노드는 노드를 직접 만질게 아니고, Graph Inspector의 Node setting에서 손봐야 한다.
다른 버전에서는 톱니바퀴가 뜨고 뭐 이러는데, 그건 설명안함, 2021에서는 이러면 된다.
다음과 같이 세팅하라
GetMainLight 를 통해 유니티에서 라이트를 가져와서
우리가 준비해둔 Direction, Color에 정보를 넣는다. Outputs로 그럼 우리가 사용할 수 있다.
#if defined(SHADERGRAPH_PREVIEW)
Direction = half3(0.5, 0.5, 0);
Color = 1;
#else
Light light = GetMainLight();
Direction = light.direction;
Color = light.color;
#endif
코드는 따로 빼둔다.
이전 버전에서는 SHADERGRAPH_PREVIEW 체크를 아래와 같으 하는데,
#if SHADERGRAPH_PREVIEW
2021에서는
#if defined(SHADERGRAPH_PREVIEW)
코드로 해야한다.
요기까지 하면 다음과 같은 노드가 생긴다.
모델의 노말 백터와 내적 하여 칼라 출력을 해보도록 하자.
노드 구성
N dot L을 하고 결과를 라이트 칼라와 곱해 base Color로 출력하는 단순한 구성
결과 화면
적당히 되어 보인다.
적당히 커스텀 평션을 어떻게 사용하나 알아보았다.
...
요기까지만 하면 아쉬우니까 하나 더 해보도록 하자.
간단한 카튠 셰이딩의 구현
노드 구성
NdL은 사용한다.
해당 값을 -1~1 범위를 remap으로 0~1로 변경
그 값을 sample gradient 하여 라이트 칼라와 곱하여 출력하면
카튠 셰이딩에서 보이는 라이트 대비하여 딱딱 떨어지는 효과를 볼 수 있다.
참고로 그라디언트를 구성할 때 꼭
Fixed로 구성하여 딱 끊어지는 효과를 주도록 하자.
추가로 왼쪽이 어두운 부분 임도 알자.
실행결과
Custom function 알아둡시다.
참고자료
blogs.unity3d.com/kr/2019/07/31/custom-lighting-in-shader-graph-expanding-your-graphs-in-2019/
봐주셔서 감사합니다.
댓글