Unity之Shader过滤掉不带Alpha通道贴图的背景颜色 - 四

来源:互联网 发布:windows 文件搜索工具 编辑:程序博客网 时间:2024/05/21 19:35

过滤掉不带Alpha通道贴图的黑色背景颜色,屏蔽掉光照影响(改变光源的颜色模型贴图颜色不受影响)

代码如下

方法一

Shader "Custom/NewShader2" {    Properties {        _MainTex ("Base (RGB)", 2D) = "white" {}        _TransVal ("Transparency Value", Range(0,10)) = 1.0    }    SubShader {        Tags { "RenderType"="Opaque" "Queue"="Transparent"}        LOD 200        Lighting Off        Blend  One OneMinusSrcAlpha         CGPROGRAM        #pragma surface surf Lambert        sampler2D _MainTex;        float _TransVal;        struct Input {            float2 uv_MainTex;        };        void surf (Input IN, inout SurfaceOutput o) {            half4 c = tex2D (_MainTex, IN.uv_MainTex);            o.Albedo = c.rgb;            o.Emission = tex2D (_MainTex, IN.uv_MainTex);            o.Alpha = (c.r + c.g + c.b) *_TransVal;        }        ENDCG    } }

下面对代码的注释比较详细

Shader "Custom/NewShader2" {    Properties {        // 一个图片贴图        _MainTex ("Base (RGB)", 2D) = "white" {}         //定义一个范围为 0 - 10 的滑动条        _TransVal ("Transparency Value", Range(0,10)) = 1.0    }    SubShader {        // 渲染类型为 Opaque    渲染队列为  Transparent 透明        Tags { "RenderType"="Opaque" "Queue"="Transparent"}        LOD 200        //关闭掉光照,模型贴图不再受光照影响,        //如果需要光照影响可以不写或者  Liginting On        Lighting Off        // 混合方式         Blend  One OneMinusSrcAlpha         //下面说下 Blend 包含的混合方式                //One 值为1,使用此因子来让帧缓冲区源颜色或是目标颜色完全的通过。         //Zero 值为0,使用此因子来删除帧缓冲区源颜色或目标颜色的值。         //SrcColor 使用此因子为将当前值乘以帧缓冲区源颜色的值         //SrcAlpha 使用此因子为将当前值乘以帧缓冲区源颜色Alpha的值。                   //DstColor 使用此因子为将当前值乘以帧缓冲区目标颜色的值。         //DstAlpha 使用此因子为将当前值乘以帧缓冲区目标颜色Alpha分量的值。           //OneMinusSrcColor 使用此因子为将当前值乘以(1 -帧缓冲区源颜色值)         //OneMinusSrcAlpha 使用此因子为将当前值乘以(1 -帧缓冲区源颜色Alpha分量的值)                 //OneMinusDstColor 使用此因子为将当前值乘以(1 –目标颜色值)            //OneMinusDstAlpha 使用此因子为将当前值乘以(1 –目标Alpha分量的值)        CGPROGRAM     //下面自定义了一个 函数 surf 系统会自动调用,     //我们只需在下面写出 surf的实现即可     // Lambert 是系统自带的一个光照函数 Lambert,     //不用我们写他的实现     #pragma surface surf Lambert     // 在 Unity安装目录下       Editor/Data/CGIncludes/Lighting.cginc     //文件中,是这样实现 Lambert函数的     /*     inline fixed4 LightingLambert (SurfaceOutput s, fixed3 lightDir, fixed atten)     {         //对漫反射进行计算         fixed diff = max (0, dot(s.Normal, lightDir));         fixed4 col;         //下面计算了物体表面的纹理颜色、光源颜色以及光源强度的影响         col.rgb = s.Albedo * _LithgColor0.rgb * (diff * atten * 2);         col.a = s.Alpha;         return col;     }     */        sampler2D _MainTex;        float _TransVal;        struct Input {            float2 uv_MainTex;        };        void surf (Input IN, inout SurfaceOutput o) {            // 计算贴图颜色            half4 c = tex2D (_MainTex, IN.uv_MainTex);            o.Albedo = c.rgb;            // 将贴图颜色赋值给自发光            o.Emission = tex2D (_MainTex, IN.uv_MainTex);            //设置Alpha的值            // 由于我的目的是过滤掉黑色背景,黑色的 rgb值分别为(0, 0, 0)            //所以 三者相加为 0 的位置 Alpha设置为 0            o.Alpha = (c.r + c.g + c.b) *_TransVal;        }        ENDCG    } }

方法二、代码和方法一基本相同不做过多解释

Shader "Custom/NewShader1" {    Properties {        _MainTex ("Base (RGB)", 2D) = "white" {}        _TransVal ("Transparency Value", Range(0,10)) = 1.0    }    SubShader {        Tags { "RenderType"="Opaque" "Queue"="Transparent"}        LOD 200        Lighting Off        CGPROGRAM        //在此我自定义了 Lambe 不使用系统自带的光照方法        //另外 在最后加了 alpha        #pragma surface surf Lambe alpha        sampler2D _MainTex;        float _TransVal;        struct Input {            float2 uv_MainTex;        };        void surf (Input IN, inout SurfaceOutput o) {            half4 c = tex2D (_MainTex, IN.uv_MainTex);            o.Albedo = c.rgb;            o.Emission = tex2D (_MainTex, IN.uv_MainTex);            o.Alpha = (c.r + c.g + c.b) *_TransVal;        }        inline float4 LightingLambe(SurfaceOutput s, fixed3 lightDir, fixed atten)        {            return (0, 0, 0, 0);        }        ENDCG    }     FallBack "Diffuse"}

效果如下
在材质中选择该shader
然后选择贴图
这里写图片描述

贴图选择如下
这里写图片描述

在世界中的显示如下
这里写图片描述

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 小班社会生病了怎么办反思 脚扭伤了怎么办的反思 中班安全迷了眼怎么办 15个月的小孩长泡疹怎么办 墨盒加错颜色墨水怎么办 墨盒颜色加错了怎么办 uV打印有色差是怎么办 cmyk和rgb有色差怎么办 染头发新长出来怎么办 白色衣服弄上口红怎么办 口红弄到牛仔裤上怎么办 口红弄到沙发上怎么办 做了拔罐后背疼怎么办 拔罐拔出血水后怎么办 拨了罐浑身疼怎么办 拔完火罐洗澡疼怎么办 拔罐之后脊背疼怎么办? 五个月的狗胆小怎么办 电脑颜色不正常分辨率调不了怎么办 宝宝认人怎么办 五个月 新生儿42天听力筛查未通过怎么办 幼儿大便干燥拉不下粑粑怎么办 宝宝大便干燥拉粑粑带浓血怎么办 新生儿便秘4天了怎么办 写卷子的题目不认识怎么办? 2个月小猫尿床怎么办 安全教案鱼刺卡住了怎么办 被鱼刺卡住怎么办安全教案 小班健康教案生病了怎么办 被蜜蜂蛰了怎么办教案 走丢了怎么办大班反思 小孩吃了硬物怎么办 小孩吞了硬物怎么办 小学二年级孩子成绩不好怎么办 二年级孩子成绩不好怎么办 一年级学的不好二年级怎么办 17个月宝宝夜奶怎么办 小孩吃积食了吐怎么办 11个宝宝不会爬怎么办 5岁宝宝严重挑食怎么办 孩子吃菜口味重怎么办?