學習目標:
- 明白可見表面檢測的目的
- 知道back-face detection 背面剔除方法
- 知道深度緩衝(z-buffer)方法
- 知道光線追蹤(ray-casting)方法
- 能對這種技術opengl編程
可見表面檢測
又叫Hidden Surface Elimination隱面消除,只有可見表面應該被柵格化。
當我們查看包含非透明對象和表面的圖片時,我們無法從靠近眼睛的對象後面看到那些對象。我們必須刪除這些隱藏的表面,以獲得逼真的屏幕圖像。識別和去除這些表面稱爲隱面問題。
三種方法
- Back-face detection (also called Culling)
- Z buffer (also called depth buffer)
- Ray Casting
1、Back-face detection 背面剔除
- 簡單快速
- 一般在更復雜可見性測試之前用作初步步驟
- 在進一步考慮前消除了大約50%的面
- 如下圖,N⋅V < 0 則爲背面:
- 有時,v被VPN取代,可以更快地進行近似處理
- 然而,這種方法不能處理凹形物體和部分被重疊的物體
2、Z buffer 深度緩衝
- 有倆buffers,分別是(frame buffer)幀緩衝區和(depth buffer)深度緩衝區。
- 深度緩衝區用於存儲(x,y)位置的深度值,因爲表面被處理(0≤深度≤1)。
- 幀緩衝區用於存儲每個位置(x,y)的顏色值的強度值。
- 緩衝區存儲當前的可見表面信息,一旦發現新的可見信息,值就會更新
- 如下圖,s1爲可見表面 所以他有最小的depth value
- 算法步驟:
1.初始化深度緩衝區和幀緩衝區,對所有緩衝區位置設置
depthBuff(x,y)= 1.0,frameBuff(x,y)=backgndColor
2.處理每個多邊形。一次處理一個。對於多邊形的每個投影的(x,y)像素位置,計算深度z(如果未知)。
3.如果z <depthBuff(x,y),計算該位置的表面顏色並設置 depthBuff(x,y)= z,frameBuff(x,y)= surfColor(x,y)
在處理完所有表面之後,深度緩衝區就會包含可見表面的深度值,而幀緩衝區包含這些表面的相應顏色值。
3、Ray casting 光線追蹤
- 追蹤我們發射出的ray到達的像素點的光路
- 對於每個像素,發射一條經過該像素的光線(從PRP)
- 找到射線與曲面的所有交點
- 最近的交點是該像素表面的可見部分
z buffer | ray casting |
---|---|
用於簡單的方程式無法充分描述的對象 | 用於可以通過簡單方程輕鬆描述的對象 |
openGL command
// Back face removal
glEnable (GL_CULL_FACE);
glCullFace (GL_BACK);
//Z Buffer
glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
glClear (GL_DEPTH_BUFFER_BIT);
glEnable (GL_DEPTH_TEST);