参考链接:

https://blog.csdn.net/u011047171/article/details/46928463

https://blog.csdn.net/JohnBlu/article/details/83539427

模板测试和深度测试很相似:

1.如果模板测试不通过,则该像素会被舍弃

2.有模板缓冲区,每像素对应存放一个8位整数(0-255)

3.模板测试也是一个比较值的过程,将参考值和模板缓冲的值进行比较

当然也有很不同的地方:

1.即使模板测试不通过,仍然可以修改模板缓冲中的值

一.语法

1.Ref referenceValue

设置参考值,referenceValue(范围0-255)

2.ReadMask readMask

参考值和模板缓冲的值,会和readMask进行按位与(&)操作,readMask(范围0-255),默认值为255,即对读取值不作修改

3.WriteMask writeMask

当将值写入模板缓冲时,值会和writeMask进行按位与(&)操作,writeMask(范围0-255),默认值为255,即对写入值不作修改

4.Comp comparisonFunction

参考值和缓冲值要怎样比较,默认值为always,comparisonFunction可以取的值如下:

5.Pass stencilOperation

当模板测试和深度测试都通过时,模板缓冲的值要怎么处理,默认值为keep,stencilOperation可以取的值如下:

6.Fail stencilOperation

当模板测试不通过时,模板缓冲的值要怎么处理,默认值为keep

7.ZFail stencilOperation

当模板测试通过,深度测试不通过时,模板缓冲的值要怎么处理,默认值为keep

二.判断依据

if (参考值 & readMask comparisonFunction 缓冲值 & readMask) 像素通过

else 像素舍弃

因为readMask默认值为255,所以这时可以简化为:if (参考值 comparisonFunction 缓冲值)

三.实例(限制渲染区域,效果类似于Scroll View)

1.Stencil2.shader

 Shader "Custom/Stencil2"
{
Properties
{
_MainTex ("Texture", 2D) = "white" {}
}
SubShader
{
Tags { "RenderType"="Opaque" "Queue"="Geometry" } Pass
{
Stencil
{
Ref
Comp Equal
} CGPROGRAM
#pragma vertex vert
#pragma fragment frag #include "UnityCG.cginc" struct appdata
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
}; struct v2f
{
float2 uv : TEXCOORD0;
float4 vertex : SV_POSITION;
}; sampler2D _MainTex;
float4 _MainTex_ST; v2f vert (appdata v)
{
v2f o;
o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);
o.uv = TRANSFORM_TEX(v.uv, _MainTex);
return o;
} fixed4 frag (v2f i) : SV_Target
{
fixed4 col = tex2D(_MainTex, i.uv);
return col;
}
ENDCG
}
}
}

这个shader的意思是:

Ref 1:将参考值设置为1

Comp Equal:if (参考值 == 缓冲值) 像素通过 else 像素舍弃

将这个shader赋给一个Capsule,会发现整个Capsule都不见了,说明模板测试没有通过。如果改为Ref 0,会发现Capsule又出来了,说明模板缓冲中的值默认是0。

2.Stencil.shader

 Shader "Custom/Stencil"
{
Properties
{
}
SubShader
{
Tags { "RenderType"="Opaque" "Queue"="Geometry" } Pass
{
ZWrite Off
ColorMask Stencil
{
Ref
Comp Always
Pass Replace
} CGPROGRAM
#pragma vertex vert
#pragma fragment frag #include "UnityCG.cginc" struct appdata
{
float4 vertex : POSITION;
}; struct v2f
{
float4 vertex : SV_POSITION;
}; v2f vert (appdata v)
{
v2f o;
o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);
return o;
} fixed4 frag (v2f i) : SV_Target
{
return fixed4(, , , );
}
ENDCG
}
}
}

这个shader的意思是:

ColorMask 0:不输出颜色

ZWrite Off:关闭深度写入,防止后面的像素被剔除

Ref 1:设置参考值为1

Comp Always:模板测试始终通过

Pass Replace:将参考值赋值给缓冲值

将这个shader赋给一个Quad,即表示Quad所处区域的模板缓冲值刷新为1。又因为Capsule的参考值为1,因此,只有这两个物体重叠的部分才会有显示,效果如下:

