半透明渲染
半透明物体的特性是什么?
半透明物体需要显示被它遮挡的的物体。
ok……场景中物体大致就分为半透物体和不透明物体,我们会分别讨论不透明物体与不透明物体,半透明与不透明物体,半透明物体与半透物体之间的渲染关系。
先来几个概念开胃
在shader中,我们可以设置渲染类型,设置渲染队列值,渲染队列值表示该物体的绘制顺序。
引擎在渲染时有一个规则,所有半透明物体会在所有透明物体绘制完成之后绘制。所以引擎会自动给场景物体排序,保证这条原则正确执行。
明确这个之后,需要再回顾渲染管线逐片元处理阶段流程: 模板测试--》alpha测试--》深度测试--》合并图元
渲染队列(RenderQueue):控制绘制顺序,
深度测试 ( ZTest):处理遮挡关系,
深度写入 ( Zwrite):控制通过深度测试的像素写入深度缓冲,
混合(blend):控制通过测试的图元和缓冲中的图元是否进行混合。
深度测试保证了被不透明物体遮挡的物体不会被渲染,不透明物体通常会关闭深度写入(zwrite_off),开启混合(blend on)操作。
为什么要关闭深度写入?
假设两面玻璃,正常情况下 我们可以透过前面的玻璃看到后面的玻璃,但是开启深度写入的话,在绘制两面玻璃的时候会将图元写入深度缓冲,那么在绘制第二面玻璃的时候,通过深度测试的图元会直接覆盖第一面镜子的渲染结果,这时候渲染的结果就是我们不能通过前面的玻璃看到后面的玻璃,因此渲染半透明物体时,需要关闭深度写入。
为什么要开启混合呢?
就像前边说的,我们不能直接用第二面玻璃的渲染值覆盖第一面玻璃的渲染值,因此开启混合操作后,通过深度测试的图元会与颜色缓存中的值进行混合,这时候我们渲染的结果就是通过前边的玻璃 我们可以看到后边的玻璃。
总结一下:
渲染队 列解决了不透明物体和透明物体之间的渲染关系
深度测试 保证了被不透明物体遮挡的透明物体不被渲染
关闭深度写入 保证了不透明物体之间不会因为深度测试而剔除
混合操作 保证了不透明物体之间的正常渲染,我们可以透过玻璃看到另外一玻璃。