본 게시물은 Unity Korea 채널의 URP Shader Training 시리즈와 강의에 사용된 도큐먼트를 공부하며 정리한 게시물입니다.
Plane에서 높이값(Y)를 움직이게 하는 것이 포인트 -> Vertex Shader에서 X좌표 값에 따라 Vertex Shader가 이동하도록 Shader 작성
VertexOutput vert(VertexInput v) { VertexOutput o; o.vertex = TransformObjectToHClip(v.vertex.xyz); o.vertex.y += v.vertex.x; o.uv = v.uv.xy * _MainTex_ST.xy + _MainTex_ST.zw; return o; }
실제 그려지는 Mehs는 실루엣에 그려져야 하지만, Vertex Shader에서 Mesh의 중심값을 기준으로 x값 만큼 Vertex 좌표를 y만큼 이동했기 때문에 왼쪽은 음수(아래쪽), 오른쪽은 양수(위쪽)로 그려짐.
World Space 기준으로 바꿔서 그릴 수 있음
VertexOutput vert(VertexInput v) { VertexOutput o; o.vertex = TransformObjectToHClip(v.vertex.xyz); half3 positionWS = TranformObjectToWorld(v.vertex.x); o.vertex.y += positionWS; o.uv = v.uv.xy * _MainTex_ST.xy + _MainTex_ST.zw; return o; }
sin함수
VertexOutput vert(VertexInput v) { VertexOutput o; o.vertex = TransformObjectToHClip(v.vertex.xyz); o.vertex.y += sin(v.vertex.x); o.uv = v.uv.xy * _MainTex_ST.xy + _MainTex_ST.zw; return o; }
여기서 v.vertex.z값도 추가하면 xz축 값에 따라 파형이 변하는 것을 확인할 수 있다.
VertexOutput vert(VertexInput v) { VertexOutput o; o.vertex = TransformObjectToHClip(v.vertex.xyz); o.vertex.y += sin(v.vertex.x + v.vertex.z + _Time.y); o.uv = v.uv.xy * _MainTex_ST.xy + _MainTex_ST.zw; return o; }
파형을 수식으로 구하는 것 말고도 Noise Texture를 사용해 Vertex Stage를 반영하는 방법도 있음.
이 경우 tex2Dlod함수를 사용해야함.
VertexOutput vert(VertexInput v)
{
VertexOutput o;
o.vertex = TransformObjectToHClip(v.vertex.xyz);
half4 noise = tex2Dlod(_FlowMap, float4(o.uv, 0, 0));
o.vertex.y += sin(v.vertex.x + v.vertex.z + _Time.y) * noise.r;
o.uv = v.uv.xy * _MainTex_ST.xy + _MainTex_ST.zw;
return o;
}