首页 > 其他分享 >模板测试

模板测试

时间:2024-10-08 20:03:17浏览次数:8  
标签:Stencil 测试 缓冲区 255 模板 stencilBufferValue

 模板测试(Stencil Test)是3D渲染中的一种技术,它根据预设条件比较参考值与模板缓冲区的值来决定片段是否进行下一步深度测试。本文介绍了模板测试的条件判断公式、语法,包括命令、比较函数,以及更新操作的各种关键字,如Keep、Zero等。并通过穿透效果的例子展示了模板测试的实际应用场景。 摘要由CSDN通过智能技术生成

展开 

介绍

模板测试stencil test是3d渲染管线中介于透明测试alpha test和深度测试depth test之间的测试,目的是根据条件来比较设置的参考值referenceValue和模板缓冲区stencil buff中对应的值stencilBuffValue的大小,如果条件满足就让片段 fragment (候选的像素)进入下一测试,即深度测试,条件不满足就过滤掉片段,不把对应材质的片段输出到屏幕。
条件判断公式如下:

if(referenceValue & readMask comparisonFunction stencilBuffValue & readMask)
    条件满足,通过片段
else
    条件不满足,过滤片段

 

其中,stencilBuffValue是模板缓存中的值,其他由我们定义。

语法
1. 命令
Stencil
{
    Ref referenceValue //参考值
    ReadMask  readMask  //读取掩码,取值范围也是0-255的整数,默认值为255,二进制位11111111,即读取的时候不对referenceValue和stencilBufferValue产生效果,读取的还是原始值
    WriteMask writeMask  //输出掩码,当写入模板缓冲时进行掩码操作(按位与【&】),writeMask取值范围是0-255的整数,默认值也是255,即当修改stencilBufferValue值时,写入的仍然是原始值
    Comp comparisonFunction  //条件,关键字有,Greater(>),GEqual(>=),Less(<),LEqual(<=),Equal(=),NotEqual(!=),Always(总是满足),Never(总是不满足)
    Pass stencilOperation  //条件满足后的处理
    Fail stencilOperation  //条件不满足后的处理
    ZFail stencilOperation  //深度测试失败后的处理
}

 

2. Comparison Function

比较函数是其中之一:
- Greater
只显示引用值大于缓冲区值的像素。
- GEqual
仅呈现引用值大于或等于缓冲区中的值的像素
- Less
只显示引用值小于缓冲区中值的像素。
- LEqual
仅呈现引用值小于或等于缓冲区中的值的像素。
- Equal
只呈现引用值等于缓冲区中的值的像素。
- NotEqual
只呈现引用值与缓冲区中的值不同的像素。
- Always
让模板测试总是通过。
- Never
让模板测试总是失败。

3. 更新操作:

Pass(模板测试和深度测试都通过了,该如果更新深度缓冲)、Fail(当模板测试和深度测试失败时)、ZFail(当模板测试通过而深度测试失败时)可设置的关键字如下:
- Keep
保留当前缓冲中的内容,即stencilBufferValue不变。
- Zero
将0写入缓冲,即stencilBufferValue值变为0。
- Replace
将参考值写入缓冲,即将referenceValue赋值给stencilBufferValue。
- IncrSat
stencilBufferValue加1,如果stencilBufferValue超过255了,那么保留为255,即不大于255。
- DecrSat
stencilBufferValue减1,如果stencilBufferValue超过为0,那么保留为0,即不小于0。
- Invert
将当前模板缓冲值(stencilBufferValue)按位取反
- IncrWrap
当前缓冲的值加1,如果缓冲值超过255了,那么变成0,(然后继续自增)。
- DecrWrap
当前缓冲的值减1,如果缓冲值已经为0,那么变成255,(然后继续自减)。

穿透效果:

这里写图片描述
创建三个GameObject按照离相机有近到远分别是Sphere_InfrontWall、Wall、Cube_BehindWall。
由于Stencil的设置与渲染顺序有关,因此这里先使用Render Queue固定渲染顺序为:Wall、Sphere_InfrontWall、Cube_BehindWall(可任意设定,并根据设定的顺序编写Stencil代码)
这里写图片描述
这里写图片描述
附上代码:

Shader "Hidden/Wall"
{
    Properties
    {
        _MainColor ("Color", Color) = (1,1,1,1)
    }
    SubShader
    {
        // No culling or depth
        Cull Off ZWrite Off ZTest Always

        Tags { "Queue" = "Background" }

        Pass
        {
            Stencil
            {
                Ref 9
                Comp Always
                Pass Replace
                //此时,模板缓冲值为9
            }
            Color[_MainColor]
        }
    }
}

 

Shader "Hidden/InfrontWall"
{
    Properties
    {
        _MainColor ("Color", Color) = (1,1,1,1)
    }
    SubShader
    {
        // No culling or depth
        Cull Off ZWrite Off ZTest Always

        Tags { "Queue" = "Geometry" }

        Pass
        {
            Stencil
            {
                Ref 2
                //丢掉与Wall重叠的区域
                Comp NotEqual
                Pass Replace
                // 此时模板缓冲值为2
            }
            Color[_MainColor]
        }
    }
}

 

