参考链接:

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. VSTO:使用C#开发Excel、Word【12】

    Excel对象模型中的事件了解excel对象模型中的事件至关重要,因为这通常是代码运行的主要方式.本章将检查Excel对象模型中的所有事件,引发事件以及可能与这些事件关联的代码类型. Excel对象模 ...

  2. 表单验证,添加动态class

  3. 第一章03 java 开发环境搭建

    1. 首先,搭配java开发环境,安装(jdk:java 开发工具包) 2.安装下载:输入www.oracle.com.cn/indek.html  (cn代表中文) 3.测试安装是否成功 (1)wi ...

  4. SQL-42 删除emp_no重复的记录,只保留最小的id对应的记录

    题目描述 删除emp_no重复的记录,只保留最小的id对应的记录.CREATE TABLE IF NOT EXISTS titles_test (id int(11) not null primary ...

  5. JS实现大整数乘法(性能优化、正负整数)

    本方法的思路为: 一:检查了输入的合法性(非空,无非法字符) 二:检查输入是否可以进行简单计算(一个数为 0,1,+1,-1) 三:去掉输入最前面可能有的正负符号,并判断输出的正负 四:将输入的值分成 ...

  6. java类的高级概念

  7. 《CSS揭秘》之毛玻璃效果知识点

    实现代码: CodePen:毛玻璃效果 Dabblet:毛玻璃效果 HTML: <main> <blockquote> <em>"The only way ...

  8. 图像特征匹配,sift,surf法

    今天想把这一段时间做的一些工作做个总结,望能帮到大家,尊重原创作品,转摘请注明原创地址:http://www.cnblogs.com/ggYYa/p/7902900.html,在此感谢!

  9. nodeJS网络操作

    var http = require('http'); http.createServer(function (request, response) { response.writeHead(200, ...

  10. C++之string类型详解

    C++之string类型详解 之所以抛弃char*的字符串而选用C++标准程序库中的string类,是因为他和前者比较起来,不必担心内存是否足够.字符串长度等等,而且作为一个泛型类出现,他集成的操作函 ...