NGUI图片灰化无法通过自带的功能实现。
UIButton的disable状态如下图:
如果想实现整体的灰化效果,需要改写NGUI自带的shader文件,修改后的效果如图:
修改NGUI原生的Unlit - Transparent Colored.shader文件
Shader "Unlit/Transparent Colored"
{
Properties
{
_MainTex ("Base (RGB), Alpha (A)", 2D) = "black" {}
}
SubShader
{
LOD 200
Tags
{
"Queue" = "Transparent"
"IgnoreProjector" = "True"
"RenderType" = "Transparent"
"DisableBatching" = "True"
}
Pass
{
Cull Off
Lighting Off
ZWrite Off
Fog { Mode Off }
Offset -1, -1
Blend SrcAlpha OneMinusSrcAlpha
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
// Unity 4 compatibility
#ifndef UNITY_VERTEX_INPUT_INSTANCE_ID
#define UNITY_VERTEX_INPUT_INSTANCE_ID
#define UNITY_VERTEX_OUTPUT_STEREO
#define UNITY_SETUP_INSTANCE_ID(v)
#define UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(i)
#define UnityObjectToClipPos(v) mul(UNITY_MATRIX_MVP, v)
#endif
sampler2D _MainTex;
float4 _MainTex_ST;
struct appdata_t
{
float4 vertex : POSITION;
float2 texcoord : TEXCOORD0;
fixed4 color : COLOR;
UNITY_VERTEX_INPUT_INSTANCE_ID
};
struct v2f
{
float4 vertex : SV_POSITION;
half2 texcoord : TEXCOORD0;
fixed4 color : COLOR;
UNITY_VERTEX_OUTPUT_STEREO
};
v2f o;
v2f vert (appdata_t v)
{
UNITY_SETUP_INSTANCE_ID(v);
UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);
o.vertex = UnityObjectToClipPos(v.vertex);
o.texcoord = v.texcoord;
o.color = v.color;
return o;
}
fixed4 frag (v2f IN) : SV_Target
{
//original code
//return tex2D(_MainTex, IN.texcoord) * IN.color;
//grey code
fixed4 col = tex2D(_MainTex, IN.texcoord);
half is_grey = step(0.49, IN.color.r) * step(IN.color.r, 0.51);
fixed grey = dot(col.rgb, half3(0.299, 0.587, 0.114));
col.rgb = col.rgb * (1 - is_grey) + half3(grey, grey, grey)*is_grey;
half is_select = step(0.49, IN.color.g) * step(IN.color.g, 0.51);
col.rgb += is_select * fixed3(0.08, 0.08, 0.08);
half accept_in = (1.0 - is_grey) * (1.0 - is_select);
col = col * accept_in * IN.color + col * (1 - accept_in);
col.a *= clamp(1.0, 0.0, 1.0);
return col;
}
ENDCG
}
}
SubShader
{
LOD 100
Tags
{
"Queue" = "Transparent"
"IgnoreProjector" = "True"
"RenderType" = "Transparent"
"DisableBatching" = "True"
}
Pass
{
Cull Off
Lighting Off
ZWrite Off
Fog { Mode Off }
Offset -1, -1
//ColorMask RGB
Blend SrcAlpha OneMinusSrcAlpha
ColorMaterial AmbientAndDiffuse
SetTexture [_MainTex]
{
Combine Texture * Primary
}
}
}
}
参考文章:
Unity3D开发(二):NGUI之UIButton”禁用”状态时置灰
NGUI与灰化
Vertex&Fragment Shader 练习4 NGUI的图片灰化和加亮