一个不透明或半透明物体的显示状态应该怎样确定?
一般在画画的时候:
首先将场景的多边形根据深度进行排序,然后按照顺序进行绘制
但是如果有半透明的东西呢?他们之间相互混合,也十分复杂
为了解决这些问题,计算机咋整呢?
深度缓冲区(Depth Buffer)
记录像素的深度信息,存储像素到摄像机的深度
每一帧开始前,深度缓冲区都会被清空。
当需要渲染新的像素时,像素的深度会预先被计算出来,比较这个像素的深度值与缓冲区中的值
通过算法判断是否要通过该像素,或需要在深度缓冲区中写入该像素的深度
在场景没有透明物体的情况下,我们可以按照缓冲区比较,无需对场景中的物体进行排序,也避免了重复绘制
既能解决重叠的问题,又可以带来性能的提升
但是有透明物体咋整呢?
如果透明物体A在不透明物体B前面,A离摄像机距离一定B更近
如果A写入了深度值,B就不会被绘制,自然也看不到半透明效果
引进了渲染队列的概念。
啥玩意是渲染队列?
也是按深度缓冲,但将不透明与半透明的物体分开
先渲染不透明的物体,对比起深度值,并将其深度值写入缓冲
然后再渲染半透明物体,只对比深度值,不写入缓冲(半透明物体之间使用深度值)
Unity中的预定义渲染队列(队列索引号越小,越早被渲染)
渲染队列-----------------渲染队列索引
Background------------------1000 (skybox已经不在这里了)
Geometry---------------------2000
AlphaTest---------------------2450
Transparent------------------3000
Overlay------------------------4000
Shader "my/test"
{
SubShader
{
Tags { "Queue" = "Geometry"}
}
}
使用渲染队列后也会有一些问题
如果相互穿插,就没有办法得到正确的排序,进而得到错误的颜色值
解决方法:
1.拆分或优化模型的形状,降低穿插
2.调整混合参数,看起来不那么明显
3.预先深度Pass(Pre Depth Pass)方法(有额外drawcall)