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

过滤掉不带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
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
内置的渲染器,HD,URP和轻量级SRP支持 NEW!HDRP矢量位移样本 新!URP和HDRP的镶嵌选项 新!URP的半透明和透射选项 新!新的“开始屏幕”窗口 NEW!轻松的图形共享和画布截图按钮 新功能!SRP包自动导入程序 NEW!与Unity 2019的兼容性 新!支持后期处理堆栈着色器 新功能!与Unity插件中的Substance 兼容 !支持自定义渲染纹理 新增!同时支持高清,URP和轻量级SRP 。多遍模板 !Xbox One / PS4 / Switch支持 新增!地形支持 NEW! 着色器模板 •通用PBR /未照明SRP •通用2D点亮/未照明SRP •HD点亮/未照明/头发/织物/贴花SRP •轻量PBR /未照明SRP •自定义RT初始化/更新 •后处理效果,包括后处理堆栈 • Alpha混合颗粒 •雪碧 •熄灭 •不亮光照贴图 •UI 新工具 •后处理堆栈工具 新样本 •HDRP向量位移 •独立于比例的图块 • Raphael Ernaelsten的体积像素化 •SRP HD全贴图 •马赛克效果 •未使用光照贴图 新模板 •通用PBR /未照明 •HD点亮/ 未照明/毛发/织物 •后处理堆栈 •未照明光图 新节点 •反投影矩阵 •反视图投影矩阵 •HD发射 •Voronoi •渐变 •渐变样本 新增的着色器功能 •反勒普 •随机范围 •SRP附加光 •流量 •旋转 •高处法线 •噪声正弦波 •锯齿波 •方波 •三角波 •棋盘格 •椭圆 •多边形 •矩形 •圆角矩形 最新改进 •添加了专门用于新通用渲染管线的 模板•添加了与Unity HDRP着色器检查器兼容的新HD Lit模板 •无限循环检测现在更快,减少了连接大型图形上的节点时的命中率。 •改进了节点预览渲染刷新行为 •创建了新的标记系统以改善节点搜索 •只需单击“屏幕截图”按钮即可获取整个画布的屏幕截图 •通过“共享”按钮轻松共享图形的选定部分 •添加了新的后处理堆栈工具它会使用给定着色器的PPS渲染器和设置生成cs脚本。 •Amplify Shader Editor通过高达v7.2.x的模板支持HD,Lightweight和Universal RP。 •Legacy HD和Lightweight SRP v3.xx / v4.xx / v5.xx模板也通过Legacy软件包提供。 •通过自定义RT模板支持在Unity 2017及更高版本上使用自定义渲染纹理。 •现在,也可以通过Unity插件中的Substance,在Unity 2018及更高版本的ASE画布上使用此Substance。 •现在在Unity 2018.2及更高版本上可以访问8个UV通道。 •可以通过键盘方向键平移和缩放ASE画布摄像机。 •支持HD PBR SRP模板中的材料类型。 •支持将Specular工作流程集成到Lightweight PBR SRP模板中。 •现在可以直接在模板上添加自定义选项。 了解更多: 在此处放大Wiki 讨论:Unity论坛线程 着色器示例:完整列表 编辑器在将来的更新中将继续得到改进,当前正在开发许多功能。 显着功能 •完整的源代码 •支持Xbox One / PS4 / Switch • 自定义节点API • 着色器模板 • 着色器功能 •多窗口支持 •直观,熟悉的节点界面 •广泛的节点库 •实例化支持 •用户贡献的节点和着色器 •不断增加的样本收集

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值