一蜈抓、在渲染過(guò)程可能產(chǎn)生的問(wèn)題
二、解決方法
1昂儒、油畫法
2沟使、正面、背面剔除
3渊跋、深度測(cè)試
1腊嗡、油畫法
2、正面拾酝、背面剔除
可以如下調(diào)用開啟或關(guān)閉表面剔除燕少。
glEnable(GL_CULL_FACE);
glDisable(GL_CULL_FACE);
該函數(shù)的原型如下:
void glFrontFace(GLenum mode);
mode 參數(shù)的可選的值有 GL_CW 和 GL_CCW(默認(rèn) 值是 GL_CCW)。
GL_CW 表示頂點(diǎn)的排列順序是順時(shí)針的面是正面蒿囤。
GL_CCW 表示頂點(diǎn)的排列順序是逆時(shí)針的面是正面(默 認(rèn)值)客们。
void glCullFace()
GL_FRONT //正面剔除
GL_BACK //背面剔除
GL_FRONT_AND_BACK //正面和反面都要剔除
3、深度測(cè)試
該函數(shù)的原型如下:
void glutInitDisplayMode(GLUT_DEPTH);
開啟深度測(cè)試
glEnable(GL_DEPTH_TEST);
三材诽、使用正面底挫、背面剔除 以及 深度測(cè)試來(lái)解決 渲染過(guò)程中產(chǎn)生的 問(wèn)題
四、多邊形模型
使用glPolygonMode(Glenum face,Glenum mode) 函數(shù)來(lái)指定填充方式
Face參數(shù):GL_FRONT脸侥、GL_BACK建邓、GL_FRONT_AND_BACK
Mode參數(shù):GL_FILL(默認(rèn)實(shí)心填充) 、GL_LINE睁枕、GL_POINT
五官边、多邊形偏移
深度測(cè)試實(shí)現(xiàn)深度的過(guò)程中,可能產(chǎn)生的2種問(wèn)題:
1譬重、z-fighting(z沖突)
2、圖形重疊(無(wú)法體現(xiàn)深度)
六罐氨、解決方法
1臀规、調(diào)整Z值
2、使用glPolygonOffset函數(shù)栅隐,調(diào)節(jié)片段深度值塔嬉。
6.1 glPolygonOffset 函數(shù)
void glPolygonOffset(Glfloat factor,Glfloat units);
應(yīng)用到片段上總偏移計(jì)算方程式:
Depth Offset = (DZ * factor) + (r * units);
DZ:深度值(Z值) r:使得深度緩沖區(qū)產(chǎn)生變化的最小值
負(fù)值,將使得z值距離我們更近租悄,而正值谨究,將使得z值距離我們更遠(yuǎn), 對(duì)于上節(jié)課的案例泣棋,我們?cè)O(shè)置factor和units設(shè)置為-1胶哲,0
Demo:07-深度測(cè)試產(chǎn)生的問(wèn)題
七、裁剪
在OpenGL 提高渲染的一種方式潭辈,只刷新屏幕上發(fā)生變化的部分鸯屿。OpenGL 允許我們將 要進(jìn)行渲染的窗口只去指定一個(gè)裁剪框澈吨。
//1 開啟裁剪測(cè)試
glEnable(GL_SCISSOR_TEST);
//2.關(guān)閉裁剪測(cè)試
glDisable(GL_SCISSOR_TEST);
//3.指定裁剪窗口
void glScissor(Glint x,Glint y,GLSize width,GLSize height);
x,y:指定裁剪框左下角位置;
width,height:指定裁剪尺寸
八、實(shí)現(xiàn)多層裁剪
九寄摆、混合
我們把OpenGL 渲染時(shí)會(huì)把顏色值存在顏色緩存區(qū)中谅辣,每個(gè)片段的深度值也是放在深 度緩沖區(qū)。當(dāng)深度緩沖區(qū)被關(guān)閉時(shí)婶恼,新的顏色將簡(jiǎn)單的覆蓋原來(lái)顏色緩存區(qū)存在的顏 色值桑阶,當(dāng)深度緩沖區(qū)再次打開時(shí),新的顏色片段只是當(dāng)它們比原來(lái)的值更接近鄰近的 裁剪平面才會(huì)替換原來(lái)的顏色片段勾邦。
glEnable(GL_BlEND);
9.1 組合顏色
目標(biāo)顏色:已經(jīng)存儲(chǔ)在顏色緩存區(qū)的顏色值
源顏色:作為當(dāng)前渲染命令結(jié)果進(jìn)入顏色緩存區(qū)的顏色值 當(dāng)混合功能被啟動(dòng)時(shí)蚣录,源顏色和目標(biāo)顏色的組合方式是混合方程式控制的。在默認(rèn)情況下检痰,混合方程式如下所示:
Cf = (Cs * S) + (Cd * D)
Cf :最終計(jì)算參數(shù)的顏色
Cs : 源顏色
Cd :目標(biāo)顏色
S:源混合因子
D:目標(biāo)混合因子
9.2 設(shè)置混合因子
設(shè)置混合因子包归,需要用到glBlendFun函數(shù)
glBlendFunc(GLenum S,GLenum D);
S:源混合因子
D:目標(biāo)混合因子
9.3 混合因子枚舉列表
表中R、G铅歼、B公壤、A 分別代表 紅、綠椎椰、藍(lán)厦幅、alpha。
表中下標(biāo)S慨飘、D确憨,分別代表源、 目標(biāo)
表中C 代表常量顏色(默認(rèn)黑 色)
9.4 練習(xí)
下面通過(guò)一個(gè)常見的混合函數(shù)組合來(lái)說(shuō)明問(wèn)題:
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
如果顏色緩存區(qū)已經(jīng)有一種顏色紅色(1.0f,0.0f,0.0f,0.0f),這個(gè)目標(biāo)顏色Cd瓤的,如果在這 上面用一種alpha為0.6的藍(lán)色(0.0f,0.0f,1.0f,0.6f)
Cd (目標(biāo)顏色) = (1.0f,0.0f,0.0f,0.0f);
Cs (源顏色) = (0.0f,0.0f,1.0f,0.6f);
S = 源alpha值 = 0.6f;
D = 1 - 源alpha值= 1-0.6f = 0.4f;
方程式Cf = (Cs * S) + (Cd * D)
等價(jià)于 = (Blue * 0.6f) + (Red * 0.4f)
9.4 總結(jié)
最終顏色是以原先的紅色(目標(biāo)顏色)與 后來(lái)的藍(lán)色(源顏色)進(jìn)行組合休弃。源顏色的 alpha值越高,添加的藍(lán)色顏色成分越高圈膏,目標(biāo)顏色所保留的成分就會(huì)越少塔猾。
混合函數(shù)經(jīng)常用于實(shí)現(xiàn)在其他一些不透明的物體前面繪制一個(gè)透明物體的效果。
十稽坤、改變組合方程式
默認(rèn)混合方程式:
Cf = (Cs*S)+(Cd*D)
實(shí)際上遠(yuǎn)不止這一種混合方程式丈甸,我們可以從5個(gè)不同的方程式中進(jìn)行選擇
10.1 改變混合方程式的函數(shù) glBlendEquation()
選擇混合方程式的函數(shù):
glbBlendEquation(GLenum mode);
10.2 glBlendFuncSeparate 函數(shù)
除了能使用glBlendFunc 來(lái)設(shè)置混合因子,還可以有更靈活的選擇尿褪。
void glBlendFuncSeparate(GLenum strRGB,GLenum dstRGB,GLenum strAlpha,GLenum dstAlpha);
strRGB: 源顏色的混合因子
dstRGB: 目標(biāo)顏色的混合因子
strAlpha: 源顏色的Alpha因子
dstAlpah: 目標(biāo)顏色的Alpha因子
10.3 glBlendFuncSeparate 注意
glBlendFunc 指定 源和目標(biāo) RGBA值的混合函數(shù);但是glBlendFuncSeparate函 數(shù)則允許為RGB 和 Alpha 成分單獨(dú)指定混合函數(shù)睦擂。
在混合因子表中, GL_CONSTANT_COLOR,GL_ONE_MINUS_CONSTANT_COLOR,GL_CONSTANT_ALPHA,GL_ONE_MINUS_CONSTANT值允許混合方程式中引入一個(gè)常量混合顏色杖玲。
10.4 常量混合顏色
常量混合顏色顿仇,默認(rèn)初始化為黑色(0.0f,0.0f,0.0f,0.0f),但是還是可以修改這個(gè)常量 混合顏色。
void glBlendColor(GLclampf red ,GLclampf green ,GLclampf blue ,GLclampf alpha );