NGUI 修改Shader支持灰色滤镜

之前有人做过,不过效率不高: http://blog.csdn.net/onerain88/article/details/12197277  
他的代码:

fixed4 frag (v2f i) : COLOR
{
    fixed4 col;
    if (i.color.r < 0.001) 
     {
         col = tex2D(_MainTex, i.texcoord);
         float grey = dot(col.rgb, float3(0.299, 0.587, 0.114));
         col.rgb = float3(grey, grey, grey);
     }
     else
     {
         col = tex2D(_MainTex, i.texcoord) * i.color;
     }
     return col;
}

通过修改后效率明显大幅提升:

Shader "Unlit/Transparent Colored Gray"
{
Properties
{
_MainTex ("Base (RGB) Gray, Alpha (A)", 2D) = "white" {}
}

SubShader
{
LOD 100

Tags
{
"Queue" = "Transparent"
"IgnoreProjector" = "True"
"RenderType" = "Transparent"
}

Pass
{
Cull Off
Lighting Off
ZWrite Off
Fog { Mode Off }
Offset -1, -1
ColorMask RGB
AlphaTest Greater .01
Blend SrcAlpha OneMinusSrcAlpha
ColorMaterial AmbientAndDiffuse

CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#pragma fragmentoption ARB_precision_hint_fastest

#include "UnityCG.cginc"

sampler2D _MainTex;
fixed4 _Color;

struct appdata_t
{
float4 vertex : POSITION;
fixed4 color : COLOR;
float2 texcoord : TEXCOORD0;
};

struct v2f
{
float4 vertex : POSITION;
fixed4 color : COLOR;
float2 texcoord : TEXCOORD0;
fixed gray : TEXCOORD1;
};

float4 _MainTex_ST;

v2f vert (appdata_t v)
{
v2f o;
o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);
o.color = v.color;
o.gray = dot(v.color, fixed4(1,1,1,0));
o.texcoord = TRANSFORM_TEX(v.texcoord, _MainTex);
return o;
}

fixed4 frag (v2f i) : COLOR
{
fixed4 col;
if (i.gray == 0)
{
col = tex2D(_MainTex, i.texcoord);
col.rgb = dot(col.rgb, fixed3(.222,.707,.071));
}
else
{
col = tex2D(_MainTex, i.texcoord) * i.color;
}
return col;
}
ENDCG
}
}
}

设置UISprite.color = Color.black;就能使用了。

使用效果

原理是在v2f中申请一个寄存器TEXCOORD1放置数据gray,并在顶点程序vert中计算是否灰色,在片段程序frag中用i.gray == 0做if判断。

第一段代码效率低的原因是if (i.color.r < 0.001)这里访问了color的分量r,但在官方文档中明确说了这样做效率低,除非必要情况时才使用。

另外在PC中(fixed gray : TEXCOORD1;)可以改成(bool gray : TEXCOORD1;),但在移动设备(android和ios)中都会有问题,求解。

时间: 2024-10-10 09:23:36

NGUI 修改Shader支持灰色滤镜的相关文章

修改LVDS支持1024*600分辨率

一.在boot中增加LVDS设置分辨率1024*600选项 1.修改文件TQIMX6_android-4.2.2\bootable\bootloader\uboot-imx\common\cmd_menu.c文件 在函数lcd_menu_shell中添加: 1 case '2': 2 do 3 { 4 printf("\r\n##### display select LVDS #####\r\n"); 5 printf("[1] 800*600 for LVDS->VG

wamp中修改配置支持多站点

本文介绍如果在wamp中修改配置支持多站点. 第1步,修改httpd.conf,增加8080端口的监听 #Listen 12.34.56.78:80Listen 80Listen 8080 第2步,修改virtual hosts的配置,同样在httpd.conf这个文件中. # Virtual hosts #Include conf/extra/httpd-vhosts.conf #修改为 # Virtual hosts Include conf/extra/httpd-vhosts.conf

修改linux支持中文显示!

安装中文支持包后 编辑  /etc/sysconfig/i18n 将内容改为LANG="zh_CN.UTF-8"SYSFONT="latarcyrheb-sun16"SUPPORTED="zh_CN.UTF-8:zh_CN:zh" 修改linux支持中文显示!

NGUI出现Shader wants normals, but the mesh UIAtlas doesn&#39;t have them

NGUI出现Shader wants normals, but the mesh UIAtlas doesn't have them,没有网格法线,打开UI Root上 UIPanel组建上的 Normal选择对勾就可以了 版权声明:本文为博主原创文章,未经博主允许不得转载. NGUI出现Shader wants normals, but the mesh UIAtlas doesn't have them

codeingiter修改版本支持多module

最近刚入职一家公司发现该公司采用的框架是古老的CI1.7.2加matchbox扩展而来的遂研究一翻 发现直接在其中进行升级有些麻烦索性修改新发布的CI3.0 为多module支持 现贡献给大家使用 此版本是在CI3.0版本的基础上修改开发出来的 此版本的框架对CI3.0进行了HMVC扩展 此扩展主要通过 EX_Loader.php文件进行扩展 简要说明如下: 1.application下为应用目录 2.common为公共文件夹 其中可以存放公共配置文件,核心文件,帮助文件,hooks, lang

修改live555支持mpeg2ts RTSP拉流,附代码

在很早之前的博客<用EasyDarwin进行IPTV rtsp mpeg-ts smil流的转发和分发直播服务>中,我们介绍到如何将live555支持mpeg2ts拉流,这个在IPTV领域用的特别多,其实修改的点也不是很多,主要是要对live555有一点的熟悉程度,这里就不多显摆啥了,直接上之前的说明和代码: live555直接请求IPTV RTSP时,IPTV服务器返回给客户端的sdp信息中的m=字段,这个媒体类型live555是无法识别的,也就是MP2T(mpeg2-ts)流,从抓包来看,

修改gorm支持protobuf

gorm的功能很强大,支持很多很多特性,打算在项目中用上它. 但gorm不支持protobuf,如果idl用的是protobuf,需要对每个message做一个重新定义一个内部的struct,使得可以让这个内部struct和mysql一一对应,这个是个很无脑的搬砖活:而且,对于message里面有内嵌message的情况的,原生的gorm只能做表关联,这对某些表需要比较多的内嵌数据,比如repeated数据,会使得表的记录数出现膨胀增长.因此,让gorm支持protobuf的内嵌字段,而且不需要

修改windows支持的远程桌面最大用户数

开始->管理工具->远程桌面服务->远程桌面会话主机配置->限制每个用户只能进行一次会话 "计算机配置"---"管理模板"---"windows组件"----"远程桌面服务"----"远程桌面会话主机"---"连接",最后选择"限制连接数量" 在"限制连接的数量"属性卡里,点击"已启用",并在"

修改PUTTY支持保存密码

1.从官网下载 Putty 0.60 Release 的 Windows 版源码 http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html 版本号可以从 putty-src/WINDOWS/PUTTY.ISS 中查看. 2.使用 VS2013 打开 putty-src/WINDOWS/MSVC/PUTTY.DSW ,设置 putty 项目为启动项目并生成,如果会报如下错误: You must define one of SEC