11-11 440 views
修改UI/Default shader实现Gray效果
// Custom Gray by change UI/Default Unity built-in shader source. // https://github.com/TwoTailsGames/Unity-Built-in-Shaders Shader "Custom/UI/UIGray" { Properties { [PerRendererData] _MainTex ("Sprite Texture", 2D) = "white" {} _Color ("Tint", Color) = (1,1,1,1) //https://www.cnblogs.com/llstart-new0201/p/12681277.html _StencilComp ("Stencil Comparison", Float) = 8//比较方法, 一直通过检测,与1相反 _Stencil ("Stencil ID", Float) = 0 //参考值 _StencilOp ("Stencil Operation", Float) = 0//0表示保持原值, 1设为0, 2为用参考值代替原值 _StencilWriteMask ("Stencil Write Mask", Float) = 255 _StencilReadMask ("Stencil Read Mask", Float) = 255 _ColorMask ("Color Mask", Float) = 15 _Grey("Grey", Range(0.0, 1.0)) = 1.0 //Use Alpha Clip:是否进行根据通道值剔除,如果开启则会按像素进行处理,否则按Rect形状进行模板值操作 [Toggle(UNITY_UI_ALPHACLIP)] _UseUIAlphaClip ("Use Alpha Clip", Float) = 0 } SubShader { //https://docs.unity3d.com/Manual/SL-SubShaderTags.html Tags { "Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent" "PreviewType"="Plane" "CanUseSpriteAtlas"="True" } //模板测试 如果模板测试通过,则相应的像素点更新,否则不更新 //https://blog.csdn.net/u011047171/article/details/46928463 //if(referenceValue&readMask comparisonFunction stencilBufferValue&readMask) //通过像素 //else //抛弃像素 Stencil { Ref [_Stencil] //设定参考值referenceValue, 用来与模板缓冲中的值比较 Comp [_StencilComp]//定义参考值(referenceValue)与缓冲值(stencilBufferValue)比较的操作函数 Pass [_StencilOp]//当模板测试(和深度测试)通过时,则根据此值对模板缓冲值(stencilBufferValue)进行处理 ReadMask [_StencilReadMask]//读遮罩, readMask将和referenceValue以及stencilBufferValue进行按位与(&)操作, 255表示读取的为原始值 WriteMask [_StencilWriteMask]//写入模板缓冲时进行按位与操作, 255表示写的为原始值 } //https://docs.unity3d.com/Manual/SL-Pass.html //https://docs.unity3d.com/Manual/SL-CullAndDepth.html Cull Off Lighting Off ZWrite Off //ZTest is automatically set correctly for each Canvas //(LEqual, unless the Canvas is set to Screen Space Overlay, which sets it to Always) ZTest [unity_GUIZTestMode] //设置混合模式 rcAlpha * SrcColor + (1 - SrcAlpha) * DstColor Blend SrcAlpha OneMinusSrcAlpha //颜色过滤, 这里15表示不过滤 ColorMask [_ColorMask] Pass { Name "Default" CGPROGRAM #pragma vertex vert #pragma fragment frag #pragma target 2.0 //路径Unity\Editor\Data\CGIncludes unity辅助函数引用 #include "UnityCG.cginc" #include "UnityUI.cginc" //对unity的rect mask 2d 裁剪生效相关 #pragma multi_compile_local _ UNITY_UI_CLIP_RECT #pragma multi_compile_local _ UNITY_UI_ALPHACLIP struct appdata_t { float4 vertex : POSITION; float4 color : COLOR; float2 texcoord : TEXCOORD0; UNITY_VERTEX_INPUT_INSTANCE_ID }; struct v2f { float4 vertex : SV_POSITION; fixed4 color : COLOR; float2 texcoord : TEXCOORD0; float4 worldPosition : TEXCOORD1; UNITY_VERTEX_OUTPUT_STEREO }; //纹理采样 sampler2D _MainTex; fixed4 _Color; //https://docs.unity3d.com/2017.4/Documentation/Manual/SL-UnityShaderVariables.html //Set automatically by Unity for UI only based on whether the texture being used is in Alpha8 format (the value is set to (1,1,1,0)) or not (the value is set to (0,0,0,0)). fixed4 _TextureSampleAdd; float4 _ClipRect; //_ST Scale和Translation的意思 //_ST 声明附加tiling & offset信息, 使用TRANSFORM_TEX需要 //https://docs.unity3d.com/Manual/SL-PropertiesInPrograms.html float4 _MainTex_ST; fixed _Grey; v2f vert(appdata_t v) { v2f OUT; UNITY_SETUP_INSTANCE_ID(v);//GPU Instancing是指由GPU和图形API支持的,用一个Draw Call同时绘制多个Geometry相同的物体的技术 UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(OUT); OUT.worldPosition = v.vertex; //MVP坐标变换 OUT.vertex = UnityObjectToClipPos(OUT.worldPosition); //#define TRANSFORM_TEX(tex,name) (tex.xy * name##_ST.xy + name##_ST.zw) //在Material中可以设置的Tiling就是xy,Offset就是zw。The x,y contains texture scale, and z,w contains translation (offset) //TRANSFORM_TEX主要作用是拿顶点的uv去和材质球的tiling和offset作运算, 确保材质球里的缩放和偏移设置是正确的 //等价于o.uv = v.texcoord.xy * _MainTex_ST.xy + _MainTex_ST.zw; OUT.texcoord = TRANSFORM_TEX(v.texcoord, _MainTex); //Add 添加一个我们自定义的颜色影响, 使用顶点颜色, 以便image组件颜色拾取器生效 OUT.color = v.color * _Color; return OUT; } //屏幕像素 SV_Target是DX10+用于fragment函数着色器颜色输出的语义。DX9使用COLOR作为fragment函数输出语义 , 兼容没有区别 fixed4 frag(v2f IN) : SV_Target { //tex2D 根据uv坐标拿到贴图颜色 half4 color = (tex2D(_MainTex, IN.texcoord) + _TextureSampleAdd) * IN.color; //Add 纯灰色, 比较难看 // float grey = dot(color.rgb, fixed3(0.299, 0.587, 0.114)); // return half4(grey,grey,grey,color.a); //Add 使灰色有通道效果 fixed grey = dot(color.rgb, fixed3(0.299, 0.587, 0.114)); color.rgb = fixed3(grey, grey, grey)*_Grey + color.rgb*(1-_Grey); #ifdef UNITY_UI_CLIP_RECT color.a *= UnityGet2DClipping(IN.worldPosition.xy, _ClipRect); #endif #ifdef UNITY_UI_ALPHACLIP clip (color.a - 0.001); #endif return color; } ENDCG } } }
版权属于: CrazyStone Entertainment
原文地址: https://www.crazystonent.com/2020/11/11/unity-default-shader/
转载时必须以链接形式注明原始出处及本声明。