Unity 물 shader
WaterShader
Create > Shade Graph > URP > Lit Shader Graph를 생성해준다.
voronoi 노드를 추가한 후, base color에 연결해주고, Ripple Density변수를 만들어서 Cell Density항목에 연결해준다.
Ripple Density는 Ripple의 밀도를 조절하는 변수이다. 원하는 정도로 조정해준다.
자연스럽게 물이 움직이도록 하기 위해 Time노드와 변수 RippleSpeed, Multiply노드를 추가해준 후, Multiply노드의 A와 B에 각각 연결해준다. 이후 RippleSpeed값을 변경해주면 Ripple이 움직이는 것을 볼 수 있다. 이제 Power노드와 RipplePower변수를 추가해주고, 연결을 해준다음, RipplePower변수의 값을 조절해서 좀 더 물에 가깝게 만들어준다.
이제 색상을 추가해 줄 것이다.
물의 빛이 나는 부분을 표현해주기 위해 RippleColor변수를 추가해주고, Multiply노드에 연결해준다. RippleColor의 Mode를 HRD로바꾸어주고, 원하는 색상을 선택해준 후, Intensity를 조절해준다.
그 다음 물의 기본 색을 정해주기 위해 Add 노드와 Color변수를 추가해주고, 연결한 다음, 원하는 색상으로 변경해준다.
Add노드의 Out에 BaseColor를 연결해주고 AssetSave를 해준다.
이제 WaterShader에 마우스 오른쪽 클릭 > Create > Material을 해준 후, Plane에 적용해주면 간단하게 물이 만들어진 것을 볼 수있다.
깊이 있는 물 만들기
DepthShader
가장 먼저 물의 깊이를 나타내 줄 것이다.
Create > Shader Graph > Sub Graph를 하여 DepthShader를 생성해준다.
가장먼저 Screen Position과 Scene Depth노드를 추가해준다. Screen Position의 Mode를 Raw, Scene Depth의 Sampling을 Eye로 설정해준다.
그다음 ScreenPosition의 아웃에서 선을 뽑아 Split 노드를 추가해준다. Split 노드는 RGB를 분리시켜주는 노드이다.
우리는 Split Node의 Alpha값을 이용하여 깊이를 조절할 것이다.
이제 Subtract 노드를 추가한후, Scene Depth노드와 Split 노드를 연결해준다. 그 다음 Divide노드에 연결해주고, 깊이를 나타내는 변수인 Float타입의 Distance 변수를 추가하여 연결해준다. 마지막으로 Divide노드에 Saturate 노드를 연결해준 후, Saturate와 Output을 연결해준다. Output Node의 Graph inspector에서 Input에 있는 Vector를 Float으로 바꾸어준 후, 이름을 Output으로 변경해준다.
Create > Shader Graph > URP > Unlit Shader Graph를 하여 Water를 생성해준다.
아까 만들었던 Depth Shader을 불러온 후, 물의 깊이를 나타내는 WaterDepth 변수를 추가해서 연결해준다. 그 다음, 색상을 주기 위해 Lerp 노드를 추가하여 DepthShade를 T에 연결해주고, Color변수 ShadowWater와 DeepWater를 만들어 준후, Lerp의 A와 B에 각각 연결해주고 색상을 변경해준다. 이제 Lerp의 Out을 BaseColor에 연결해주고, Save Asset해준 후, Water에 마우스 우클릭 > Create > Material을 해준 다음, Plane에 적용시키고, waterDepth변수의 값을 변경시켜주면 깊이감 있는 물을 표현할 수 있다.
이제 물의 움직임을 표현해 줄 차례이다.
Create > Shader Graph > Sub Graph를 하여 Movement를 생성해준다.
물이 움직이기 위해서는 속도와 시간이 필요하므로, Time노드와 Speed변수를 추가, Multiply노드로 연결해준다. 그 다음, 스케일을 조정해주기위한 Scale 변수를 추가한 다음, Tilling And Offset의 Tilling에 연결해준다. 아까 만들었던 Multiply는 Offset에 연결을 해준다. 마지막 Out파트는 Output에 연결해준다. 이번엔 Output의 Vector를 Vector2로 변경, 이름도 Output으로 바꿔준 후, Save Asset을 하고 Water쉐이더에 돌아가서 불러와준다.