在渲染過程中可能產(chǎn)生的問題
在繪制3D場景的時(shí)候,我們需要決定哪些部分是對(duì)觀察者可見的玉掸,或者哪些部分是對(duì)觀察者不可見的刃麸。不可見的部分,應(yīng)該盡早的拋棄掉司浪。例如一個(gè)不同的墻壁后泊业,就不應(yīng)該渲染。這種情況叫作隱藏面消除(Hidden surface elimination)
油畫算法(基本不使用這種方法啊易,也不推薦)
- 先繪制場景中離觀察者較遠(yuǎn)的物體吁伺,再繪制較勁的物體。
- 例如下面的例子租谈,繪制順序:紅色->黃色->灰色篮奄,即可解決隱藏面消除的問題
油畫法.png
油畫算法的弊端
- 使用油畫算法,只要將場景按照物理距離觀察者的距離遠(yuǎn)近排序割去,由遠(yuǎn)及近的繪制即可窟却。如果三個(gè)三角形是疊加的情況,油畫算法將無法處理劫拗。
三角形疊加.png
正背面剔除
- 解決問題
- 如何告訴OpenGL 你繪制的圖形,哪個(gè)面是正面,哪個(gè)面是背面?
- 通過分析頂點(diǎn)數(shù)據(jù)的順序间校。
- 分析頂點(diǎn)順序
分析頂點(diǎn)順序.png
- 正面/背面區(qū)分
- 正面:按照逆時(shí)針頂點(diǎn)連接順序的三角形面
- 背面:按照順時(shí)針頂點(diǎn)連接順序的三角形面
- 解析立方體中的正背面
正方體的正背面.png
- 分析
- 左側(cè)三?形頂點(diǎn)順序?yàn)? 1—> 2—> 3 ; 右側(cè)三?形的頂點(diǎn)順序?yàn)? 1—> 2—> 3 .
- 當(dāng)觀察者在右側(cè)時(shí),則右邊的三角形方向?yàn)槟鏁r(shí)針方向則為正面,而左側(cè)的三?形為順時(shí)針則為背面
- 當(dāng)觀察者在左側(cè)時(shí),則左邊的三?形方向?yàn)槟鏁r(shí)針方向則為正面,而右側(cè)的三角形為順時(shí)針則為背面
- 總結(jié)
- 正面和背面是有三角形的頂點(diǎn)定義順序和觀察者方向共同決定的.隨著觀察者的角度方向的改變,正面背?也會(huì)跟著改變
代碼
- 開啟表?剔除(默認(rèn)背?剔除)
void glEnable(GL_CULL_FACE);
- 關(guān)閉表?剔除(默認(rèn)背?剔除)
void glDisable(GL_CULL_FACE);
- 用戶選擇剔除的那個(gè)面(正面/背面)
void glCullFace(GLenum mode);
mode參數(shù):GL_FRONT,GL_BACK,GL_FRONT_AND_BACK ,默認(rèn)GL_BACK
- 用戶指定繞序哪個(gè)為正面
void glFrontFace(GLenum mode)
mode參數(shù)為: GL_CW,GL_CCW,默認(rèn)值:GL_CCW(逆時(shí)針頂點(diǎn)順序的三角形)
- 例如,剔除正?實(shí)現(xiàn)(1)
void glCullFace(GL_BACK);
void glFrontFace(GL_CW);//修改順時(shí)針頂點(diǎn)順序的三角形為正面
- 例如,剔除正?實(shí)現(xiàn)(2)
void glCullFace(GL_Front);