Shader "Hidden/BehindWall"
{
    Properties
    {
        _MainTex ("Texture", 2D) = "white" {}
    }
    SubShader
    {
        // No culling or depth
        Cull Off ZWrite Off ZTest Always

        Tags { "Queue" = "Transparent" }

        Pass
        {
            Stencil
            {
                Ref 2
                Comp Equal 
                //显示与InfrontWall重叠的区域
            }
            SetTexture[_MainTex]
        }
    }
}

 

参考:

ShaderLab: Stencil
Unity3D Shader示例之使用模板测试Stencil Test制作窗口效果
UnityShader实例09:Stencil Buffer&Stencil Test
模板测试

标签:Stencil,测试,缓冲区,255,模板,stencilBufferValue
From: https://www.cnblogs.com/gangtie/p/18452378

相关文章

  • 通过sysbench工具实现MySQL数据库的性能测试
    1.背景 sysbench是一款压力测试工具,可以测试系统的硬件性能,也可以用来对数据库进行基准测试。sysbench支持的测试有CPU运算性能测试、内存分配及传输速度测试、磁盘IO性能测试、POSIX线程性能测试、互斥性测试测试、数据库性能测试(OLTP基准测试)。目前支持的数据库主要是My......
  • 不容忽视的PCB测试点,关键时刻可以避免批量事故哦!
    ​ PCB测试点是啥子?请看下图: ​如果你曾经用过NOKIA手机,每次你打开后盖换电池的时候,每次看到的那两排圆形的点——就是PCB测试点,oryoucancallitTestPointinEnglish.NOKIA手机的测试点有什么用?为什么要留这两排测试点?我虽然不知道NOKIA手机这些测试点的具体作用......
  • H7-TOOL的1拖4脱机烧录SPI Flash芯片XM25QU64在1.8V供电时满速下载的稳定性测试
    XM25QU64规格:XM25QU64C实测1.8V(脱机烧录上位机这里和微型数控电源界面都设置TVCC为1.8V),1拖4转接板方式,直接将芯片放入转接板,稳定好用:时钟电平1.8V实际效果: ......
  • Spring JdbcTemplate与NamedJdbcTemplate模板的实战案例与优化解析
    前言基于SpringJdbcTemplate来实现用户的增删改查案例,以及NamedJdbcTemplate模版的优化案例,和SpringJDBC相关支持类使用。 基本案例实现创建JavaWeb项目,使用JDBCTemplate对MySQL用户表进行增删改查操作。第一步:创建JavaWeb项目,创建数据库表,配置pom.xml文件t_user:......
  • 性能测试度量指标的多种收集环境
    目录一、技术环境二、业务环境三、操作环境在用卷尺测量某一物体的长度时,长度就是该场景下的度量指标,我们可以用分米、米或者更精确的厘米甚至毫米来描述这个长度,具体取决于使用场景。与其他形式的测量一样,对性能进行测量也可以选择更精确的度量指标。本文描述的任何度......
  • 软件测试学习笔记丨Mitmproxy使用
    本文转自测试人社区,原文链接:https://ceshiren.com/t/topic/32334一、简介Mitmproxy是一款开源、免费的代理工具,支持Mac、Windows、Linux。相比其他代理工具,可以通过Python和Mitmproxy工具本身的插件机制,实现通过脚本对Mitmproxy的完全控制。强大的可拓展性和可定制性,可以让测试工程......
  • 【WCH以太网接口系列芯片---CH395】STM32+CH395评估板应用测试
    本篇文章基于WCH沁恒的以太网接口芯片CH395Q进行TCP、UDP数据传输验证测试,主控为STM32F103ZET6+CH395QDemo板。功能初步验证:使用USB转串口模块+CH395Q初步验证通讯,测试软件为DEBUG395。接线:U转串模块和CH395Q的RXTX交叉连接,VIN--5V,GND-GND,CH935Q网口用网线直连电脑。DEB......
  • 软件测试面试中常见必问(一)内附答案
    一般面试都会按照简历当中我们写的技能或者项目进行提问,所以我们在简历当中一定要写自己能说上来的东西和对简历中的项目一定要有准备。另外,如果真的不知道就请坦诚相待,直说“不好意思,这里我不太清楚”就可以了,有的面试官也会当场告诉你答案。1.自我介绍虽然简历中都有信息,但是......
  • GM_registerMenuCommand()注册菜单模板,TemperMonkey油猴脚本开发
    注册菜单点击事件注册实例设置默认值将handle(手握实例的变量)赋值给一个变量functionmenu_Func_click(){GM_setValue('Func',!GM_getValue('Func'));//开关GM_unregisterMenuCommand(menu_Func);//卸载再注册//强制等待下一个事件循环setTimeo......
  • C++模板的特性
    #include<iostream>#include<cstdint>structCheckValue{CheckValue(inta,intb,intc){}voidfunctions(inta,intb,intc){std::cout<<a<<b<<c<<std::endl;}};classCheckValueV2{publ......