【Unity Shader】LineRender 组件如何使用Stencil模板测试应用遮罩

最近做了一些绘图的工作,使用到了LineRender组件,比较简单的任务,画个圆,然后需要加个遮罩,这个任务比较简单原因是2D的绘制,可是后续的问题来了,使用RectMask 2D根本遮不住这个叛逆的LineRender,他有个属性 Use World Space , 设置为Flase后进行2D 绘制,
怎么都遮不住,想想RectMask 2D也是通过Stencil模板测试来处理的,我自然就想到了使用Stencill来处理LineRender,

查资料…查资料…查资料…
查资料…查资料…查资料…

没有找到,CSDN上居然没有这么简单的问题居然没有答案,我很惊讶,于是翻墙出去搜了一下,发现老外也遇到了这个问题,最终找到了一个答案

如果你翻墙了,可以去看看,翻不了我就抄在下面给你们用

https://discussions.unity.com/t/how-to-use-the-stencil-buffer-on-a-line-renderer/950878

Stencil Test

Shader "Custom/Masked"
{
    SubShader
    {
        Tags {
            "Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent"
        }

        Pass
        {
            Stencil
            {
                Ref 1
                Comp Equal
                Pass Keep
            }
        }
    }
}

Stencil Mask

Shader "Custom/Masked"
{
    SubShader
    {
        Tags {
            "Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent"
        }
        Blend SrcAlpha OneMinusSrcAlpha

        Pass
        {
            Stencil
            {
                Ref 1
                Comp Equal
                Pass Keep
            }
          
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #include "UnityCG.cginc"

            struct vert_to_frag
            {
                float4 pos : SV_POSITION;
                fixed4 color : COLOR;
            };

            vert_to_frag vert (appdata_full vert_data)
            {
                vert_to_frag frag_data;
                frag_data.pos = UnityObjectToClipPos(vert_data.vertex);
                frag_data.color.xyz = vert_data.color;
                frag_data.color.w = vert_data.color.w;
                return frag_data;
            }

            fixed4 frag (vert_to_frag frag_data) : SV_Target
            {
                return frag_data.color;
            }

            ENDCG
        }
    }
}

上述代码是模板和模板测试的原型,着色代码可以自己添加, 也可以自定义属性控制,这里简单的写了一下,希望能给你带来帮助。

【源码免费下载链接】:https://renmaiwang.cn/s/ct7kp 新年祝福程序是一个使用C语言编写的程序,它旨在在新年来临之际,为用户带来节日的问候和欢乐的气氛。C语言是一种强大的、低级别的编程语言,被广泛用于系统编程、嵌入式开发以及各种软件应用程序。这个程序的创建者可能利用了C语言的基本结构,如变量、条件语句、循环和函数,来实现特定的祝福功能。在C语言中,新年祝福程序可能会包含以下几个关键部分:1. **主函数** (main function): 这是每个C程序的入口点,所有执行都将从这里开始。主函数可能包括程序的初始化和主要逻辑。2. **字符串常量** (String constants): 祝福语通常以字符串常量的形式存在,例如 "祝您新年快乐!"。在C语言中,字符串是以字符数组的形式存储的,所以祝福语会被定义为一个字符数组。3. **输入/输出操作** (Input/output operations): 程序可能使用`printf`函数将祝福语打印到控制台,让用户看到。如果程序设计得更复杂,可能还会包含读取用户输入的功能,例如询问用户的姓名,然后个性化地展示祝福。4. **条件语句** (Conditional statements): 为了确保程序只在新年期间运行并显示祝福,可能需要使用`if`语句检查当前日期是否为新年。这可能涉及对时间的处理,比如获取当前的年份和日期,并与新年日期进行比较。5. **循环结构** (Loop structures): 如果程序设计为在一天中的特定时间或连续几天内显示祝福,可以使用`for`或`while`循环来重复输出祝福语。6. **函数** (Functions): 为了提高代码的可读性和重用性,程序可能包含自定义函数,如`display_wish()`,专门负责输出祝福语,或者`check_date(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值