1.引导
画家算法:
以一个画布为背景,从远到近画一个画面,先画最远的背景,也就是天空
然后假如是雪山,
然后再画上树木,树木在雪山上
然后山下是若干个居民的房屋,以及若干条道路
其次房屋门前可能有树木又当道部分房屋
其中某片区域一定会进行若干次上色,这样在Unity中是非常耗费性能的。
反画家算法:
所以Unity中出现反画家算法。
这个算法有两个辅助数组,以像素为单位,分别为深度缓冲数组和颜色缓冲数组假设为deep[][]和color[][],如果像素为1024*1024,那么这两个数组就是1024*1024大小
仍然拿上副画来看
假设某个像素点已经是最近的一个房子的某个点已经呈现出来的,它的坐标为(i,j),这个屏幕上的点对应的摄像机空间下的z值(实际上存储的是屏幕上该点对应裁剪坐标的z(是一个-1到0的值)的绝对值)就是deep[i][j] = d的值,然后这个房子该点的的颜色值就是color[i][j] = (r,g,b,a)的值。
当这个点的房子后面的树想呈现自己的信息时,它会先进行比较,发现这个点离摄像机距离d1 > d,那么Unity就不会渲染这个点的颜色,同样不会将这个点的颜色值写入color[i][j]中,那么在最终呈现出的区域内,后边被覆盖的区域就不会被重复上色了,这样就节省了性能
2.ZTest,深度检测
在渲染流程中,深度检测是放在逐片元操作(光栅化阶段后面的),但是如果光栅化完毕后,计算量(颜色的计算)已经产生,如果返现深度检测不通过,那么这些计算就白算了,因此在Unity中ZTest是在片元操作之前就进行了。
在Unity中ZTest的作用是这样的,初始时,deep的所有值为无穷远,color值为天空盒的颜色值。(其中假设红色和绿色的的渲染队列相同)现在在相机中间有一片255*255的红色正方形区域(中心为(0,0,2)),且它离摄像机的距离为2,离摄像机距离为3的地方有一个521*521(中心为(0,0,3))的绿色正方形。此时由于红色正方形离相机最近,那么deep[][](这片区域的深度值)就变成了2,且都呈现出红色,color[][](这片区域)就都是(r,0,0,a).然后渲染距离为3的正方形,再逐片元255*255区域的时候,Unity发现deep[][]这篇区域的值为2,是小于3要渲染的深度值的,此时直接放弃绿色这篇区域的渲染,但是在255到521区域会正常渲染绿色,且同时这篇区域的deep值为3,color值为绿色。最终呈现的颜色就是255内的区域呈现红色,255到521区域呈现绿色
3.ZWrite,深度写入
深度写入是在当深度检测通过后,可选的项目。
这里如果开启深度写入,deep[][]的值(更新)
如果关闭深度写入,拿上边的例子,假设关闭深度写入,红色在完成深度检测时,正常将自己的颜色写入,但是由于深度写入关闭了,此时deep这片区域的值仍然是无穷远,当绿色区域进行深度检测时仍然全部通过,此时真个521区域都会呈现绿色。
4.Blend,混合
这里混合的其实是现在的片元的颜色与color数组中的值,在2中的场景中,如果红色开启混合(默认),它会直接与天空盒的color值进行混合,而不是与绿色进行混合,因为在渲染红色时,绿色还没有渲染,缓存颜色仍然是天空盒的颜色,所以透明效果与天空盒颜色有关。
如果想呈现出红色透明出绿色,可以改变一下红色和绿色的渲染队列,也就是渲染顺序。在Unity中,可以在Tag中设置,它的值越小,越先被渲染。当我们将绿色的渲染队列值改为2000,红色改为2001时,这时就会先渲染绿色,然后渲染红色时,color缓存的时绿色的颜色值,就可以达到预期效果了
混合相关的常见操作:
Blend [_Src] OP [_Drc] 其中_Src现在的因子数,_Drc则是缓存的color因子数,而OP则是左右两个值的操作
One因子值为1,Zero因子值为0
SrcAlpha现在计算的透明度值(也就是A通道),DstAlpha缓存color中的透明度值
SrcColor与DstColor则是颜色值(是RGB通道)
OneMinusSrcColor是1-现在计算的颜色值,OneMinusDstColor则是缓存的color值
OneMinusSrcAlpha是1-现在的透明度值,OneMinusDstAlpha是缓存的透明度值
整个值的计算则是_Src * 当前的RGBA值,_Drc * 缓存color中的RGBA值
其中OP默认是Add,也就是两边的值相加
其中还有Sub,两个相减(S-D)
RevSub,反过来相减(D-S)
Min,取最小的Min(S,D)
Max,取最大的Max(S,D)
渲染队列相关:
BackGround(1000~2000)最早被渲染的物体队列
Geometry(2000~2450)不透明物体
AlphaTest(3000~4000)半透明物体
Overlay(4000~∞)最后渲染,一般用于UI渲染
其中值越小,越先被渲染文章来源:https://www.toymoban.com/news/detail-778453.html
深度测试相关:
Greater 大于缓冲区通过
Less 小于
GEqual 大于等于
LEqual 小于等于
Euqal 等于
NotEqual 不等于
Always 一直通过
Never 永远不通过
Off 关闭文章来源地址https://www.toymoban.com/news/detail-778453.html
到了这里,关于Unity Shader相关的ZTest,ZWrite,Blend的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!