OpenGL在渲染中可能產(chǎn)生的問題及預(yù)防方案

正背面剔除 Face Culling

我們?cè)诶L制一個(gè)多邊形的時(shí)候 從任意一個(gè)方向去觀察它 我們最多只能看到3個(gè)面 在繪制的過程中 我們沒有必要去繪制我們看不到的一面 如果我們用某種方式去丟棄這部分的數(shù)據(jù) 這樣可以提高openGL的渲染性能 這時(shí)我們引入正背面剔除

openGL可以檢查所有正面朝向觀察者的面 從而丟棄背面朝向的面 節(jié)約片元著色器的性能

深度測試

了解深度
深度就是像素點(diǎn)到在3D世界中距離攝像機(jī)的距離 Z值

深度緩沖區(qū)
深度緩沖區(qū) 就是內(nèi)存中一個(gè)專門的區(qū)域用來存儲(chǔ)每個(gè)像素點(diǎn)的深度值 深度值越大 離攝像機(jī)的距離越遠(yuǎn)

深度緩沖區(qū)的作用
如果我們不使用深度緩沖區(qū) 我們先繪制比較近的物體 再繪制比較遠(yuǎn)的物體 這時(shí)候比較遠(yuǎn)的物體因?yàn)楹罄L制 會(huì)把距離近的物體給遮擋 如果有了深度緩沖區(qū) 繪制物體的順序就不重要 openGL 會(huì)把像素的深度值寫入到深度緩沖區(qū)

深度測試
深度緩沖區(qū)(DepthBuffer) 和顏色緩沖區(qū)(ColorBuffer)是對(duì)應(yīng)的 顏色緩沖區(qū)存儲(chǔ)像素的顏色信息 深度緩沖區(qū)存儲(chǔ)像素的深度信息 在決定是否繪制一個(gè)表面的時(shí)候 會(huì)先表面的像素的深度值與深度緩沖區(qū)的值進(jìn)行比較 如果大于深度緩沖區(qū)的值 就會(huì)丟棄這一部分 否則將利用這個(gè)像素值對(duì)應(yīng)的深度值和顏色值來更新深度緩沖區(qū)和顏色緩沖區(qū)的值 這個(gè)過程就叫做深度測試

ZFighting閃爍

開啟了深度測試后 就不會(huì)再去繪制被遮擋的部分 但是如果兩個(gè)面的距離非常近 OpenGL可能不能正確的判斷他們的深度值 將導(dǎo)致深度測試的結(jié)果不可預(yù)測 顯示出來的是兩個(gè)畫面交錯(cuò)閃爍

第一步 啟用 polygon Offset方式解決
讓深度值直接產(chǎn)生間隔 可以理解為 執(zhí)行深度測試之前 將立方體的深度值做一些細(xì)微的增加
glEnable(GL_POLYGON_OFFSET_FILL)

第二步 指定偏移量
通過glPolygonOffset 來指定.glPolygonOffset 需要2個(gè)參數(shù): factor , units

第三步: 關(guān)閉Polygon Offset
glDisable(GL_POLYGON_OFFSET_FILL)

裁剪

OpenGL中提高渲染的一種方式 只刷新屏幕上發(fā)生變化的一部分 OpenGL允許將要進(jìn)行渲染的窗口只指定一個(gè)裁剪框
基本原理 用于渲染指定的區(qū)域 在屏幕上指定一個(gè)矩形區(qū)域 啟用裁剪測試后 不在這個(gè)區(qū)域的片元將會(huì)被丟棄 只有在這個(gè)區(qū)域的片元才有可能進(jìn)入幀緩沖區(qū) 實(shí)際效果就是在屏幕中開啟了一個(gè)窗口 在它中間對(duì)指定內(nèi)容進(jìn)行繪制

混合

OpenGL在渲染的時(shí)候會(huì)把顏色值存在顏色緩沖區(qū)中 當(dāng)深度測試關(guān)閉的時(shí)候 新的顏色值會(huì)簡單的覆蓋原來顏色緩沖區(qū)域的顏色值 當(dāng)深度緩沖區(qū)再次打開的時(shí)候 新的顏色片段只有比原來的值更接近裁剪平面才會(huì)替換原來的原色片段

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容