Unity中的计算机图形学(四)---三大测试基础

      在第四篇文章中,我们进行了高斯模糊原理讲解和实际操作,接下来我们会重点讲渲染管线中的三大测试,第一篇文章我讲述了写这些文章的初衷,我们还是首先把渲染管线全部流程总体的概括一遍,以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

猜你喜欢

转载自blog.csdn.net/qq_38651460/article/details/80949690
今日推荐