模板测试的一些基本原理和能够做什么
主要讲解模板测试也就是RTR中所讲的Stencil buffer技术了。
模板测试,说道模板测试就要说道模板缓冲区。模板缓冲区与颜色缓冲区和深度缓冲区类似,会分配一个内存空间对fragment进行测试。
MinionsArt使用模板测试实现的一些效果
对MinionsArt的效果进行分析:MinionsArt的作品分为三层,一层原图,一层改变的图,还有一层进行mask的图层。
应用模板测试的经典独立游戏:笼中窥梦。
模板测试的内容
在介绍模板测试的内容之前,先复习一遍渲染管线。
我们从渲染管线出发,对渲染管线进行简单复习。
渲染管线的简单总结:应用数据阶段–>几何变换–>光栅化阶段–>逐片元操作
其中模板测试是位于光栅化的fragment shader之后的逐片元操作阶段中。
逐片元操作流程
首先逐片元操作的输入是经过光栅化后的fragment,他的输出是存储到framebuffer中准备渲染到屏幕上的像素。
输入fragment后,
第一步:Pixel Ownership Test。这一步是分配屏幕像素的使用权限。是设置屏幕上的哪一部分来显示计算结果,这就是为什么Unity中只在game/scene场中显示结果。
第二步:裁剪测试。是规定了你所使用的窗口后,你又要对window内的某一部分进行裁剪。比如对上边的这张图片,你可以控制只在这个窗口的坐上或者右下进行渲染。
第三步:透明度测试。透明度测试是设置了一个阈值,这个阈值控制了透明度的限制规则。比如说alpha的通道为0.5,那么alpha的值小于0.5的fragment就无法通过测试。基于这个简单的比较,他只能实现全透明或者全不透明效果,半透明效果需要在透明度混合中实现(以下是Unity入门简要中简单的透明度测试应用)
第四步:模板测试,从伪代码逻辑上来理解模板测试。
if(referenceValue & readMask comparisonFunction stencilBufferValue&readMask)
通过像素
else
舍去像素
//referenceValue是当前模板缓冲中的一个参考值,他会和readMask进行一个与操作。