修改Shader让NGUI支持灰色滤镜 [Unity3D]

转载 2015年07月10日 17:17:44

转载地址:http://chengduyi.com/blog/?post=43

之前有人做过,不过效率不高: 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;
}

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

struct v2f 
{ 
    float4 vertex : SV_POSITION; 
    half2 texcoord : TEXCOORD0; 
    fixed4 color : COLOR; 
    fixed gray : TEXCOORD1; 
}; 
sampler2D _MainTex; 
float4 _MainTex_ST; 
v2f vert (appdata_t v) 
{ 
    v2f o; 
    o.vertex = mul(UNITY_MATRIX_MVP, v.vertex); 
    o.texcoord = TRANSFORM_TEX(v.texcoord, _MainTex); 
    o.color = v.color; 
    o.gray = dot(v.color, fixed4(1,1,1,0)); 
    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; 
}

设置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)中都会有问题,求解。


【NPR】Unity3D非真实感渲染----铅笔画滤镜

关于Unity3D下的NPR滤镜-----铅笔画风格滤镜

Unity3D使用shader实现灰图

猴子原创,欢迎转载。转载请注明: 转载自Cocos2D开发网–Cocos2Dev.com,谢谢! 原文地址: http://www.cocos2dev.com/?p=596 昨晚看到群里问...

【Unity&Shader】关于变灰Shader的探究

NGUI实现图集变灰功能 Unity3D开发(二):NGUI之UIButton"禁用"状态时置灰 http://bbs.9ria.com/thread-434334-1-1.htm...

NGUI sprite 变灰shader

1.初衷 最近做一个装备的滚动条,需要将因为金钱不足不能购买的装备置灰,原来置灰是使用texture+shader,现在是使用sprite+shader,但是NGUI原有的sprite不具备添加sh...

Shader 边缘发光、变灰、高亮着色器

//转自omuying 变灰: Shader "Custom/GreyShader" { Properties { _MainTex ("Base (RGB)", 2D) = "white"...

Unity3D 灰度shader(改编自NGUI)

原创文章如需转载请注明:转载自 脱莫柔Unity3D学习之旅 QQ群:【Unity3D(AR/VR) 334163814】【Unity3D(游戏) 119706192】 本文链接地址: 灰度sha...

unity3d学习笔记(十一)--NGUI结合Shader制作小地图

本系列文章由Aimar_Johnny编写,欢迎转载,转载请标明出处,谢谢。 http://blog.csdn.net/lzhq1982/article/details/12783493 ...

unity3d学习笔记(十一)--NGUI结合Shader制作小地图

在做这个demo的过程中,制作小地图着实刁难了我一把,花了好几天的时间,需要的知识点实在太多了,尤其是shader语言,好在最后成功把它啃下来了,接下来我把这个过程分享给大家,下面上一张截图: 看...
  • lzhq1982
  • lzhq1982
  • 2013年10月17日 19:56
  • 15063

unity3d学习笔记(十一)-NGUI结合Shader制作小map

在做这个demo的过程中,制作小地图着实刁难了我一把,百度了很多文章,花了好长的时间,需要的知识点实在太多了,尤其是shader语言,好在最后成功把它啃下来了,先声明一下,本篇文章将会是这个系列中最难...

unity3d学习笔记(十一)--NGUI结合Shader制作小地图

本系列文章由Aimar_Johnny编写,欢迎转载,转载请标明出处,谢谢。 http://blog.csdn.net/lzhq1982/article/details/12783493 ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:修改Shader让NGUI支持灰色滤镜 [Unity3D]
举报原因:
原因补充:

(最多只允许输入30个字)