11-11 523 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/
转载时必须以链接形式注明原始出处及本声明。