- 资料 - 源视频 - 【技术美术百人计划】图形 3.1 深度与模板测试 传送门效果示例_哔哩哔哩_bilibili
 
 - ppt - 3100-模板测试与深度测试(1)
 
 - 参考 - Unity Shader: 理解Stencil buffer并将它用于一些实战案例(描边,多边形填充,反射区域限定,阴影体shadow volume阴影渲染)_unity stencil buffer-CSDN博客
 - 3.1 模板测试和深度测试 · 语雀
 
 - MayoHa Wu - 知乎
 
- 源视频 
- stencil test 模板测试 - 引入 
-  
 - 应用 - 游戏 笼中窥梦 
-  
 - 传送门效果 
-  
 - Minions大佬的作品 - https://www.patreon.com/posts/14832618
 
 
- 游戏 笼中窥梦 
 - 是什么 - 从渲染管线理解 - 下图为从片元着色器到FrameBuffer的流程(逐片元操作) 
-  
 - 逐片元操作流程: - 不可编辑,但高度可配置 - 由管线/硬件自身规定好的,我们只能对里边的内容进行配置。
 
 -   - 像素所有权测试→裁剪测试→透明度测试→模板测试→深度测试→透明度混合 - PixelOwnershipTest: - 简单来说就是控制当前屏幕像素的使用权限
 - e.g.:游戏引擎仅渲染游戏窗口
 
 - ScissorTest(裁剪测试): - 在渲染窗口再定义要渲染哪一部分
 - 和裁剪空间一起理解,也就是只渲染能看到的部分
 - e.g.只渲染窗口的左下角部分
 
 - AlphaTest(透明度测试) - 提前设置一个透明度域值
 - 只能实现不透明效果和全透明效果
 - e.g. 设置透明度a为0.5,如果片元大于这个值就通过测试,如果小于0.5就剔除掉
 
 - StencilTest(模板测试)
 - DepthTest(深度测试)
 - Blending(透明度混合) - 可以实现半透明效果
 
 
- PixelOwnershipTest: 
 - 完成接下来的其他一系列操作后,我们会将合格的片元/像素输出到帧缓冲区(FrameBuffer)
 
- 像素所有权测试→裁剪测试→透明度测试→模板测试→深度测试→透明度混合 
 
- 不可编辑,但高度可配置 
 
- 下图为从片元着色器到FrameBuffer的流程(逐片元操作) 
 - 从逻辑上理解 -   - 理解: - referenceValue:当前模板缓冲片元的参考值
 - stencilBufferValue:模板缓冲区里的值
 - 中间的comparisonFunction,就是做一个比较
 
 - 结果: - 如果通过,这个片元就进入下一个阶段
 - 未通过/抛弃,停止并且不会进入下一个阶段,也就是说不会进入颜色缓冲区
 
 - 总结:通过一定条件来判断这个片元/片元属性执行保留还是抛弃的操作
 
- 理解: 
 
-  
 - 从概念上理解
 - 模板缓冲区-FrameBuffer - 模板缓冲区可以为屏幕上的每一个像素点保存一个无符号整数值(通常为8位int 0-255)。
 - 这个值的意义根据程序的具体应用而定。
 
 - 模板测试 - 渲染过程中,可以用这个值与预先设定好的参考值作(ReferenceValue)比较,根据结果来决定是否更新相应的像素点的颜色值。
 - 如果模板测试通过,相应的像素点更新,否则不更新。
 - 这个比较的过程就称为模板测试。
 
 
