[Unity] 나무와 풀이 바람에 영향을 받는 것처럼 보이는 셰이더 만들기

2024. 7. 9. 18:42Unity

728x90
반응형

 

 

 


 

 

나무와 풀에 적용될 바람 셰이더를 이전에 만든 줄 알았는데 없어서 글을 쓰게 되었다.

아래의 유니티 공식 영상을 참고하였다.

 

 


 

 

모델을 구하거나 셰이더그래프를 만드는 방법은 해당 영상 앞부분을 살펴보거나 다른 데에서 찾을 수 있기 때문에 생략한다.

 

Fragment Shader

  • Bush BaseMap 텍스쳐를 [Sample Texture 2D] 노드로 가져왔고 색을 수정해야할 오브젝트가 있어서 [BaseColor] 프로퍼티를 만들어 곱한 후 [Base Color]에 연결했다.
  • NormalMap도 가져와서 [Normal Strengh]를 높여야 해서 해당 노드를 사용했고 최종적으로 [Normal]에 연결했다.
    여기서, 노말의 [Sample Texture 2D] - [Type] - [Normal]로 설정을 해야 노말맵으로 인식해서 잘 들어간다.
  • 나머지 프로퍼티는 Metallic, Smoothness, AlphaClipThreshold로 원하는 값을 넣을 수 있게 했다.

 


 

Vertex Shader

  • 오브젝트의 [Position] 노드를 [Split]하여 오브젝트의 Y값에 대한 계산을 한다.
  • Cosine 시간을 100으로 나눈 값을(값이 너무 커지는 것을 방지) 오브젝트의 Y 포지션 값에 곱한다. 여기까지 본다면 Y축을 따라서 늘어났다 줄어들었다 하는 셰이더라는 것을 알 수 있다. 아래의 gif처럼 이 상태로도 오브젝트의 [Position]에 [Add]하면 바로 사용할 수 있다. (코드로 따지면 transform.position += transform.position * 2 의 느낌과 같다고 생각된다. 물론 이런식으로 쓰진 않지만)

 

  • 곱한 후에는 오브젝트 Y 값에 1을 더한 후 제곱을 한다. 네제곱을 한 부분에서 제곱을 한 부분을 [Subtract]로 빼면 그 차이 만큼에 있는 오브젝트에 효과를 준다는 말이다. (1보다 큰, 네제곱된 수 - 제곱된 수)

 

  • Vector2 인 [Direction] 프로퍼티를 곱하여 [Combine]을 통해 X, Z 축에만 영향을 주도록 만든다.
  • 이전에 Y축을 쓴 이유는 중심에서 멀어질 수록 효과를 크게 한다는 뜻이고, 여기서 [Combine]에 X, Z에 연결한 것은 X, Z쪽으로만 흔들리게 만든다는 뜻이다.
    이 결과를 [Add]를 통해서 월드 포지션에 더한다.

 

  • 모델링에 Vertex Color 값이 있다면 줄기의 파란색을 제외한 잎에만 셰이더를 줄 수 있다.
  • 파란색을 제외한 [Vertex Color] 노드를 [Combine]을 이용해 [Lerp]의 Factor로 연결한다.
  • [Transform] 노드로 이전에 계산했던 계산 값을 Object로 바꿔온다.
  • [Lerp] 노드의 Factor가 0이라면 A 부분에 연결된 [Position]- [Object] 값이 출력되고,
    [Lerp] 노드의 Factor가 1이라면 앞에서 계산된 값인 B 부분에 연결된 [Position] - [Object] 값이 출력된다.
    즉, Vertex Color가 파란색이라면 아무것도 계산되지 않은 포지션 값이 출력되고,
    Vertex Color가 파란색이 아니라면 앞서 계산된 포지션 값이 출력된다.

 

  • Vertex Shader의 마지막 부분은 [Gradient Noise] 노드를 이용한 셰이더의 랜덤성 부여이다.
  • [Tiling And Offset] 노드와 [Time] 노드를 통해서 노이즈의 이동을 조절하고
    [Gradient Noise] 노드 자체의 [Scale]을 통해서 노이즈의 빈도를 조절한다.
  • [Lerp] 노드는 바로 이전의 Lerp와 마찬가지로 두 값의 블렌드를 의미한다.
    노이즈의 검은색 부분은 0값이므로 A input으로 아무것도 계산되지 않은 오브젝트 포지션 값을 가져오고
    노이즈의 흰색 부분은 1이므로 B input으로 이전에 계산된 오브젝트 포지션 값을 가져온다.

 

 


 

 

잘 만들었다면 최종적으로 아래의 셰이더 그래프 모양이 만들어진다.

 

 

완성!

728x90
반응형