正背面剔除 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ì)替換原來的原色片段