OpenGL ES 中 Depth Buffer 保存了像素與觀測點之間的距離信息,在繪制3D圖形時,將只繪制可見的面而不去繪制隱藏的面,這個過程叫”Hidden surface removal” ,采用的算法為”The depth buffer algorithm”。
一般來說,填充的物體的順序和其順序是一致的,而要準確的顯示繪制物體在Z軸的前后關系,就需要先繪制距離觀測點(ViewPoint)最遠的物體,再繪制離觀測點較遠的物體,最后繪制離觀測點最近的物體,因此需要對應所繪制物體進行排序。OpenGL ES 中使用 Depth Buffer 存放需繪制物體的相對距離。
http://wiki.jikexueyuan.com/project/opengl-es-guide/images/93.png" alt="" />
The depth buffer algorithm 在 OpenGL ES 3D 繪制的過程中這個算法是自動被采用的,但是了解這個算法有助于理解 OpenGL ES 部分 API 的使用。
這個算法的基本步驟如下:
- 將 Depth Buffer 中的值使用最大值清空整個 Depth Buffer,這個最大值缺省為1.0 ,為距離 viewPoint 最遠的裁剪的距離。最小值為 0,表示距離 viewPoint 最近的裁剪面的距離。距離大小為相對值而非實際距離,這個值越大表示與 Viewpoint 之間的距離越大。因此將初值這設為 1.0 相當于清空 Depth Buffer。
- 當 OpenGL 柵格化所繪制基本圖形(Primitive),將計算該 Primitive 與 viewpoint 之間的距離,保存在 Depth Buffer 中。
- 然后比較所要繪制的圖形的距離和當前 Depth Buffer 中的值,如果這個距離比 Depth Buffer 中的值小,表示這個物體離 viewPoint 較近,Open GL 則更像相應的 Color Buffer 并使用這個距離更新 Depth Buffer,否則,表示當前要繪制的圖形在已繪制的部分物體后面,則無需繪制該圖形(刪除)。
這個過程也稱為”Depth Test” (深度測試)。
下面給出了 OpenGL ES 中與 Depth Buffer 相關的幾個方法:
- gl.Clear(GL10.GL_DEPTH_BUFFER_BIT) 清空 Depth Buffer (賦值為 1.0)通常清空 Depth Buffer 和 Color Buffer 同時進行。
- gl.glClearDepthf(float depth) 指定清空 Depth Buffer 是使用的值,缺省為 1.0,通常無需改變這個值,
- gl.glEnable(GL10.GL_DEPTH_TEST) 打開 depth Test
- gl.glDisable(GL10.GL_DEPTH_TEST) 關閉 depth Test