블린-퐁 방식의 한계
한계가 있을 뿐, 블린퐁 방식이나 램버트 방식같은 스탠다드 방식이 가진 공통점이 있다.
실재하는 사물의 재질과 비슷하게 만들려고 한다는 것이다.
이런 렌더링 방식을 통틀어서 PR(Photo Realistic) 렌더링이라 한다.
사실적이지 않은 렌더링은 NPR(Non-Photo Realistic) 렌더링이라 한다.
툰 셰이딩은 대표적인 NPR 셰이더이다.
툰 셰이딩의 특징은 다음과 같다.
외곽선 만드는 방법
Pass?
한 번 그리는 것이 1Pass, 두 번 그리는 것은 2Pass
2Pass 방식
단점
Fresnel 방식
장점
단점
외곽선 검출법
Vertex Shader는 버텍스 하나 마다 한 번씩 실행된다.
Fragment Shader는 픽셀 하나마다 한 번씩 실행된다.
즉, 일반적으로 Vertex Shader에서 연산하는 것이 Fragment에서 연산하는 것보다 가볍고 정밀도는 떨어진다.

Vertex Shader의 Position에 Sine Time을 더한 Position 노드를 연결하면 모델이 움직이는 걸 확인할 수 있다.
이 방법은 애니메이션 키프레임을 따로 잡을 필요가 없어 매우 유용하다.
깃발이나 물고기가 꼬리치는 애니메이션, 흔들리는 나뭇잎이나 풀 등을 간단하게 만들 수 있다.

Normal Vector만큼 position을 더하면 부풀어오른다.
Normal Vector에 숫자를 곱해주면 부풀어 오르는 정도를 조절할 수도 있다.
Troubleshooting
이후 외곽선으로서 적용하려고 일반 머테리얼 적용한 모델과 겹쳤는데, 크기가 오히려 줄어든 것을 확인. 책과 비교해보니 Space가 World가 아니라 Object로 돼있어야 했다. (Normal Vector도 Object로 바꿔줘야 하는 것 같음)

Graph Settings에서 Render Face를 Back으로 설정하면, 면이 뒤집어진다.
안쪽 면만 보이는 거지만, Normal은 그대로라서, 어두운 면이 그대로 보이게 되어 Ambient Color만 보인다.

Graph Settings에서 Material을 Unlit으로 바꾸고,
똑같은 오브젝트를 복사한 후 정상적인 머테리얼을 적용시키면 외곽선 효과가 된다.
현재의 아웃라인은 카메라에 가까워질수록 두꺼워진다.
카메라 거리와 상관없는 균등한 두께의 아웃라인을 만들고 싶다면 카메라의 거리에 따른 두께 보정이 필요하다.
방금은 오브젝트를 하나 더 추가해서 외곽선 효과를 만들었고,
오브젝트의 머테리얼을 하나 더 추가해서 Outline 셰이더를 입혀줄 수도 있다.
이런 경우엔 오브젝트가 원래 단일 머테리얼을 가지고 있어야만 가능하다.
또 다른 방법으로, SRP의 기능인 Render Feature로 두 번째 패스를 추가할 수 있다.
Render Feature?
렌더링 레이어 같은 개념. 엔진에서 추가 렌더링 오브젝트와 머테리얼, 렌더링 타이밍까지 결정할 수 있다.

Edit > Project Settings > Graphics > Scriptable render Pipeline Settings 더블 클릭 > Inspector > Rendering > Renderer 더블 클릭 > 맨 아래 Add Render Feature > Render Objects
Skull 레이어에 해당하는 오브젝트만 렌더 피쳐로 한 번 더 그려서, outline 머테리얼로 덮어쓰는 작업을 한 것.
sub graph로 만들었던 Lambert를 복사하여 이름을 Toon으로 바꾸고 공식을 Half Lambert로 바꿔준다.

Comparison 노드로 Greater than 0.5 조건을 설정해주고,
Branch 노드에서 이를 '0.5 이상이면 1, 0.5 미만이면 0'으로 바꿔준다.
이를 응용하여 0과 1 자리에 텍스처나 컬러를 넣어줄 수도 있다.
Comparison은 2단계가 넘어가는 조건문을 만들 수 없다.

Half Lambert의 결과에 5를 곱해주고 값들을 ceiling으로 이산적으로 만들어준 후에 5로 다시 나눠주면 음영이 다섯 단계로 나눠진다.
이 방법은 간단하지만 음영의 범위를 세부적으로 정할 수 없다. 어두운 부분을 좀 더 넓게라던가.
Troubleshooting
결과가 책과 다르게 너무 밝음. bloom이 켜질 정도. 예제를 불러왔는데 과정은 차이 없으면서 결과는 차이남.
아무리 살펴봐도 다른게 없음. Transform 노드의 결과가 달라서 혹시 이건가 하고 갈아껴봤더니 결과가 똑같음.
그럼 이전에는 노말맵을 어떻게 설정해놨지? 하고 보니까 Transform의 Type이 Position이 아니라 Direction으로 돼있었음.
Direction으로 변경했더니 책과 결과가 같아짐.