半透明渲染

发表于2018-01-23
评论2 3.5k浏览

半透明物体的特性是什么?

半透明物体需要显示被它遮挡的的物体。

ok……场景中物体大致就分为半透物体和不透明物体,我们会分别讨论不透明物体与不透明物体,半透明与不透明物体,半透明物体与半透物体之间的渲染关系。

先来几个概念开胃

在shader中,我们可以设置渲染类型,设置渲染队列值,渲染队列值表示该物体的绘制顺序。

引擎在渲染时有一个规则,所有半透明物体会在所有透明物体绘制完成之后绘制。所以引擎会自动给场景物体排序,保证这条原则正确执行。

明确这个之后,需要再回顾渲染管线逐片元处理阶段流程:  模板测试--》alpha测试--》深度测试--》合并图元 


渲染队列(RenderQueue):控制绘制顺序,

深度测试 ( ZTest):处理遮挡关系,

深度写入 ( Zwrite):控制通过深度测试的像素写入深度缓冲,

混合(blend):控制通过测试的图元和缓冲中的图元是否进行混合。


深度测试保证了被不透明物体遮挡的物体不会被渲染,不透明物体通常会关闭深度写入(zwrite_off),开启混合(blend on)操作。


为什么要关闭深度写入?

假设两面玻璃,正常情况下 我们可以透过前面的玻璃看到后面的玻璃,但是开启深度写入的话,在绘制两面玻璃的时候会将图元写入深度缓冲,那么在绘制第二面玻璃的时候,通过深度测试的图元会直接覆盖第一面镜子的渲染结果,这时候渲染的结果就是我们不能通过前面的玻璃看到后面的玻璃,因此渲染半透明物体时,需要关闭深度写入。


为什么要开启混合呢?

就像前边说的,我们不能直接用第二面玻璃的渲染值覆盖第一面玻璃的渲染值,因此开启混合操作后,通过深度测试的图元会与颜色缓存中的值进行混合,这时候我们渲染的结果就是通过前边的玻璃 我们可以看到后边的玻璃。


总结一下:

渲染队     列解决了不透明物体和透明物体之间的渲染关系

深度测试    保证了被不透明物体遮挡的透明物体不被渲染

关闭深度写入    保证了不透明物体之间不会因为深度测试而剔除

混合操作   保证了不透明物体之间的正常渲染,我们可以透过玻璃看到另外一玻璃。

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引