# 【采用指定区域坐标的贴图】

主要用于不整张贴图采样,仅仅采用贴图里面的某个区域用于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"
}

测试用的纹理贴图

Markdown 图片

Shader最终效果图如下

Markdown 图片