1.1 深度缓冲(Depth buffer)
- Projection :3D → 2D : (x,y,z) → (wx,wy),投影后也存在一个z值,为(wx,wy,wz);
- 在投影时,每个投影点的深度也会被记录下来,写入深度缓冲;
- 在光栅化时,每个片元的深度会被计算出来,写入深度缓冲区;
1.2 视域空间中的深度范围
- 透视投影后深度的坐标范围是 [0,1],其深度分布不均匀;
- 距离视点越近,精度越大,越远精度越小;
1.3 消隐的方法
- Depth Sorting Method(深度排序算法);
- Area-Subdivision Method(区域子分算法);
- Ray Casting Method(光线投射法);
- Z-Buffer算法
在把显示对象的每个面上的每一点的颜色值填入帧缓冲器相应单元前,要把这个点的深度值与Z-Buffer中的相应单元的值进行比较。只有前者小于后者时才能改变帧缓冲器的那一个单元的值,同时Z-buffer中相应的单元的值也要改变成这点的深度值;否则帧缓冲器相应的单元的值不变。
1.4 OpenGL中深度缓冲的函数
glEnable(GL_DEPTH_TEST);
- 会进行深度比较,并且根据当前绘制内容更新depth buffer;
void glDepthFunc(GLenum func);
- 深度比较的方式:func的值为:GL_NEVER、GL_LESS、GL_LEQUAL、GL_EQUAL、GL_GREATER、GL_NOTEQUAL、GL_GEQUAL、GL_ALWAYS;
void glDepthMask(GLboolean flag);
- 设置是否更新深度缓冲;
glDisable(GL_DEPTH_TEST);
- 深度比较和更新深度缓冲这两个动作都不会发生;
当只想做深度比较,但不更新深度缓冲,则:
glEnable(GL_DEPTH_TEST);
glDepthMask(false);
在背景不变,前景变化的场景中,可以高效率的进行绘制,分为背景的预绘制,以及前景的实时绘制。
OpenGL 默认值为:
glDisable(GL_DEPTH_TEST);
glDepthMask(false);
glDepthFunc(GL_LESS);
只做深度比较,不更新深度缓冲,则:
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_ALWAYS);
glDepthMask(true);