> 文章列表 > 透明与不透明物体共存

透明与不透明物体共存

透明与不透明物体共存

操作步骤:

1.开启隐藏面消除功能

gl.enable(gl.DEPTH_TEST)

2.绘制所有不透明的物体(alpha 为1.0)

3.锁定用于进行隐藏面消除的深度缓冲区的写入操作,使之只读。

gl.depthMask(flase)

4.绘制所有半透明的物体(alpha小于1.0),注意它们应当按照深度排序,然后从后向前绘制

5.释放深度缓冲区,使之可读可写。

gl.depthMask(true)

隐藏面消除原理:

深度缓冲区存储了每个像素的z坐标值(归一化为0.0到1.0之间)。假设场景中有两个前后重叠的三角形A和B。首先,在绘制三角形Ade时候,将它的每个片元的z值写入深度缓冲区,然后在绘制三角形B的时候,将B中与A重叠的片元和深度缓冲区中对应像素的z值作比较:

如果深度缓冲区中的z值小,就说明三角形A在前面,那么B的这个片元就被舍弃了,不会写入颜色缓冲区;

如果深度缓冲区的z值大,就说明三角形B在前面,就把B的这个片元写入颜色缓冲区中,将之前A的颜色覆盖掉。

这样,当绘制完成时,颜色缓冲区中的所有像素都是最前面的片元,而且每个像素的z值都存储在深度缓冲区中。这就是隐藏面消除的原理。

注意,所有这些操作都是在片元层面上进行的,所以如果两个面相交,也可以正常显示。

透明与不透明共存原理

当我们按照上述步骤同时绘制透明和不透明物体时,在第一步和第二步结束后,所有不透明的物体都正确地绘制在了颜色缓冲区中,深度缓冲区记录了每个像素(最前面的片元)的深度。

然后在进行第3、4和5步,绘制所有半透明的物体。由于深度缓冲区的存在,不透明物体后面的物体,即使半透明的也不会显示,这是因为深度缓冲区的写操作被锁定了,所以在绘制不透明物体前面的透明物体时,也不会更新深度缓冲区。