分享

UGUI灰度处理

 勤奋不止 2017-09-30

好友在线的时候,头像是正常显示,离线的情况下,显示灰色的。可以直接提供两种状态下的图片。但是这样比较浪费资源。直接通过修改着色器,实现是比较好的一个方式。

解决方案:

复制一份 Shader "UI/Default". 然后直接修改,这样可以保持ui原来的着色情况。然后直接使用内置的函数Luminance 进行灰度处理

  1. Shader "Unlit/UIGrayScale"  
  2. {  
  3.     Properties  
  4.     {  
  5.         [PerRendererData] _MainTex ("Sprite Texture", 2D) = "white" {}  
  6.         _Color ("Tint", Color) = (1,1,1,1)  
  7.           
  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.   
  14.         _ColorMask ("Color Mask", Float) = 15  
  15.   
  16.         [Toggle(UNITY_UI_ALPHACLIP)] _UseUIAlphaClip ("Use Alpha Clip", Float) = 0  
  17.         //-------------------add----------------------  
  18.         [Toggle(UNITY_UI_GRAYSCALE)] _UseUIGrayScale ("Use Gray Scale", Float) = 0  
  19.         //-------------------add----------------------  
  20.     }  
  21.   
  22.     SubShader  
  23.     {  
  24.         Tags  
  25.         {   
  26.             "Queue"="Transparent"   
  27.             "IgnoreProjector"="True"   
  28.             "RenderType"="Transparent"   
  29.             "PreviewType"="Plane"  
  30.             "CanUseSpriteAtlas"="True"  
  31.         }  
  32.           
  33.         Stencil  
  34.         {  
  35.             Ref [_Stencil]  
  36.             Comp [_StencilComp]  
  37.             Pass [_StencilOp]   
  38.             ReadMask [_StencilReadMask]  
  39.             WriteMask [_StencilWriteMask]  
  40.         }  
  41.   
  42.         Cull Off  
  43.         Lighting Off  
  44.         ZWrite Off  
  45.         ZTest [unity_GUIZTestMode]  
  46.         Blend SrcAlpha OneMinusSrcAlpha  
  47.         ColorMask [_ColorMask]  
  48.   
  49.         Pass  
  50.         {  
  51.             CGPROGRAM  
  52.             #pragma vertex vert  
  53.             #pragma fragment frag  
  54.   
  55.             #include "UnityCG.cginc"  
  56.             #include "UnityUI.cginc"  
  57.   
  58.             #pragma multi_compile __ UNITY_UI_ALPHACLIP  
  59.             //-------------------add----------------------  
  60.             #pragma multi_compile __ UNITY_UI_GRAYSCALE  
  61.             //-------------------add----------------------  
  62.               
  63.             struct appdata_t  
  64.             {  
  65.                 float4 vertex   : POSITION;  
  66.                 float4 color    : COLOR;  
  67.                 float2 texcoord : TEXCOORD0;  
  68.             };  
  69.   
  70.             struct v2f  
  71.             {  
  72.                 float4 vertex   : SV_POSITION;  
  73.                 fixed4 color    : COLOR;  
  74.                 half2 texcoord  : TEXCOORD0;  
  75.                 float4 worldPosition : TEXCOORD1;  
  76.             };  
  77.               
  78.             fixed4 _Color;  
  79.             fixed4 _TextureSampleAdd;  
  80.             float4 _ClipRect;  
  81.   
  82.             v2f vert(appdata_t IN)  
  83.             {  
  84.                 v2f OUT;  
  85.                 OUT.worldPosition = IN.vertex;  
  86.                 OUT.vertex = mul(UNITY_MATRIX_MVP, OUT.worldPosition);  
  87.   
  88.                 OUT.texcoord = IN.texcoord;  
  89.                   
  90.                 #ifdef UNITY_HALF_TEXEL_OFFSET  
  91.                 OUT.vertex.xy += (_ScreenParams.zw-1.0)*float2(-1,1);  
  92.                 #endif  
  93.                   
  94.                 OUT.color = IN.color * _Color;  
  95.                 return OUT;  
  96.             }  
  97.   
  98.             sampler2D _MainTex;  
  99.   
  100.             fixed4 frag(v2f IN) : SV_Target  
  101.             {  
  102.                 half4 color = (tex2D(_MainTex, IN.texcoord) + _TextureSampleAdd) * IN.color;  
  103.                   
  104.                 color.a *= UnityGet2DClipping(IN.worldPosition.xy, _ClipRect);  
  105.                   
  106.                 #ifdef UNITY_UI_ALPHACLIP  
  107.                 clip (color.a - 0.001);  
  108.                 #endif  
  109.                 //-------------------add----------------------  
  110.                 #ifdef UNITY_UI_GRAYSCALE  
  111.                 color.rgb = Luminance(color.rgb);  
  112.                 #endif        
  113.                 //-------------------add----------------------  
  114.                 return color;  
  115.             }  
  116.             ENDCG  
  117.         }  
  118.     }  
  119. }  






    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约