鍍金池/ 教程/ Android/ Depth Buffer
繪制線段 Line Segment
投影變換 Projection
繪制迷你太陽系
繪制一個(gè)球體
繪制三角形 Triangle
OpenGL 光照模型
三維坐標(biāo)系及坐標(biāo)變換初步
定義 3D 模型的前面和后面
繪制一個(gè) 20 面體
顏色 Color
Depth Buffer
材質(zhì)及光照示例
基本幾何圖形定義
關(guān)于EGL
導(dǎo)言
Viewing 和 Modeling(MODELVIEW) 變換
FrameBuffer
設(shè)置光照效果 Set Lighting
Viewport 變換
階段小結(jié)
繪制點(diǎn) Point
OpenGL ES API 命名習(xí)慣
通用的矩陣變換指令
關(guān)于 OpenGL ES
創(chuàng)建實(shí)例應(yīng)用 OpenGLDemos 程序框架
OpenGL ES 管道(Pipeline)
GLSurfaceView

Depth Buffer

OpenGL ES 中 Depth Buffer 保存了像素與觀測(cè)點(diǎn)之間的距離信息,在繪制3D圖形時(shí),將只繪制可見的面而不去繪制隱藏的面,這個(gè)過程叫”Hidden surface removal” ,采用的算法為”The depth buffer algorithm”。

一般來說,填充的物體的順序和其順序是一致的,而要準(zhǔn)確的顯示繪制物體在Z軸的前后關(guān)系,就需要先繪制距離觀測(cè)點(diǎn)(ViewPoint)最遠(yuǎn)的物體,再繪制離觀測(cè)點(diǎn)較遠(yuǎn)的物體,最后繪制離觀測(cè)點(diǎn)最近的物體,因此需要對(duì)應(yīng)所繪制物體進(jìn)行排序。OpenGL ES 中使用 Depth Buffer 存放需繪制物體的相對(duì)距離。

http://wiki.jikexueyuan.com/project/opengl-es-guide/images/93.png" alt="" />

The depth buffer algorithm 在 OpenGL ES 3D 繪制的過程中這個(gè)算法是自動(dòng)被采用的,但是了解這個(gè)算法有助于理解 OpenGL ES 部分 API 的使用。

這個(gè)算法的基本步驟如下:

  1. 將 Depth Buffer 中的值使用最大值清空整個(gè) Depth Buffer,這個(gè)最大值缺省為1.0 ,為距離 viewPoint 最遠(yuǎn)的裁剪的距離。最小值為 0,表示距離 viewPoint 最近的裁剪面的距離。距離大小為相對(duì)值而非實(shí)際距離,這個(gè)值越大表示與 Viewpoint 之間的距離越大。因此將初值這設(shè)為 1.0 相當(dāng)于清空 Depth Buffer。
  2. 當(dāng) OpenGL 柵格化所繪制基本圖形(Primitive),將計(jì)算該 Primitive 與 viewpoint 之間的距離,保存在 Depth Buffer 中。
  3. 然后比較所要繪制的圖形的距離和當(dāng)前 Depth Buffer 中的值,如果這個(gè)距離比 Depth Buffer 中的值小,表示這個(gè)物體離 viewPoint 較近,Open GL 則更像相應(yīng)的 Color Buffer 并使用這個(gè)距離更新 Depth Buffer,否則,表示當(dāng)前要繪制的圖形在已繪制的部分物體后面,則無需繪制該圖形(刪除)。

這個(gè)過程也稱為”Depth Test” (深度測(cè)試)。

下面給出了 OpenGL ES 中與 Depth Buffer 相關(guān)的幾個(gè)方法:

  • gl.Clear(GL10.GL_DEPTH_BUFFER_BIT) 清空 Depth Buffer (賦值為 1.0)通常清空 Depth Buffer 和 Color Buffer 同時(shí)進(jìn)行。
  • gl.glClearDepthf(float depth) 指定清空 Depth Buffer 是使用的值,缺省為 1.0,通常無需改變這個(gè)值,
  • gl.glEnable(GL10.GL_DEPTH_TEST) 打開 depth Test
  • gl.glDisable(GL10.GL_DEPTH_TEST) 關(guān)閉 depth Test