[UnityShader基础]05.模板测试的更多相关文章

  1. Shader 模板缓冲和模板测试

    http://blog.sina.com.cn/s/blog_6e159df70102xa67.html 模板缓冲的概念 Unity官方的Shader文档根本没有提到这个玩意,这个概念也是看到了UGU ...

  2. Vue基础项目模板

    https://github.com/wanglong/vue-element-admin.git 优化 Vue CLI 3 构建的前端项目模板(1)- 基础项目模板介绍 一站式开源运维平台,分享给大 ...

  3. Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第十一章:模板测试

    原文:Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第十一章:模板测试 代码工程地址: https://github.co ...

  4. javaSE基础05

    javaSE基础05:面向对象 一.数组 数组的内存管理 : 一块连续的空间来存储元素. Int [ ] arr = new int[ ]; 创建一个int类型的数组,arr只是一个变量,只是数组的一 ...

  5. javascript基础05

    javascript基础05 1.变量的作用域 变量既可以是全局,也可以是局部的. 全局变量:可以在脚本中的任何位置被引用,一旦你在某个脚本里声明了全局变量,你就可以 在这个脚本的任何位置(包括函数内 ...

  6. OpenGL利用模板测试实现不规则裁剪

    本文是原创文章,如需转载,请注明文章出处 在游戏开发中,经常会有这样的需求:给定一张64x64的卡牌素材,要求只显示以图片中心为圆点.直径为64的圆形区域,这就要用到模板测试来进行不规则裁剪. 实现不 ...

  7. OpenGL ES 中的模板测试

    模板测试的主要功能是丢弃一部分片元,相对于深度检测来说,模板测试提出的片元数量相对较少.模板测试发生在剪裁测试之后,深度测试之前. 使用模板测试时很重要的代码提示: 1.glClear( GL_STE ...

  8. freeRadius 基础配置及测试

    国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html 内部邀请码:C8E245J (不写邀请码,没有现金送) 国 ...

  9. OpenGL-----深度测试,剪裁测试、Alpha测试和模板测试

    片断测试其实就是测试每一个像素,只有通过测试的像素才会被绘制,没有通过测试的像素则不进行绘制.OpenGL提供了多种测试操作,利用这些操作可以实现一些特殊的效果.我们在前面的课程中,曾经提到了“深度测 ...

随机推荐

  1. SSH登录异常(someone is doing something nasty)

    在平时工作中,有时候需要SSH登陆到别的Linux主机上去,但有时候SSH登陆会被禁止,并弹出如下类似提示: @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ...

  2. 入坑deep learning 1

    想体验一下跑keras的感觉,按照这个小妹妹的教程:https://zhuanlan.zhihu.com/p/28333410 0. 大概花了十来个小时才搞定初步的小环境 1. 在linux 16.0 ...

  3. vue 创建项目

    先安装node.js环境 #先安装npm 阿里镜像 (之后cnpm 下载组件快速) npm install -g cnpm --registry=https://registry.npm.taobao ...

  4. JAVA概率实现--一篇最常见、最通用解决方案

    日常场景:某活动抽奖,控制各等奖的出现概率 比如控制A(中奖率):20%:B(获得优惠券率):30%:C(谢谢参与率):50% 下面以封装好在main()函数里,上代码(记得导入相应的包): publ ...

  5. wpf-xaml-命名空间

    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns 为window控件的属性 代表声明引用 如同C ...

  6. L2-007. 家庭房产(并查集)*

    L2-007. 家庭房产 参考博客 #include <iostream> #include <cstdio> #include <cstring> #includ ...

  7. php 调用天气接口

    前几天没事的时候,浏览博客看到了一篇免费天气接口的文章,然后调用了一下文章中提到的接口,自己琢磨了半天,把数据处理了一下,虽然现在用不到,但是说不定以后会用,所以打算记录一下,毕竟这也算是自己第一次在 ...

  8. <a>链接添加样式问题

    <a>链接是内联元素,必须设置成块元素block,才能有 width 和 height,不过你可以又定义display:block再定义成 display:inline 这样可以避免在IE ...

  9. Java+opencv实现人脸检测

    版本 Java1.8 opencv3.4 代码: import java.awt.Graphics; import java.awt.image.BufferedImage; import javax ...

  10. robot framework中的timeout的关键词

    1.默认robotframework中的含有等待的关键词(如:Wait Until Element Is Enabled),未手动设置时默认该参数为5sec 2.关键词:sleep A)一般在调试的时 ...