Shader Graph가 재밌어서, 간단하게 만들어보기로 했다.
Main Light 설정부터 한다.
Shader Graph의 노드에는 Light 노드가 없어서, Custom Function으로 Light를 받아와야 한다.
Shader Graph는 Unlit Shader를 사용했다.
#if defined(SHADERGRAPH_PREVIEW)
lightDir = half3(0.5f, 0.5f, 0.0f);
lightColor = 1;
#else
Light light = GetMainLight();
lightDir = light.direction;
lightColor = light.color;
#endif
사실 공식이 잘 기억 안나서, 저번에 코드로 정리해놓은 것을 보고 만들었다.
2021.03.03 - [기타/DirectX] - [DirectX11] 12일차 (Depth 버퍼 만들기 / 디퓨즈 만들기)
2021.03.04 - [기타/DirectX] - [DirectX11] 13일차 (스페큘러 구하기 / 림 라이트 구현하기)
코드로 할 때는 Light 벡터, View 벡터의 방향이 안쪽을 향하는 것을 기준으로 계산했다.
그래서 Light의 반사 벡터를 구할 때면, 방향이 바깥쪽으로 향했다.
당연히 벡터의 방향이 같은 것이라고 생각하고, 노드로 기능을 구현했는데 원하는 값이 안나왔다.
알아보니, 유니티에서는 벡터의 방향을 아래의 왼쪽 이미지처럼 전해주나보다.
그래서 반사 벡터의 방향도 생각한 것과 반대로 나왔나보다. 방향을 잘 생각해서 계산해야겠다.
램버트
(Normal 벡터), (Light 벡터) 내적하기.
하프 램버트
램버트 연산에 (* 0.5 + 0.5) 추가하기.
퐁
(Normal 벡터를 기준으로 Light의 반사벡터), (ViewDirection) 내적하기.
블린 퐁
(Light 벡터, ViewDirection의 Half 벡터), (Normal 벡터) 내적하기.
림 라이트
1 - (Normal 벡터, View 벡터 내적.)
조합해서 쓰면
따로 구한 뒤에, 모두 더해주면 된다.
Diffuse(난반사) : 램버트
Specular(정반사) : 블린-퐁
림 라이트
'기타 > Unity' 카테고리의 다른 글
Dissolve 효과 (0) | 2021.08.10 |
---|---|
Clocking 효과 (0) | 2021.08.10 |
[Unity] 캐릭터 파츠 교체하기 / 파츠 구조 변경 후 애니메이션 적용시키기 (0) | 2021.04.01 |
[Unity Github Desktop] CRLF 오류 (2) | 2019.12.10 |
[Unity] Rendering Pipeline 정리 3 (과정) (2) | 2019.11.28 |