| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768 |
- // ---------------------------【放大镜特效】---------------------------
- 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
- }
- }
- }
|