// ---------------------------【放大镜特效】--------------------------- Shader "Custom/MagnifyingGlass" { // ---------------------------【属性】--------------------------- Properties { _MainTex ("Texture", 2D) = "white" {} } // ---------------------------【子着色器】--------------------------- SubShader { // No culling or depth Cull Off ZWrite Off ZTest Always // ---------------------------【渲染通道】--------------------------- Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" //顶点输入结构体 struct VertexInput { float4 vertex : POSITION; float2 uv : TEXCOORD0; }; // 顶点输出结构体 struct VertexOutput { float2 uv : TEXCOORD0; float4 vertex : SV_POSITION; }; // 变量申明 sampler2D _MainTex; float2 _Pos; float _ZoomFactor; float _EdgeFactor; float _Size; // ---------------------------【顶点着色器】--------------------------- VertexOutput vert(VertexInput v) // 接受类型为VertexInput的参数,返回类型为VertexOutput { VertexOutput o; // 定义一个VertexOutput类型的变量o o.vertex = UnityObjectToClipPos(v.vertex); // 将顶点坐标从对象空间转换到剪辑空间 o.uv = v.uv; // 将纹理坐标复制到输出结构 return o; // 返回VertexOutput类型的结构体 } // ---------------------------【片元着色器】--------------------------- fixed4 frag(VertexOutput i) : SV_Target // 接受VertexOutput类型的参数,指定输出颜色类型为fixed4 { float2 scale = float2(_ScreenParams.x / _ScreenParams.y, 1); // 计算屏幕长宽比的缩放因子 float2 center = _Pos; // 放大区域的中心点 float2 dir = center - i.uv; // 当前像素到中心点的距离向量 float dis = length(dir * scale); // 当前像素到中心点的距离 float atZoomArea = smoothstep(_Size + _EdgeFactor, _Size, dis); // 根据距离判断是否在放大区域内 fixed4 col = tex2D(_MainTex, i.uv + dir * _ZoomFactor * atZoomArea); // 根据放大程度计算新的坐标位置,并获取对应的颜色值 return col; // 返回颜色值 } ENDCG } } }