[Unity] URP 셰이더 그래프로 Lambert Light 만들기 (+Half Lambert)

2023. 7. 18. 18:44Unity

728x90
반응형

간단한 Lambert Light

[Normal Vector] 노드와 [CustomLight] 커스텀 노드를 [Dot Product]로 내적하여 Lambert Light를 표현할 수 있게 되었다.

 

 

하지만 여기서 -1부터 1까지 표현되는 그림자이기 때문에 추가 조명을 더해도 -1에서 0이상 밝아지지 않는 문제가 있을 수 있으므로 0~1로 제한하는 [Saturate] 노드를 붙여준다. ([Maximum] 노드를 사용해 들어온 값과 0을 비교하여 0 이하는 더 큰 값인 0을 출력하게 할 수도 있고, [Clamp] 노드를 이용하여 직접 0~1 범위를 설정할 수도 있다.)

 

 


 

 

Normal Map 적용

예제 파일에 함께 들어있는 Normal Map을 사용한 모습인데, 기존 Normal Map의 Space가 Tangent로 설정되어있기 때문에 [Transform] 노드를 사용하여 Tangent -> World로 바꿔주는 작업을 해야한다.

 

 


 

 

Half Lambert

[Unity] URP 셰이더 BRDF(양방향 반사도 분포 함수)

이전 글에서 HLSL로 표현한 Half Lambert를 만들 때 보았던 것을 Shader Graph로 보면,

 

 

0.5를 곱하고 0.5를 더해서 더 부드러운 음영으로 표현할 수 있다. 하지만 물리적으로 맞지 않고 거의 빛의 반대편까지 영향을 받기 때문에 실제 사용에서는 [Pow]를 사용한다고 한다.

 

 

[Pow] 사용

 

 

*0.7+0.3 사용

 

 

Half Lambert 비교

*0.5+0.5 / ^3 Pow / *0.7+0.3

 

 


 

 

Base Map 연결하기

Lambert Light의 완성을 위해 Base Map과 연산을 한다. 하지만 여전히 라이트의 색상을 받아올 수는 없다.

 

 


 

 

라이트 색상 받는 기능 추가

라이트의 색상을 받기 위해 [CustomLight] 노드에 컬러에 관한 줄을 추가한다.

Directional Light 색을 바꾸니 적용되는 것을 볼 수 있다.

 

 


 

 

환경광 추가하기

[Baked GI] 노드를 연결해 보면 환경광이 작용하는 모습을 볼 수 있다.

 

 

Background에 따라서 환경광이 다르게 나오는 것을 볼 수 있다.

 

 

[Baked GI] 노드는 World Space로 Transform 된 Normal Map을 받아서 Base Map과 곱해서 마지막에 주광에 더해주게 된다.

직접광이 닿지 않는 부분도 환경광에 의해 빛이 닿는 것을 볼 수 있다.

 

 


 

 

Ambient Occlusion 추가하기

AO 텍스쳐는 환경광을 차폐하는 것이기 때문에 환경광에 곱하면 된다.

 

 


 

 

SubGraph로 정리하기

[CustomLight] 노드부터 선택된 [Multiply] 부분 까지를 묶어서 SubGraph로 만들어 준다.

 

 


 

 

텍스쳐들과 베이스 컬러 조절, AO 조절은 프로퍼티로 조절 가능하게 하여 정리한 모습이다.

 

 


참고자료

 

대마왕의 유니티 URP 셰이더 그래프 스타트업

셰이더의 기본 개념에서부터 셰이더 그래프(노드)의 기본 활용법까지 소개하여, 다양하고 재미있는 셰이더를 만드는 방법을 알려준다. 또한, 자신이 원하는 효과를 만들기 위해 노드를 어떤 방

www.aladin.co.kr

728x90
반응형