【Unity——模板测试Stencil】

什么是模板测试,可以实现什么效果?

●用模板测试来实现限制渲染区域

在这里插入图片描述
●使立方体的不同区域显示不同的画面
图片来自:TA入门笔记(十五)
在这里插入图片描述
在这里插入图片描述

模板测试的知识点

●顺序

透明度测试->模板测试->深度测试
在这里插入图片描述

●简单原理

图片来自:LearnOpenGL——模板测试
在这里插入图片描述
以文章开头第一张图为例,透明片元的作用是更新模板缓冲区的值,使模板缓冲区的值为1
后边人物(类比上图中的立方体片元,地板片元)的模板值被设置成了1并且使用了“等于”的判断条件(当模板值等于深度缓冲值时通过测试,渲染时保留片元)
那么在模板测试时,由透明片元决定更新哪一部分的模板缓冲区的值为1,使这一部分区域模板值为1的片元得以渲染出来在这里插入图片描述
考虑物体之间的渲染顺序问题
如果场景中用于更新模板缓冲的透明片元在物体之后渲染,物体所有的片元都会因为无法通过模板测试而无法被渲染。所以在实现中需要调整物体的渲染队列,使该透明片元先于物体进行渲染。

●简单实现细节

在Shader中完整的Stencil语法

Stencil
{
    
    
    Ref referenceValue 		//当前材质的模板值
    ReadMask  readMask  
    WriteMask writeMask  
    Comp comparisonFunction 	//模板缓冲区的值与当前材质模板值的判断条件
    Pass stencilOperation 		//当模板测试通过时如何处理模板缓冲区的值
    Fail stencilOperation  
    ZFail stencilOperation
}

实际上为了实现简单的效果我们只需要用到其中的三个

Stencil
{
    
    
 	Ref 	//设置当前材质的模板值,默认值是0
 	Comp 	//默认值是always,模板测试总是通过,渲染像素
 	Pass 	//默认值是Keep,不更改深度缓冲的值
}

首先,模板缓冲区的默认值是0
在默认情况下,不对Stencil进行手动设置时,所有的片元均由Comp always通过了模板测试,由Pass Keep均不对模板缓冲区进行更改

为了实现限制渲染区域的效果
在这里插入图片描述

●模仿效果

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/m0_62316271/article/details/128563110
今日推荐