티스토리 뷰

Unity/Shader Graph

Vertex Displacement

연홍 2021. 1. 14. 14:17
728x90

shader graph의 마스터노드의 position input은 vertex shader 단계에 영향을 줍니다. vertex 단계에서는 당연히 fragment 단계에 영향을 주지 못합니다.

(다만, 텍스쳐를 샘플링해서 vertex 단계에서 이용하려면 SampleTexture2DLOD를 사용할 수 있습니다.)

 

vertex를 조작하기위해 object space로된 position 노드를 만들면 우리가 조작할 수 있는 vertex의 위치값 (vector3)가 반환됩니다. (object 공간의 위치값이므로 vertex를 제어하려면 Scale, Rotate, Postion 순으로 제어해야 의도한 결과가 나올 수 있습니다.)

 

쉐이더는 GPU에서 실행되기에 실제 mesh자체를 업데이트하거나 colider에 영향을 주지 않습니다.

vertex *= scale;
vertex += offset;
// But then a vertex code shader needs a clip space position output, so:
o.pos = UnityObjectToClipPos(vertex);

Time노드를 이용하여 offset을 애니메이션할 수도 있습니다. (ex. 풀/나뭇잎의 흔들리는 효과 등)

  • 수면의 파도를 시뮬레이션 하는데 사용될 수 있습니다.
  • 녹거나 흔들리는 다양한 연출에 사용될 수 있습니다.
  • static mesh에 간단한 애니메이션을 주는데 활용될 수 있습니다. (나비, 새의 날개, 헤엄치는 물고기 등)
  • ABZU에서 물고기 애니메이팅 관련 예 (youtu.be/l9NX06mvp2E)

 

헤엄치는 동작 (물고기)

물고기에 대한 헤엄치는 동작을 만드는 간단한 방법은 물고기의 x축(왼쪽/오른쪽)과 sine그래프를 기반으로 time을 사용해서 y축을 제어하는 것입니다. 그런 다음 y축값을 이용한 mask로 물고기 앞쪽의 vertex를 덜 움직이게 합니다.

(값은 mesh의 크기에 따라 달라집니다. 예에서는 원점이 중심에 있는 2 unit의 모델이 기준입니다.)

vertex.x + = sin (vertex.y * 2 + _Time.y * 4) * (vertex.y-1) * 0.25;

날개의 움직임 (나비/새)

나비의 날개 움직임을 위해 X축을 기반으로한 마스크를 만들어 날개를 조정하는 방법으로 합니다. 이 마스크는 절대값을 사용하여 동일한 Z축에서 날개를 조정합니다.

그다음 날개가 선형으로 움직이는 time을 사용해서 sine 그래프로 z값을 조정합니다. 날개를 구부리려면 (새의 경우) 마스크를 time 아웃풋에 넣고 sine 인풋에 넣으면 됩니다.

그리고 x축을 약간 조정해서 날개가 위로 올라갈수록 약간 안쪽으로 이동시켜서 좀더 부드럽게 할 수 있습니다.

 

float mask = abs(vertex.x) - 0.2;
float s = sin(_Time.y * 15.0); // for butterfly
// float s = sin(_Time.y * 10.0 + mask) // for bird
vertex.x += saturate(s * 0.6) * saturate(mask) * -1.0 * sign(vertex.x);
vertex.z += (s + 0.5) * 0.75 * mask;

(값은 mesh 크기에 따라 달라질 수 있습니다. 예에서는 원점이 중심에 있는 2x2 모델을 기반으로 합니다.)

 

 

'Unity > Shader Graph' 카테고리의 다른 글

Voronoi  (0) 2021.01.15
Render Texture  (0) 2021.01.14
Fresnel Effect  (0) 2021.01.13
Scene Color & Scene Depth  (0) 2021.01.13
Polar Coordinates  (0) 2021.01.13
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31