我感觉将近一个月没有写技术文档了,最近了可能能在研究一些比较抽象计算机图形学,知识点太多,也过于零碎。我个人认为管线渲染流程当中三大测试是控制效果的一个关卡。这篇文章今天本来写了个开头,回到家看了题目,感觉有点太大,怕过于太长,就把管线渲染的三大测试分开写。按照流程来说,首先进行的应该是Alpha测试,但是由于Alpha测试,无论是在shader1.0还是shader2.0当中都过于简单,So,Alpha测试我决定就不写了,就从模板测试开始写。同时,前一段时间,老季向我展示了永航科技一个渲染需求,我想了一下,跟这个模板测试有关,主要是实现物体的遮罩、透视、剔除等效果的处理。
其实、天意就是如此,我小时候进过两次游戏机室,都被我爸爸打的很惨,知道大学我才开始接触游戏这个东西。一向好学生,开始研究游戏相关的领域。
当然,我还是才疏学浅,我之所以这么多废话,其实想说,我还是很喜欢研究这些东西的。此时12点,我很享受这样的北京夜晚,伴随着《Keeping score》这样一首high到爆的歌。
好了,High起来。
首先我们来谈一下什么是渲染管线中的模板测试。
Stencil与颜色缓冲区和深度缓冲区类似(我的下一篇Unity管线渲染中的三大测试之深度测试会进行介绍)。模板缓冲区可以为屏幕上的每个像素点保存一个无符号整数值(通常的话是个8位整数)。这个值的具体意义视程序的具体应用而定。
Stencil Test是Unity管线渲染中介于透明测试Alpha Test和深度测试Depth Test之间测试。目的是根据条件来比较设置的参考值referenceValue和模板缓冲区stencil buffer中对应的值stencil BuffValue的大小,如果条件满足就让片段fragment(候选的像素)进行更新并且进入下一个测试,即深度测试,条件不满足就过滤掉片段(不进行更新),不把对应材质的片段输出到屏幕当中。
条件判断公式:
ShaderLab中,stencil语法如下:
接下来,我会用案例进行实际演示模版测试的工作原理:
接下来的shader代码,我会逐条分析讲解,其实很简单。只是想讲明原理。
假设有一下场景
小球完全被遮挡,怎么通过让摄像机视线穿透Cube看到小球?
shader代码分析,第一个shader和第二个shader代码相似 我就逐条分析一个shader
第二个shader就是一般的shader只是在模版测试的条件和值上不一样
奇迹出现了:
睡觉
昨天这个例子我感觉还是不太好懂,觉得很垃圾的一个例子,我这里补充一个例子
其他的代码不在叙述,我们主要来看三个物体的referenceValue值是怎样设置的
Front:Sphere
Middle:Cube01
Back:Cube02
Gbuffer中的stencilBufferValue 被Front 的Sphere replace成了2 ,只有等于2才被显示出来。