找回密码
 立即注册
查看: 680|回复: 0

[渲染] unity 高光shader additive效果支持Ugui UIMask裁剪

[复制链接]
发表于 2021-4-23 15:14 | 显示全部楼层 |阅读模式
在自带的UIshader中修改blend 颜色混合,和一些frag状态的处理
  1. //modif by u3dchina

  2. Shader "AdditiveShader"
  3. {
  4.     Properties
  5.     {
  6.         [PerRendererData] _MainTex ("Sprite Texture", 2D) = "white" {}
  7.         _Color ("Tint", Color) = (1,1,1,1)

  8.         _StencilComp ("Stencil Comparison", Float) = 8
  9.         _Stencil ("Stencil ID", Float) = 0
  10.         _StencilOp ("Stencil Operation", Float) = 0
  11.         _StencilWriteMask ("Stencil Write Mask", Float) = 255
  12.         _StencilReadMask ("Stencil Read Mask", Float) = 255

  13.         _ColorMask ("Color Mask", Float) = 15

  14.         [Toggle(UNITY_UI_ALPHACLIP)] _UseUIAlphaClip ("Use Alpha Clip", Float) = 0
  15.     }

  16.     SubShader
  17.     {
  18.         Tags
  19.         {
  20.             "Queue"="Transparent"
  21.             "IgnoreProjector"="True"
  22.             "RenderType"="Transparent"
  23.             "PreviewType"="Plane"
  24.             "CanUseSpriteAtlas"="True"
  25.         }

  26.         Stencil
  27.         {
  28.             Ref [_Stencil]
  29.             Comp [_StencilComp]
  30.             Pass [_StencilOp]
  31.             ReadMask [_StencilReadMask]
  32.             WriteMask [_StencilWriteMask]
  33.         }

  34.         Cull Off
  35.         Lighting Off
  36.         ZWrite Off
  37.         ZTest [unity_GUIZTestMode]
  38.         Blend SrcAlpha One
  39.         ColorMask [_ColorMask]

  40.         Pass
  41.         {
  42.             Name "Default"
  43.         CGPROGRAM
  44.             #pragma vertex vert
  45.             #pragma fragment frag
  46.             #pragma target 2.0

  47.             #include "UnityCG.cginc"
  48.             #include "UnityUI.cginc"

  49.             #pragma multi_compile_local _ UNITY_UI_CLIP_RECT
  50.             #pragma multi_compile_local _ UNITY_UI_ALPHACLIP

  51.             struct appdata_t
  52.             {
  53.                 float4 vertex   : POSITION;
  54.                 float4 color    : COLOR;
  55.                 float2 texcoord : TEXCOORD0;
  56.                 UNITY_VERTEX_INPUT_INSTANCE_ID
  57.             };

  58.             struct v2f
  59.             {
  60.                 float4 vertex   : SV_POSITION;
  61.                 fixed4 color    : COLOR;
  62.                 float2 texcoord  : TEXCOORD0;
  63.                 float4 worldPosition : TEXCOORD1;
  64.                 half4  mask : TEXCOORD2;
  65.                 UNITY_VERTEX_OUTPUT_STEREO
  66.             };

  67.             sampler2D _MainTex;
  68.             fixed4 _Color;
  69.             fixed4 _TextureSampleAdd;
  70.             float4 _ClipRect;
  71.             float4 _MainTex_ST;
  72.             float _UIMaskSoftnessX;
  73.             float _UIMaskSoftnessY;

  74.             v2f vert(appdata_t v)
  75.             {
  76.                 v2f OUT;
  77.                 UNITY_SETUP_INSTANCE_ID(v);
  78.                 UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(OUT);
  79.                 float4 vPosition = UnityObjectToClipPos(v.vertex);
  80.                 OUT.worldPosition = v.vertex;
  81.                 OUT.vertex = vPosition;

  82.                 float2 pixelSize = vPosition.w;
  83.                 pixelSize /= float2(1, 1) * abs(mul((float2x2)UNITY_MATRIX_P, _ScreenParams.xy));

  84.                 float4 clampedRect = clamp(_ClipRect, -2e10, 2e10);
  85.                 float2 maskUV = (v.vertex.xy - clampedRect.xy) / (clampedRect.zw - clampedRect.xy);
  86.                 OUT.texcoord = TRANSFORM_TEX(v.texcoord.xy, _MainTex);
  87.                 OUT.mask = half4(v.vertex.xy * 2 - clampedRect.xy - clampedRect.zw, 0.25 / (0.25 * half2(_UIMaskSoftnessX, _UIMaskSoftnessY) + abs(pixelSize.xy)));

  88.                 OUT.color = v.color * _Color;
  89.                 return OUT;
  90.             }

  91.             fixed4 frag(v2f IN) : SV_Target
  92.             {
  93.                 half4 color = IN.color * (tex2D(_MainTex, IN.texcoord) + _TextureSampleAdd);

  94.                 #ifdef UNITY_UI_CLIP_RECT
  95.                 half2 m = saturate((_ClipRect.zw - _ClipRect.xy - abs(IN.mask.xy)) * IN.mask.zw);
  96.                 color.a *= m.x * m.y * 2;
  97.                 #endif

  98.                 #ifdef UNITY_UI_ALPHACLIP
  99.                 clip (color.a - 0.001);
  100.                 #endif

  101.                 color.rgb *= color.a;

  102.                 return color;
  103.             }
  104.         ENDCG
  105.         }
  106.     }
  107. }
复制代码
上面的存一个shader,在代码中通过控制colorA为0~1来控制高光的渐隐渐显
                            material:SetColor("_Color", CS.UnityEngine.Color(1, 1, 1,colorA));


懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-4-29 04:04 , Processed in 0.499146 second(s), 25 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表