下面是一个使用 HLSL 编写的 URP Shader 示例,实现了对给定材质图的左半部分和右半部分实现不同大小的缩放:

Shader "Custom/TextureScale" {
    Properties {
        _MainTex ("Texture", 2D) = "white" {}
        _ScaleLeft ("Left Scale", Range(0.1, 2)) = 1
        _ScaleRight ("Right Scale", Range(0.1, 2)) = 1
    }
    SubShader {
        Tags { "RenderType"="Opaque" }
        LOD 200
        
        Pass {
            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;
            float _ScaleLeft;
            float _ScaleRight;
            
            v2f vert (appdata v) {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
                o.uv = v.uv;
                return o;
            }
            
            fixed4 frag (v2f i) : SV_Target {
                fixed2 uv = i.uv;
                
                if (uv.x < 0.5) {
                    uv.x *= _ScaleLeft;
                } else {
                    uv.x = (uv.x - 0.5) * _ScaleRight + 0.5;
                }
                
                fixed4 col = tex2D(_MainTex, uv);
                return col;
            }
            ENDCG
        }
    }
}

该 Shader 包含两个属性:_MainTex 表示输入的材质图,_ScaleLeft 表示左半部分的缩放比例,_ScaleRight 表示右半部分的缩放比例。

在顶点函数中,将输入的顶点位置转换为剪辑空间的位置,并传递纹理坐标。

在片段函数中,根据传入的纹理坐标,判断当前像素是否位于左半部分(uv.x < 0.5),如果是,则将纹理坐标乘以 _ScaleLeft 进行缩放;如果不是,则将纹理坐标减去 0.5 后乘以 _ScaleRight,然后加上 0.5,以保持纹理坐标在右半部分的范围内。最后,使用 tex2D 函数获取缩放后的颜色,并返回。

要使用该 Shader,只需将其附加到一个材质上,并将要缩放的纹理图像赋值给 _MainTex 属性,并可以调整 _ScaleLeft 和 _ScaleRight 属性来控制左右半部分的缩放比例。


原文地址: https://www.cveoy.top/t/topic/kTGv 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录