OpenGL 正背面剔除(Face Culling)

在介紹正背面剔除以前,咱們先要了解在渲染過程當中會遇到哪些問題,用什麼方法來解決這樣的問題?咱們一步一步來發現問題,解決問題。算法

在渲染過程當中可能產生的問題

當咱們在繪製一個3D場景的時候,處於對性能和實際狀況的考慮,咱們是否是應該決定哪些部分是對觀察者可見的部分,哪些是觀察者不可見的部分,而不可見的部分,咱們是否是不該該渲染,這樣符合實際狀況,也節省了性能。這種狀況叫作」隱藏面消除」(Hidden surface elimination).例以下面這張圖片,有黑色的部分,也有紅色的部分,顯而易見,黑色的部分不該該讓觀察者看到。 bash

隱藏面消除的問題

解決辦法:油畫算法

油畫算法:先繪製場景中的離觀察者較遠的物體,再繪製較近的物體 下圖先繪製紅色的部分,在繪製黃色的問題,最後繪製灰色的部分,便可解決隱藏面消除的問題。 性能

油畫算法

油畫法的弊端

油畫法雖然解決的隱藏面消除的問題,咱們進一步思考在上面的圖形繪製中,三個圖形有交匯的地方,咱們是否是繪製了三遍,影響了性能。還有咱們沒法繪製圖形相互疊加層次混亂的問題。以下圖:spa

image.png

解決方案: 正背面剔除(Face Culling)

全部平面都有兩個面,正面和背面,咱們在一個時刻只能看到其中一個面。而看不到的面,咱們是否是能夠不繪製觀察者看到的面。來提升咱們的渲染性能那。OpenGL 能夠作到檢查全部正面朝向觀察者的面,並渲染它們.從而丟棄背面朝向的⾯面. 這樣能夠 節約片元着⾊器的性能。3d

正面背面區分

正面: 按照逆時針頂點鏈接順序的三角形面 背面: 按照順時針頂點鏈接順序的三⻆形面code

正方體中的正背面

正方體中的正背面
正面和背面是有三角形的 頂點定義順序觀察者方向共同決定的.隨着觀察者的角度⽅向的改變,正面背面也 會跟着改變

正背面剔除使用

開啓表面剔除(默認背面剔除)
void glEnable(GL_CULL_FACE);

關閉表面剔除(默認背面剔除)
void glDisable(GL_CULL_FACE);

⽤戶選擇剔除那個面(正面/背面)
void glCullFace(GLenum mode);
mode參數爲: GL_FRONT,GL_BACK,GL_FRONT_AND_BACK ,默GL_BACK

 用戶指定那個爲正面
void glFrontFace(GLenum mode);
mode參數爲: GL_CW,GL_CCW,默認值:GL_CCW 

例如,剔除正面實現(1)
glCullFace(GL_BACK); 
glFrontFace(GL_CW);

例例如,剔除正⾯面實現(2) 
glCullFace(GL_FRONT);

複製代碼
相關文章
相關標籤/搜索