Unity 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 시퀀스 프레임 애니메이션 효과
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
photonnetwork.instantiate에서 gamepobject 유형을 생성 한 다음 상태 및 값을 참조하는 방법주로 마지막 기사에서 일어난 일의 수정입니다. 지난번↓ 그럼 주제입니다. (타이틀이 정리되어 없어서 죄송합니다) 우선 전회의 Illegal view ID:0입니다만 photonnetwork.instantiate를 사...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.