下面是一个使用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属性来控制左右半部分的缩放比例。

用 HLSL写一个urpshader实现这么一个功能:对给定材质图的左半部分和右半部分实现不同大小的缩放

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

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