用 HLSL写一个urpshader实现这么一个功能:对给定材质图的左半部分和右半部分实现不同大小的缩放
下面是一个使用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/i9lL 著作权归作者所有。请勿转载和采集!