- 从渲染管线理解 
 - 怎么用 - 语法表示/结构解释 -   - Ref:当前片元的参考值(0-255) - reference valve
 
 - ReadMask:读掩码 - BitMask - 掩码(BitMask)是一种用于修改或检查数据位(Bit)的简单且高效的技术。通过与特定的二进制数字进行位运算(如AND、OR、XOR等),掩码可以轻松地设置、清除或翻转数据中的特定位。
 - 核心概念 - 设置位(Set Bit): 通过OR运算来设置特定的位。
 - 清除位(Clear Bit): 通过AND和NOT运算来清除特定的位。
 - 翻转位(Toggle Bit): 通过XOR运算来翻转特定的位。
 
 - 应用场景 - 数据压缩 - 在数据压缩中,掩码能够有效地对数据进行编码和解码,从而减小数据的体积。
 
 - 权限控制 - 掩码可以用于精细的权限控制系统,通过设置不同的位来代表不同的权限。
 
 - 网络编程 - 在网络编程中,掩码常用于子网划分和IP地址的过滤。
 
 
- 数据压缩 
 
 
- BitMask 
 - WriteMask:写掩码
 - Comp:比较操作函数 - comparison function 
-  
 
- comparison function 
 - Pass:测试通过,之后进行操作(StencilOperation)
 - Fail:测试未通过,也会进行一个操作
 - ZFail:模板测试通过,深度测试未通过
 - stencil 10 peration 更新操作 
-  
 
- Ref:当前片元的参考值(0-255) 
 
-  
 - unity - 实例1 - shader - 蒙版stencilmask.shader - 物体为plane(平面)
 -   - 只有一个int类型的属性,作为蒙版的ID
 - tags标签 - 渲染类型为不透明物体,队列为Geometry+1(默认的不透明物体后进行蒙版的渲染)
 - 补充 - Unity 图形学shader之tags设置(七)_unity shader tags-CSDN博客
 - 渲染顺序 - Queue 标签 - 定义 - 渲染队列,指定对象什么时候渲染,每个队列其实都是利用一个整数进行索引的。
 - 用来确定对象的绘制顺序。着色器决定其对象属于哪个渲染队列。有四个预定义的渲染队列,但预定义的渲染队列之间可以有更多的队列。
 
 - 队列 - 预定义队列包括: - 1.1.1 Background - 在其他渲染队列之前渲染。通常会对需要处于背景中的对象使用此渲染队列。
 - 1.1.2 Geometry(默认值)-通常用于不透明对象,比如场景中的物件与角色等。
 - 1.1.3 AlphaTest - 进行 Alpha 测试的几何体将使用此队列,要么完全透明要么完全不透明,多用于利用贴图来实现边缘透明的效果,也就是 美术常说的透贴。在绘制完所有实体对象之后再渲染经过 Alpha 测试的对象会更有效。
 - 1.1.4 Transparent - 此渲染队列在 Geometry 和 AlphaTest 之后渲染,按照从后到前的顺序。任何经过 Alpha 混合者(即不写入深度缓冲区的着色器)都应该放在这里(玻璃、粒子效果)。常用于半透明对象,建议需要混合的对象放入此队列。
 - 1.1.5 Overlay -此渲染队列用于叠加效果。最后渲染的东西应该放在这里(例如镜头光晕等)
 - 在内部,每个队列由整数索引表示;Background是 1000,Geometry是 2000,AlphaTest是 2450,Transparent是 3000,Overlay是 4000。
 
 - 预定渲染序列之外的其他序列,例: - 以通过在值后加数字的形式来进行重新指定渲染队列
 - Tags { “Queue” = “Geometry+1” } - 注意:“Geometry+1” 不可以有空格。
 - 索引值为2001 的队列这将使对象在所有不透明对象之后渲染,但在透明对象之前渲染。例如透明的水应该在不透明对象之后绘制,但又要在透明对象之前绘制。
 - 索引值高达 2500 的队列(“Geometry+500”)视为“不透明”,并且会优化对象的绘制顺序以获得最佳性能。 较高索引的渲染队列被认为是“透明对象”并按距离将对象进行排序,从距离最远的对象开始渲染,最后渲染距离最近的对象。天空盒在所有不透明对象和所有透明对象之间绘制。
 
 
 
