OpenGL正背面剔除與深度測試

首先咱們看下面的一個圓環gif圖的例子,咱們從中能夠發現,bash

圓圈正面是紅色,底部邊緣是黑色的光芒,當咱們移動圓圈的時候,若是正面跟背面(正面是初始化時相對於觀察者看到的頁面)均顯示在觀察者前面時候會顯示出黑色的背景,這樣的效果明顯不是咱們想要的效果,咱們想要的是不管怎麼移動圓環,咱們看到的都是紅色,那麼咱們該如何解決這個問題呢?所以咱們使用正背面剔除以及深度測試來解決。markdown

正背面剔除(Face Culling)

引出背景

從一個3D圖形中咱們最多能夠看到三個面,其他的面咱們是沒法看到,所以在繪製3D圖形的時候咱們能夠僅繪製看到的面,那些看不到的OpenGL不進行渲染則會提高超過50%的性能。性能

正面、背面

對於固定的角度看3D圖形而言測試

  • 正面:按照逆時針方向頂點鏈接的三角形面
  • 反面:按照順時針方向頂點鏈接的三角形面

所以當從不一樣角度觀看3D圖形時,正面背面有可能發生變換,如圖spa

當觀察者左側看,左邊三角形123是逆時針則是正面,右邊三角形123是順時針則是背面,code

當觀察者在右側看,左邊三角形123是順時針是背面,右邊三角形123是逆時針則是正面,orm

總結:正面背面是根據觀察者以及組成三角形的頂點定義順序決定的內存

如何開啓背面剔除

  • 開啓背面剔除,代碼放在繪製頁面以前

//開啓背面剔除
        glEnable(GL_CULL_FACE);
        //下面兩行代碼能夠不寫,此處只是爲了展現如何寫
        //設置哪兒是正面(使用默認就行)
        glFrontFace(GL_CCW);
        //剔除背面(默認就是剔除背面的)
        glCullFace(GL_BACK);

複製代碼
  • 關閉背面剔除

    glDisable(GL_CULL_FACE);
    複製代碼

開啓背面剔除效果


深度測試

咱們從上面背面剔除的gif圖中發現圓環缺失了一部分,缺失的時候剛好圓環的兩部重疊了,那麼這個如何造成的呢?下面咱們引出深度測試的概念。it

什麼是深度

深度就是3D圖形中像素點距離觀察者的距離,即Z值,注意的是z值是個非負數io

深度緩衝區

深度換衝區就是一塊專門存儲像素點深度值的內存區域,深度值越大距離觀察者越遠。

那麼爲何須要深度緩衝區呢?

在不開啓深度測試的時候,咱們繪製3D圖形都是先繪製距離比較近的物理,而後再繪製距離遠的物理,所以距離較遠物理就有可能把距離較近的物理給覆蓋住,若是咱們使用深度緩衝區則無需擔憂覆蓋的問題,由於每一個像素點的深度都會寫入深度緩衝區。

深度測試

深度緩衝區跟顏色緩衝區是相對應的,顏色緩衝區存儲像素的色值信息,當繪製一個物理的時候,會比較將要繪製的深度值跟當前的深度值的大小,若是大於當前的深度值,則該頂點繪製廢棄掉,這就是深度測試。

開啓深度測試

glEnable(GL_DEPTH_TEST);
複製代碼

關閉深度測試

glDisable(GL_DEPTH_TEST);
複製代碼

開啓深度測試效果


深度測試開啓致使的閃爍問題

當咱們開啓深度測試的時候,雖然被遮擋的部分(背面)再也不進行繪製,可是當兩個頂點的深度值相同時,OpenGL就不能識別出來哪一個繪製哪一個放棄了,所以會出現交錯顯示的畫面,以下面兩畫面交錯閃爍展現

那麼如何解決這個問題呢?

  • 第一步,啓⽤用 Polygon Offset ⽅方式解決 ,讓深度值之間產生間隔

    //啓⽤用Polygon Offset ⽅方式
        glEnable(GL_POLYGON_OFFSET_FILL);
    複製代碼
  • 第二步,設置偏移量,經過glPolygonOffset來設置偏移量,通常設置-1,1便可,如 

    glPolygonOffset(-1,1);複製代碼

  • 關閉Polygon Offset

    glDisable(GL_POLYGON_OFFSET_FILL);
    
    複製代碼
     
相關文章
相關標籤/搜索