URP Shader: 使用 HLSL 实现材质图左右半部分不同缩放
下面是一个使用 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 著作权归作者所有。请勿转载和采集!