- 预定义队列包括: 
 - Queue渲染队列小结: 渲染队列直接影响性能中的重复绘制,合理的队列可极大的提升渲染效率。在Unity中,渲染队列小于2500的对象都被认为是不透明的物体,(如“Background”,“Geometry”,“AlphaTest”),这些物体是从前往后绘制的,而使用其他的队列(如“Transparent”,“Overlay”)的物体则是从后往前绘制的。这意味着,我们需要尽可能地把物体的队列设置为不透明物体的渲染队列,而尽量避免重复绘制。
 
- 定义 
 
 
 - ColorMask - 颜色遮罩,0就是什么都不输出(是高度可配置的,可以改为RGBA(没有遮罩)、输出单通道R、G、 B)
 - 单纯作为蒙版遮罩使用
 
 - ZWrite off - 关闭深度写入,防止显示的东西被深度剔除
 
 - Stencil模板测试部分 - Ref [_ID] 索引值(参考值)=预制件中输入的int值
 - Comp always 默认比较
 - Pass replace 蒙版区域全部重置为1,其他为0
 - Fail、ZFail,不写的话都是默认值
 
 
 
 - 物体ToonLitStencilMasked.shader -   - 除了自身的属性之外,同样给了一个ID
 
 -   - tags标签 - 渲染类型为不透明物体,队列为Geometry+2(前边蒙版后渲染)
 
 - Stencil/模板测试部分: - Ref [_ID]
 - Comp equal ,当给定的索引值和当前模板缓冲区的值相等时,才会渲染这个片元 。物体的mask id=蒙版的mask id时,物体才被渲染。
 
 
- tags标签 
 
-  
 
- 蒙版stencilmask.shader 
 
-  
 - 实例2 - shader - 蒙版 -   - 属性中使用了一个内置的枚举,这样就可以在外边自己选择可配置的属性了 
-  
 - 总结:一个蒙版对应一个物体,他们使用相同的ID(ID依次为1、2、3、4),出来的效果就是:每个面显示的盒子内部物理不同
 
- 属性中使用了一个内置的枚举,这样就可以在外边自己选择可配置的属性了 
 
-  
 
- 蒙版 
 
-  
 
- 实例1 
 
- 语法表示/结构解释 
 - 总结 - 最重要(用来比较的)两个值 - 当前模板缓冲区值(StencilBufferValue)
 - 模板参考值(ReferenceValue)
 
 - 模板测试的内容 - 主要就是对这两个值进行特定的比较操作,例如Never、Always、Equal等,具体参考上文的表格
 
 - 模板测试后 - 要对模板缓冲区的值进行更新操作,例如Keep,Replace等,具体参考上文表格
 - 更新操作:可以根据不同的结果对模板缓冲区做不同的更新操作,例如模板测试成功的操作Pass、模板测试失败的操作Fail、深度测试失败的操作ZFail、还有正对正面和背面更新操作Passback,Passfront,Failback等
 
 
- 最重要(用来比较的)两个值 
 - 拓展 - 掌握模板测试的核心思想,利用模板测试的特性同其他测试或图形算法结合使用 - 描边 
-  
 - 多边形填充 
-  
 - 反射区域控制 
-  
 - shadow volume阴影渲染 
-  
 
- 描边 
 - 参考资料 - 官方文档:Unity - Manual: ShaderLab command: Stencil
 - UnityShader实例09:Stencil Buffer&Stencil Test_unity shader 螺丝孔-CSDN博客
 - Unity Shader: 理解Stencil buffer并将它用于一些实战案例(描边,多边形填充,反射区域限定,阴影体shadow volume阴影渲染)_unity stencil buffer-CSDN博客
 - Unity3D Stencil Test模板测试详解-腾讯游戏学堂
 - 模板测试 - LearnOpenGL-CN
 - https://www.patreon.com/posts/14832618
 - https://www.udemy.com/course/unity-shaders/
 
 
- 掌握模板测试的核心思想,利用模板测试的特性同其他测试或图形算法结合使用 
 
- 引入 

















