当前位置: 首页 > news >正文

Unity Shader - UI Sprite Shader之简单抠图效果

Sprite抠图效果:

前言

在PhotoShop中我们经常会用到抠图操作,现在就用Shader实现一个简单的抠图效果。

实现原理:

使用当前像素颜色与需要抠掉的颜色相减作比较,然后与一个指定的阈值比较以决定是否将其显示出来;

Unity Shader实现代码如下:

Shader "Custom/SpriteShader"
{
    Properties
    {
        [PerRendererData] _MainTex ("Sprite Texture", 2D) = "white" {}
        _Color ("Alpha Color Key", Color) = (0,0,0,1)
        _Range("Range", Range(0, 1.01)) = 0.1
        [MaterialToggle] PixelSnap ("Pixel snap", Float) = 0
    }
    SubShader
    {
        Tags 
        { 
            "Queue"="Transparent" 
            "IgnoreProjector"="True" 
            "RenderType"="Transparent" 
            "PreviewType"="Plane"
            "CanUseSpriteAtlas"="True"
        }

        // 关键修复:添加Stencil块以支持Mask组件
        Stencil
        {
            Ref 1
            Comp Equal
            Pass Keep
            Fail Keep
        }

        Pass
        {
            Cull Off
            Lighting Off
            ZWrite Off
            Blend SrcAlpha OneMinusSrcAlpha

            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #pragma multi_compile _ PIXELSNAP_ON

            sampler2D _MainTex;
            float4 _Color;
            half _Range;

            struct appdata
            {
                float4 vertex : POSITION;
                float2 uv : TEXCOORD0;
            };

            struct v2f
            {
                float4 vertex : SV_POSITION;
                float2 uv : TEXCOORD0;
            };

            v2f vert(appdata v)
            {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
                o.uv = v.uv;
                #ifdef PIXELSNAP_ON
                o.vertex = UnityPixelSnap(o.vertex);
                #endif
                return o;
            }

            half4 frag(v2f IN) : SV_Target
            {
                half4 c = tex2D(_MainTex, IN.uv);
                
                // 计算颜色差值
                half3 diff = abs(c.rgb - _Color.rgb);
                half maxDiff = max(diff.r, max(diff.g, diff.b));
                
                // 使用clip函数直接丢弃像素,兼容AlphaTest
                clip(maxDiff - _Range);

                return c;
            }
            ENDCG
        }
    }
}

_Color是用于比较的基色 
_range是决定抠图范围的域 

可以看到使用当前像素颜色与基色相减,然后与域相比较以决定是否将其显示出来。

相关文章:

  • ollama docker设置模型常驻显存
  • 流量分析实践
  • 【Python 算法零基础 1.线性枚举】
  • 使用htool工具导出和导入Excel表
  • springboot学习(自定义starter)
  • GO语言的GC(垃圾回收)原理
  • 探索可变参数提升不变学习以增强分布外泛化能力
  • Android ARouter的详细使用指南
  • 京东云DeepSeek-R1模型一键部署教程,基于智算GCS【成本2元】
  • Ansible 如何使用 Playbook 批量部署应用?
  • Unity WebGL项目访问时自动全屏
  • vue 加密解密
  • 基于PMU的14节点、30节点电力系统状态估计MATLAB程序
  • AndroidStudio下载安装,环境部署以及常见问题解决教程(亲测)
  • 游戏立项时期随笔记录(1)
  • MySql数据库(表数据的增、删、改操作)8
  • mysql5.x和mysql8.x查看和设置隔离级别
  • VSCode C/C++ 环境搭建指南
  • JS逆向案例-通达OA Office Anywhere 2019 的前端密码加密逆向分析
  • SiC/GaN器件测试新选择:MHO5000如何破解高频开关噪声难题?
  • 国家发改委:进一步完善促进民营经济发展的制度机制
  • 菲律宾华人“钢铁大王”撕票案两主谋落网,部分赎金已被提取
  • 财政部:鼓励政策性银行对符合条件的城市更新项目提供支持
  • 技术派|台军首次试射“海马斯”火箭炮,如何压制这种武器?
  • 中国首次当选联合国教科文组织1970年《公约》缔约国大会主席国
  • 私家车跑“顺风”出事故,意外险赔不赔?