模板测试

news/2024/10/8 20:03:46
 模板测试(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 depthCull Off ZWrite Off ZTest AlwaysTags { "Queue" = "Background" }Pass{Stencil{Ref 9Comp AlwaysPass Replace//此时,模板缓冲值为9}Color[_MainColor]}}
}

 

Shader "Hidden/InfrontWall"
{Properties{_MainColor ("Color", Color) = (1,1,1,1)}SubShader{// No culling or depthCull Off ZWrite Off ZTest AlwaysTags { "Queue" = "Geometry" }Pass{Stencil{Ref 2//丢掉与Wall重叠的区域Comp NotEqualPass Replace// 此时模板缓冲值为2}Color[_MainColor]}}
}

 

Shader "Hidden/BehindWall"
{Properties{_MainTex ("Texture", 2D) = "white" {}}SubShader{// No culling or depthCull Off ZWrite Off ZTest AlwaysTags { "Queue" = "Transparent" }Pass{Stencil{Ref 2Comp Equal //显示与InfrontWall重叠的区域}SetTexture[_MainTex]}}
}

 

参考:

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/69132.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

CH57X/CH58X/CH59X 加PA应用

一、前言在有些时候产品需要做到更远的距离在原来的基础上加上PA放大芯片来实现广播或者连接距离上的提升。 PA是Power Amplifier的简称,中文名称为功率放大器,简称“功放”,指在给定失真率条件下,能产生最大功率输出以驱动某一负载的放大器。对于射频通信系统,PA负责发射通道…

csp-s 模拟 8

难度 ★★★★☆csp-s模拟8 T1 score and rank 特殊性质,题意转换 妙妙题 对于 \(S\) 小于等于 \(0\) 的情况答案显然是所有大于等于 \(S\) 的个数。 现在讨论 \(S\) 大于 \(0\) 的情况。 先对序列做一个前缀和,题目要求即是让所有值减去前缀最小值小于 \(S\) 考虑有一段连续…

C#联合Visionpro编程学习记录,视觉中需要考虑旋转中心工况的计算方法探讨

一、考虑旋转中心的工况解法, 1,视觉中引导定位或者对位贴合时,机械手或者xyzr轴上手爪中心和末端轴中心不同轴时,就要考虑旋转中心问题; 2,如果设备的CT要求没有很苛刻,可以采用2次拍照的方案解决,1次拍照后纠偏角度,然后在纠正角度后的位置2次拍照纠正x、y偏差;看下…

海外模组联网非常难?不往忘了APN配置…

​除了中国之外,国外的4G信号都比较差劲。 做海外的设备,如果忽视了射频的信号质量,肯定是要吃大亏的! 所以,海外模组的联网问题,会比国内要多不少。 客户在实际应用中或多或少都会遇到:网络相关问题:例如:连不上网,APN不会配置,APN没有配置,当地信号差… 软件升级…

轻松上云怎么操作?IoT_CLOUD之中移OneNET

​最近来了很多新朋友,也经常被问:可以多讲些云平台的操作吗?当然可以!文末留言你想要了解的云平台,优先安排~ 接下来,本文将以Air780E+LuatOS作为示例,教你使用合宙IoT_CLOUD连接中移OneNET物联网云平台。一、IoT_CLOUD简1.1 IoT_CLOUD特色简介 IoT_CLOUD——是合宙专门…

实验2 C语言分支与循环基础应用编程-1

任务一#include <stdio.h> #include <stdlib.h> #include <time.h> #define N 5 #define N1 397 #define N2 476 #define N3 21int main() {int cnt;int random_major, random_no;srand(time(NULL)); // 以当前系统时间作为随机种子cnt = 0;while(cnt &…

面试-前端基础速刷-Vue

1. Vue中computed和watch的区别 两者用途不同啊!computed用于计算产生新的数据,watch用于监听现有数据。 computed有缓存,methods没有缓存。 computed有点儿像工厂模式(产生新的东西),watch像发布订阅模式。(是我目前的知识盲区) 2. Vue组件通讯有几种方式,尽量全面❗…