L8J計算機圖形學———可見表面檢測 openGL入門

學習目標:

  1. 明白可見表面檢測的目的
  2. 知道back-face detection 背面剔除方法
  3. 知道深度緩衝(z-buffer)方法
  4. 知道光線追蹤(ray-casting)方法
  5. 能對這種技術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);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章