# 3-4 [Vertex Shader를 활용한 Mesh Animation 구현]

Ricon·2024년 8월 9일

URP Shader Basic

목록 보기
13/17

본 게시물은 Unity Korea 채널의 URP Shader Training 시리즈와 강의에 사용된 도큐먼트를 공부하며 정리한 게시물입니다.

강의 링크
도큐먼트 링크


Vertex Shader를 활용한 Mesh Animation 구현

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함수 활용

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 활용

파형을 수식으로 구하는 것 말고도 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;
}

업로드중..

[추가 튜토리얼]

0개의 댓글