改进版置灰(转载)

之前有人做过,不过效率不高: 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)中都会有问题,求解。

时间: 2024-10-25 03:47:33

改进版置灰(转载)的相关文章

unity UI置灰(转载)

Unity3D开发(二):NGUI之UIButton"禁用"状态时置灰 分类: Unity3D开发2013-09-30 18:51 7024人阅读 评论(5) 收藏 举报 目录(?)[+] NGUI中的Button几乎是最常用到的控件之一,并且可以组合各种组件(比如UIButtonColor,UIButtonOffset,UITweenxx),方便设置Button的各种状态下的属性,几乎可以满足我们的所有需求. 但是对于当Button的isEnabled属性设置为false时,根据设置

Cocos2dx-- 图片置灰实现

前言:游戏中有很多按钮控件,它们一般会有选中和未选中2种状态.我们如果要区分这两种状态的表现,很多时候是直接叫美术给两种状态下的资源,或直接setColor设置颜色.这样无疑增加了资源的大小或不美观(看需求).本节将介绍怎么通过opengl es程序来实现图片置灰操作. 注:这个置灰操作是基于Cocos-Lua的,具体原理分析这里不打算介绍,主要讲如何实现. 实现步骤 Lua端操作: 1,置灰Lua代码(ShaderEffect.lua) local ShaderEffect = { vertD

cocos2dx3.X shader使图片置灰

1 OpenGL ES着色器 opengl es的着色器有.fsh和.vsh两个文件.这两个文件在被编译和链接后就可以产生可执行程序与GPU交互.attribute是从外部传进来的,每一个顶点都会有这两个属性,所以它也叫做vertex attribute(顶点属性).而varying类型的变量是在vertex shader和fragment shader之间传递数据用的. .vsh 是 vertex shader,用与顶点计算,可以理解控制顶点的位置,在这个文件中我们通常会传入当前顶点的位置,和

jQuery按钮置灰及恢复

<!DOCTYPE html> <html> <head> <meta charset="utf-8"/> <title>DOM0级添加</title> <style type="text/css"> input{ height: 20px; width: 80px; border: 1px; } #addo{ background-color: blue; } </style

置灰GridView 的disable Item

如果想要disable掉GridView中的item,需要做如下两件事情: 1. override Adapter 的 areAllItemsEnabled 2. override Adapter 的 isEnabled(int position) 3. 另外如果想在disable的时候,置灰对应的item,那么只需要在getView方法中,设置对应View的alpha值即可. 比如: class MyAdapter extends BaseAdapter { @Override public

【有意思的BUG】默认置灰的属性的值传递

数据由Client发送给Server,如下图所示,Server在收到请求后会响应Client. 比如Client发送给Server一组数据:Name:sean&Hobby:movies&City:Peking&Country:China 有如下表单: 可以看到"China"是默认置灰的属性的值,不允许手动输入,所以用户只需要填写"Name"."Hobby"."City"这三项,然后点击最下面的"

[原]NGUI之按钮置灰

传统按钮置灰,需要使用另外一张纹理. 本例通过修改shader和NGUI sprite的r值实现按钮置灰.优势:节省纹理,操作简单 将NGUI Unlit/Transparent Colored片段部分改成如下:fixed4 frag (v2f i) : COLOR { fixed4 col= tex2D(_MainTex, i.texcoord) * i.color; if(i.color.r < 0.0001) { float grey = dot(col.rgb, float3(0.299

将图片转换成黑白(灰色、置灰)

网站图片置灰现在已经很常见了,最近上网找了些资料,基本都是用css3 grayscale和grayscale.js,做了测试,发现用CSS或greyscale.js都不能完全兼容. 测试浏览器版本:google.google.firefox.opera.safari.IE7-9 css3 grayscale很多都是用这段CSS: -webkit-filter: grayscale(100%);/*兼容google.opera*/ -moz-filter: grayscale(100%);/*FF

【每日一记】unity3d 图片置灰shader

项目需要,参考了一下网上的资料,写了一个shader,给按钮置灰. shader具体实现如下: Shader "Transparent Colored Gray" { Properties { _MainTex ("Base (RGB), Alpha (A)", 2D) = "white" {} } SubShader { LOD 200 Tags { "Queue" = "Transparent" &qu