在第四篇文章中,我们进行了高斯模糊原理讲解和实际操作,接下来我们会重点讲渲染管线中的三大测试,第一篇文章我讲述了写这些文章的初衷,我们还是首先把渲染管线全部流程总体的概括一遍,以Unity为例。然后在看秦大的书,进行有价值的点的解析。因为秦大的书讲的比较底层,也就说讲的比我现在写的还原理还底层。 回到刚才的话题,三大测试的顺序:Alpha、模板测试、深度测试。当然,这里涉及一些计算公式,我在这里会做详细的讲解。
首先我们从Alpha测试开始。
Alpha测试:符合条件的Alpha像素显示出来,不符合的去掉。
在Shader1.0当中我们需要打开AlphaTest通道,然后跟上限制条件,但是在Shader2.0当中,我们可以对于纹理进行直接采样了,所以Alpha值是可以直接得到的。我们在Fragment函数当中可以直接得到,并且进行处理或者叫约束。如下shader代码:
对比我们可以发现变化。我们不需要在Shader的代码中做任何其他处理,值进行Alpha的值的判断就好。
以上就是Vertex and Fragment Shader中对于Alpha值的处理
模板测试
模板测试:符合条件的通过,不符合条件的像素丢弃掉。
GBuffer中携带着RGBA、模板信息、深度信息等。
模板测试的比较函数和过程:
if(referenceValue & readMask comparisonFunction stencilBufferValue & readMask)
像素将进行怎样的操作
else
抛弃像素
referenceValue:当前的值
readMask:读遮罩
stencilBufferValue:GBuffer当中的值
Ref用来设定参考值referenceValue,这个值是用来和模板缓存中的stencilValue值进行比较的,referenceValue是一个取值范围为0--255的整数。
readMask:默认情况下值为255,其取值范围也是0-255,在默认情况下是(1111 1111),在&(与)运算情况下不对referenceValue以及stencilValue产生影响。
255也就是1111,1111与上任何,等于任何本身。
而Comparison 的取值为:Greater、GEqual、Less、LEqual、Equal、NotEqual、Always、Never
更新操作:
Pass:是定义当模板测试(和深度测试)通过时,根据(stencilOperation值)对模板缓冲值(stencilBufferValue值)进行处理,默认值是:keep
Fail:是定义当模板测试(和深度测试)失败时,根据(stencilOperation值)对模板缓冲值(stencilBufferValue值)进行处理,默认情况下是Keep
ZFail:定义当模板测试通过而深度测试失败时,则根据(stencilOperation值)对模板缓冲值(stencilBufferValue)进行处理,默认值是Keep
Keep:保持原来不变
Zero:让模板中的值变为0
Replace:设置的refValue的值替换掉stencilValue
IncrSat:自动增加1,一直到255,就不再改变
DecrSat:自动减少1,一直减少到0,就不再改变
Invert:模板缓存里面的值位取反
IncrWrap:自动增加,达到255了就变成0,循环
DecrWrap:自动减一,达到0,自动变成255,在开始,循环
我们来做一个墙面穿透的例子
场景如下
Shader代码批注如下:
Front:前面的小球,
中间的Cube:
最后面的Back的Cube