透明混合渲染顺序机制

一、首先来说一下计算机如果解决可见性问题:

两个步骤:1.深度测试。2.深度写入。两个步骤都可控制是否开启、关闭。

在一个片元A进行渲染的时候,首先进行深度测试,用A的深度值Za与深度缓冲中的深度值Zz进行比较,如果Za > Zz说明A离摄像机更远,则A的颜色值和深度值不会写入到颜色缓冲和深度缓冲中。

以上是物体A开启了深度测试和深度写入的情况下的工作流程,如果要实现透明效果,则复杂了,因为透明度混合关闭了深度写入。

二、为什么进行透明度混合时半透明物体需要关闭深度写入?

假设半透明物体A开启深度写入,在进行深度测试时,与深度缓冲中不透明物体B深度值相比,离摄像机更近,会直接把A的深度值覆盖掉B的,颜色值也会覆盖掉,B会看不到。重点:开启深度写入,会覆盖掉颜色值,毫无保留

三、半透明物体A关闭深度写入之后,不同的渲染顺序就会导致不同结果。

(一)假设半透明物体A在不透明B的前面,A距离摄像机更近。

1)如果先渲染A,此时深度缓冲和颜色缓冲中都没有值,A不会写入到深度缓冲中,颜色值会写入到颜色缓冲中。再渲染B,深度测试此时深度缓冲中没有值,B的深度写入到深度缓冲中,直接覆盖掉A的颜色,导致看不到A,只能看到B。

2)如果先渲染B,B的深度值、颜色值写入深度缓冲、颜色缓冲,A进行深度测试,深度值比深度缓冲里深度值小,距离摄像机更近,会用A的透明度跟颜色缓冲中的颜色值进行混合。

(二)假设两个半透明物体A跟B,A在B前面,距离摄像机更近:

1)如果先渲染A,此时深度缓冲和颜色缓冲中都没有值,A不会写入到深度缓冲中,颜色值会写入到颜色缓冲中,B进行深度测试,但是此时深度缓冲中没有值,而颜色缓冲中有颜色值,那么B就会和A进行混合,看起来B在A前面,得到错误结果。

2)如果先渲染B,此时深度缓冲和颜色缓冲中都没有值,B不会写入到深度缓冲中,颜色值会写入到颜色缓冲中,A进行深度测试,但是此时深度缓冲中没有值,而颜色缓冲中有颜色值,那么A就会和B进行混合,看起来A在B前面,结果正确。

注意:在颜色缓冲区里没有颜色值得时候,即使是半透明物体也会写入进去,因为没有颜色跟这个半透明物体混合。如果颜色缓冲区里面有颜色值,并且进行深度测试时半透明物体离摄像机更近,那么会透明混合。

猜你喜欢

转载自blog.csdn.net/younne0915/article/details/83624017