Unity Shader 시퀀스 프레임 애니메이션 효과 구현

본 논문 의 사례 는 유 니 티 Shader 시퀀스 프레임 애니메이션 효과 의 구체 적 인 코드 를 공유 하여 여러분 께 참고 하 시기 바 랍 니 다.구체 적 인 내용 은 다음 과 같 습 니 다.
 
실현 원리
UV 텍 스 처 를 나타 내 는 크기 를 설정 하고 프레임 별로 그림 을 수정 하 는 UV 좌 표를 설정 하 는 것 이 주 된 사상 이다.(네 걸음 으로 나 눌 수 있다)
1.우리 먼저Time.y 와 속도 속성Speed 곱 하기 시 뮬 레이 션 시간 을 얻 고 CG 의 floor 함수 로 결과 값 을 정렬 하여 정수 시간 time 을 얻 습 니 다. 
2.그리고 우 리 는 time 나 누 기 를 사용한다.HorizontalAmount 의 결과 값 은 현재 대응 하 는 줄 색인 으로,나 누 기 결과 의 나머지 는 열 색인 입 니 다.
3.그 다음 에 우 리 는 행렬 색인 값 을 사용 하여 진정한 샘플링 좌 표를 구축 해 야 한다.시퀀스 프레임 이미 지 는 많은 관건 적 인 프레임 이미 지 를 포함 하기 때문에 샘플링 좌 표 는 모든 관건 적 인 프레임 이미지 의 좌표 범위 에 투사 해 야 한 다 는 것 을 의미한다.우 리 는 먼저 원래 의 무늬 좌표 i.uv 를 줄 수 와 열 수 에 따라 등분 하여 모든 하위 이미지 의 무늬 좌표 범 위 를 얻 을 수 있다.
4.그 다음 에 우 리 는 현재 의 행렬 수 를 사용 하여 위의 결 과 를 오프셋 시 켜 현재 하위 이미지 의 무늬 좌 표를 얻어 야 한다.주의해 야 할 것 은 수직 방향의 좌표 오프셋 에 대해 감법 을 사용 해 야 한 다 는 것 이다.이 는 Unity 에서 무늬 좌표 수직 방향의 순서(아래 에서 위로 점점 커지 기)와 시퀀스 프레임 무늬 중의 순서(재생 순 서 는 위 에서 아래로)가 반대 이기 때문이다.이렇게 해서 우 리 는 진정한 무늬 샘플링 좌 표를 얻 었 다.
Unity Shader 가 시퀀스 프레임 애니메이션 을 실현 하 는 코드:

Shader "Unlit/Demo-SequenceAnimation"
{
 Properties
 {
 _MainTex ("Sequence Frame Image", 2D) = "white" {} //        
 _Color("Color Tint", Color) = (1, 1, 1, 1)   //   
 _HorizontalAmount("Horizontal Amount", float) = 4 //   
 _VerticalAmount("Vertical Amount", float) = 4  //   
 _Speed("Speed", Range(1, 100)) = 30 //     
 }
 
 SubShader
 {
 //                 ,               。
 //            “  ”     SubShader   ,  Queue  RenderType    Transparent,
 // IgnoreProjector    True
 Tags { "RenderType"="Transparent" "Queue"="Transparent" "IgnoreProjector"="True"}
 LOD 100
 
 Pass
 {
 Tags{"LightMode"="ForwardBase"}
 
 //               ,      Pass      ,       
 //  Pass  ,    Blend             ,         
 ZWrite Off
 Blend SrcAlpha OneMinusSrcAlpha
 
 CGPROGRAM
 #pragma vertex vert
 #pragma fragment frag
 
 #include "UnityCG.cginc"
 
 struct appdata
 {
 float4 vertex : POSITION;
 float2 uv : TEXCOORD0;
 };
 
 struct v2f
 {
 float2 uv : TEXCOORD0;
 float4 vertex : SV_POSITION;
 };
 
 sampler2D _MainTex;
 float4 _MainTex_ST;
 fixed4 _Color;
 float _HorizontalAmount;
 float _VerticalAmount;
 float _Speed;
 
 v2f vert (appdata v)
 {
 v2f o;
 o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);
 o.uv = TRANSFORM_TEX(v.uv, _MainTex);
 return o;
 }
 
 fixed4 frag (v2f i) : SV_Target
 {
 float time = floor(_Time.y * _Speed);   //      
 float row = floor(time / _HorizontalAmount); //       (         )
 float column = time - row * _HorizontalAmount; //      
 
 //      
// float offserX = 1.0 / _HorizontalAmount; 
// float offserY = 1.0 / _VerticalAmount;
// half2 uv = float2(i.uv.x * offsetX, i.uv.y*offsetY);
 
 //                (           )
 half2 uv = float2(i.uv.x /_HorizontalAmount, i.uv.y / _VerticalAmount); //      3 
 
 //                  ,              
 uv.x += column / _HorizontalAmount; //      
 uv.y -= row / _VerticalAmount;  //   uv.y += 1.0 - row / _VerticalAmount; 
 
 // sample the texture
 fixed4 col = tex2D(_MainTex, uv);
 col.rgb *= _Color.rgb;   //       
 return col;
 }
 ENDCG
 }
 }
}

Tip:
투명도 혼합 을 사 용 했 기 때문에 Game 보기에 서 효과 가 보이 지 않 으 면 Lighting 패 널 에 있 는 Skybox 소 재 를 제거 할 수 있 습 니 다.
ceil(x) 입력 매개 변 수 를 위로 조정 합 니 다.예 를 들 어 ceil(float(1.3)) ,반환 값 2.0
floor(x)입력 매개 변 수 를 아래로 조정 합 니 다.예 를 들 어 floor(float(1.3)) 되 돌아 오 는 값 은? 1.0;그러나. floor(float(-1.3)가 되 돌아 오 는 값 은-2.0 이다.
원본 프로젝트 다운로드:UnityShader 시퀀스 프레임 애니메이션 효과
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기