[UnityShader基础]05.模板测试
参考链接:
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.模板测试的更多相关文章
- Shader 模板缓冲和模板测试
http://blog.sina.com.cn/s/blog_6e159df70102xa67.html 模板缓冲的概念 Unity官方的Shader文档根本没有提到这个玩意,这个概念也是看到了UGU ...
- Vue基础项目模板
https://github.com/wanglong/vue-element-admin.git 优化 Vue CLI 3 构建的前端项目模板(1)- 基础项目模板介绍 一站式开源运维平台,分享给大 ...
- Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第十一章:模板测试
原文:Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第十一章:模板测试 代码工程地址: https://github.co ...
- javaSE基础05
javaSE基础05:面向对象 一.数组 数组的内存管理 : 一块连续的空间来存储元素. Int [ ] arr = new int[ ]; 创建一个int类型的数组,arr只是一个变量,只是数组的一 ...
- javascript基础05
javascript基础05 1.变量的作用域 变量既可以是全局,也可以是局部的. 全局变量:可以在脚本中的任何位置被引用,一旦你在某个脚本里声明了全局变量,你就可以 在这个脚本的任何位置(包括函数内 ...
- OpenGL利用模板测试实现不规则裁剪
本文是原创文章,如需转载,请注明文章出处 在游戏开发中,经常会有这样的需求:给定一张64x64的卡牌素材,要求只显示以图片中心为圆点.直径为64的圆形区域,这就要用到模板测试来进行不规则裁剪. 实现不 ...
- OpenGL ES 中的模板测试
模板测试的主要功能是丢弃一部分片元,相对于深度检测来说,模板测试提出的片元数量相对较少.模板测试发生在剪裁测试之后,深度测试之前. 使用模板测试时很重要的代码提示: 1.glClear( GL_STE ...
- freeRadius 基础配置及测试
国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html 内部邀请码:C8E245J (不写邀请码,没有现金送) 国 ...
- OpenGL-----深度测试,剪裁测试、Alpha测试和模板测试
片断测试其实就是测试每一个像素,只有通过测试的像素才会被绘制,没有通过测试的像素则不进行绘制.OpenGL提供了多种测试操作,利用这些操作可以实现一些特殊的效果.我们在前面的课程中,曾经提到了“深度测 ...
随机推荐
- 【深入理解Java集合框架】红黑树讲解(上)
来源:史上最清晰的红黑树讲解(上) - CarpenterLee 作者:CarpenterLee(转载已获得作者许可,如需转载请与原作者联系) 文中所有图片点击之后均可查看大图! 史上最清晰的红黑树讲 ...
- chrome扩展应用实例
chrome extensions 基本组成,唯一必要的文件就是manifest.json这个应用的配置清单 manifest.json中前三个参数为必要参数,其他的可选: { "name ...
- keras在win下的安装,使用等
http://cache.baiducontent.com/c?m=9d78d513d99a16ef4fece42d4c01d6160e2482744cd7c7637ac3e34a84652b5637 ...
- LINK : fatal error LNK1104: cannot open file .exe' 重开application Experience 服务即可
这是一个坑, , 答案五花八门这个解决了我的痛点. 就这样了.
- php源码学习——开篇
这个系列是对php源码的学习记录.由于本人水平有限,可能并不能写的非常清晰和深入,所以,可能只适合本人阅读:) 初次接触php源码,看到陌生的文件夹和大量的文件,可能会觉得茫然无措.php-inter ...
- vue Axios 封装与配置项
import axios from "axios"; import qs from "qs"; import { Message } from "el ...
- 13--Python入门--文件读写--CSV&Excel文件
EXCEL文件 import pandas as pd excel=pd.read_excel('read_excel.xlsx') print(excel) CSV文件 import pandas ...
- 在linux系统安装tomcat后,bin文件下startup.sh启动不
Linux里的tomcat下的 bin ,没法执行, 可直接到 bin 目录下 ,执行 chmod 777 * 就可以了. [srmdev@mvxl0793 bin]$ chmod 777 * ...
- 无法新建EXCLE
Regedit 进入注册表,找到HKEY_CLASSES_ROOT>.xls和.xlsx的ShellNew的值设置为:C:\Windows\ShellNew\EXCEL12.XLSX
- 使用try和catch捕获异常
Java程序在执行过程中如果出现异常,会自动生成一个异常对象,该异常对象将被自动提交给JVM,当JVM接收到异常对象时,会寻找能处理这一异常的代码,并把当前异常对象交给其处理,这一过程称为捕获(cat ...