# 【采用指定区域坐标的贴图】
主要用于不整张贴图采样,仅仅采用贴图里面的某个区域用于Shader。 根据这个知识点,可以用于制作序列帧动画。
Shader "Tests/TestShader01"
{
Properties
{
_MainTex ("Texture", 2D) = "white" {}
_SubRect ("SubRect x0 y0 x1 y1", Vector) = (0,0,1,1)
}
SubShader
{
Tags {
"RenderType"="Opaque"
}
Pass {
Name "FORWARD"
Tags {
"LightMode"="ForwardBase"
}
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
#pragma multi_compile_fwdbase_fullshadows
#pragma target 3.0
uniform sampler2D _MainTex;
uniform float4 _SubRect;
struct VertexInput {
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
};
struct VertexOutput {
float4 pos : SV_POSITION;
float2 uv : TEXCOORD0;
};
VertexOutput vert (VertexInput v) {
VertexOutput o = (VertexOutput)0;
o.pos = UnityObjectToClipPos( v.vertex );
o.uv = v.uv;
return o;
}
/** 反向插值,让t保持在a~b之间 */
float invertLerp(float a, float b, float t)
{
return (t-a)/(b-a);
}
float4 frag(VertexOutput i) : COLOR {
// 开始X值
float sX = lerp(_SubRect.x,_SubRect.z,i.uv.x);
// 开始Y值
float sY = lerp(_SubRect.y,_SubRect.w,i.uv.y);
float4 var_MainTex = tex2D(_MainTex,float2(sX,sY));
return var_MainTex;
//return fixed4(0.9,0.5,0,1);
}
ENDCG
}
}
FallBack "Diffuse"
}
测试用的纹理贴图
Shader最终效果图如下