MagnifyingGlass.shader 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. // ---------------------------【放大镜特效】---------------------------
  2. Shader "Custom/MagnifyingGlass"
  3. {
  4. // ---------------------------【属性】---------------------------
  5. Properties
  6. {
  7. _MainTex ("Texture", 2D) = "white" {}
  8. }
  9. // ---------------------------【子着色器】---------------------------
  10. SubShader
  11. {
  12. // No culling or depth
  13. Cull Off ZWrite Off ZTest Always
  14. // ---------------------------【渲染通道】---------------------------
  15. Pass
  16. {
  17. CGPROGRAM
  18. #pragma vertex vert
  19. #pragma fragment frag
  20. #include "UnityCG.cginc"
  21. //顶点输入结构体
  22. struct VertexInput
  23. {
  24. float4 vertex : POSITION;
  25. float2 uv : TEXCOORD0;
  26. };
  27. // 顶点输出结构体
  28. struct VertexOutput
  29. {
  30. float2 uv : TEXCOORD0;
  31. float4 vertex : SV_POSITION;
  32. };
  33. // 变量申明
  34. sampler2D _MainTex;
  35. float2 _Pos;
  36. float _ZoomFactor;
  37. float _EdgeFactor;
  38. float _Size;
  39. // ---------------------------【顶点着色器】---------------------------
  40. VertexOutput vert(VertexInput v) // 接受类型为VertexInput的参数,返回类型为VertexOutput
  41. {
  42. VertexOutput o; // 定义一个VertexOutput类型的变量o
  43. o.vertex = UnityObjectToClipPos(v.vertex); // 将顶点坐标从对象空间转换到剪辑空间
  44. o.uv = v.uv; // 将纹理坐标复制到输出结构
  45. return o; // 返回VertexOutput类型的结构体
  46. }
  47. // ---------------------------【片元着色器】---------------------------
  48. fixed4 frag(VertexOutput i) : SV_Target // 接受VertexOutput类型的参数,指定输出颜色类型为fixed4
  49. {
  50. float2 scale = float2(_ScreenParams.x / _ScreenParams.y, 1); // 计算屏幕长宽比的缩放因子
  51. float2 center = _Pos; // 放大区域的中心点
  52. float2 dir = center - i.uv; // 当前像素到中心点的距离向量
  53. float dis = length(dir * scale); // 当前像素到中心点的距离
  54. float atZoomArea = smoothstep(_Size + _EdgeFactor, _Size, dis); // 根据距离判断是否在放大区域内
  55. fixed4 col = tex2D(_MainTex, i.uv + dir * _ZoomFactor * atZoomArea); // 根据放大程度计算新的坐标位置,并获取对应的颜色值
  56. return col; // 返回颜色值
  57. }
  58. ENDCG
  59. }
  60. }
  61. }