Unity HLSL Shader 序列帧动画V0.2

__本篇博客基于序列帧动画V0.1
链接: Unity HLSL Shader 序列帧动画V0.1

__文题修正:当序列帧图片只有一行时会出现图片没显示的bug,修复方法是对offset的xy值进行锁定(saturate)。

__修正后的代码

Shader "FramePlayer" {
	Properties {
		[NoScaleOffset]_BaseMap (" Texture", 2D) = "white" {}
		
		_RowNums	("Row Nums",	float) = 0
		_ColumnNums ("Column Nums",	float) = 0
		_FrameIndex ("FrameIndex",  Range(0, 1)) = 0
	}
	SubShader {
		Tags { "RenderType"="Opaque" "RenderPipeline"="UniversalPipeline" }
 
		HLSLINCLUDE
			#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
 
			CBUFFER_START(UnityPerMaterial)
			float4 _BaseColor;

			float _RowNums;
			float _ColumnNums;
			float _FrameIndex;
		
			CBUFFER_END
		ENDHLSL
 
		Pass {
			Name "Example"
			Tags { "LightMode"="UniversalForward" "Queue"="Transparent"}
			Blend SrcAlpha OneMinusSrcAlpha
 
			HLSLPROGRAM
			#pragma vertex vert
			#pragma fragment frag
 
			struct Attributes {
				float4 positionOS	: POSITION;
				float2 uv			: TEXCOORD0;
			};
 
			struct Varyings {
				float4 positionCS 	: SV_POSITION;
				float2 uv			: TEXCOORD0;
			};
 
			TEXTURE2D(_BaseMap);	SAMPLER(sampler_BaseMap);
 
			Varyings vert(Attributes IN) {
				Varyings OUT;
 
				VertexPositionInputs positionInputs = GetVertexPositionInputs(IN.positionOS.xyz);

				OUT.positionCS = positionInputs.positionCS;
				OUT.uv = IN.uv;

				return OUT;
			}
 
			half4 frag(Varyings IN) : SV_Target {

				float r = floor(_RowNums);
				float c = floor(_ColumnNums);
				float sizeX = 1.0f / c;
				float sizeY = 1.0f / r;
				float frameIndex = floor((r * c - 1) * _FrameIndex);

				float2 uv     = float2(IN.uv.x, IN.uv.y) / float2(c, r);
				float2 offset = float2(0, 0);
				
				offset.x = saturate((frameIndex % c) * sizeX);
				offset.y = saturate(1 - sizeY - floor(frameIndex / r) * sizeY);
				
				half4 baseMap = SAMPLE_TEXTURE2D(_BaseMap, sampler_BaseMap, uv + offset);
 
				return baseMap;
			}
			ENDHLSL
		}
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值