OpenGL正背面剔除胆描、深度測(cè)試

關(guān)于OpenGL繪制流程可查看计雌,之前寫(xiě)的一篇文章昧谊,詳細(xì)解讀了各個(gè)繪制步驟

OpenGL繪制流程

本文主要說(shuō)明在繪制過(guò)程中的正背面剔除以及深度測(cè)試效果;

本示例具體代碼演示下載地址

下載示例代碼運(yùn)行凤价,運(yùn)行效果如下圖鸽斟,能夠正常繪制出甜甜圈的效果,可以偷偷的笑開(kāi)心下料仗;

甜甜圈

當(dāng)旋轉(zhuǎn)甜甜圈的時(shí)候湾盗,發(fā)現(xiàn)如下圖所示問(wèn)題,在旋轉(zhuǎn)的過(guò)程中立轧,出現(xiàn)了黑色的部分格粪,這個(gè)看起來(lái)可不太友好;面對(duì)如此問(wèn)題該如何解決呢氛改?

旋轉(zhuǎn)甜甜圈

在繪制3D場(chǎng)景的時(shí)候,我們需要決定哪些部分是對(duì)觀察者可?的,或者哪些部分是對(duì)觀察者不可見(jiàn)的.對(duì)于不可見(jiàn)的部分,應(yīng)該及早丟棄.例如在一個(gè)不透明的墻壁后,就不應(yīng)該 渲染.這種情況叫做”隱藏?面消除”(Hidden surface elimination).

解決方案:

油畫(huà)算法

油畫(huà)畫(huà)法

先繪制場(chǎng)景中的離觀察者較遠(yuǎn)的物體,再繪制較近的物體(具體步驟見(jiàn)上圖帐萎,先繪制紅色方塊,接著是黃色圓形胜卤,接著是灰色長(zhǎng)方形)疆导,即可解決隱藏面消除的問(wèn)題;

油畫(huà)畫(huà)法弊端

使?油畫(huà)算法,只要將場(chǎng)景按照物理距離觀察者的距離遠(yuǎn)近排序,由遠(yuǎn)及近的繪制即可.那么會(huì)出現(xiàn)什么問(wèn)題??如果個(gè)三?形是疊加的情況,油畫(huà)算法將?法處理

疊加三角形

OpenGL提供的解決方案:

正背面剔除(Face Culling)

可以想像下葛躏,當(dāng)我們看到一個(gè)3D圖形時(shí)澈段,無(wú)論從哪個(gè)方向去觀察,最多可以看到幾個(gè)面舰攒?~~~答案是3個(gè)败富;基于此,那么就沒(méi)有必要繪制根本看不到的3個(gè)面摩窃,將看不到的3個(gè)面以某種方式丟棄兽叮,OpenGL的渲染性能即可提高50%

OpenGL?可以做到檢查所有正面朝向觀察者的面,并渲染它們.從而丟棄背?朝向的面.?這樣可以節(jié)約片元著?器的性能

glEnable(GL_CULL_FACE);//開(kāi)啟正面剔除

glDisable(GL_CULL_FACE);//關(guān)閉正面剔除

當(dāng)開(kāi)啟正面剔除后,運(yùn)行demo會(huì)看到如下效果猾愿,prefect~

開(kāi)啟正背面剔除效果

上面提到了正面鹦聪、背面兩個(gè)概念,那么OpenGL是如何識(shí)別正面背面蒂秘,以及是否可以自定義哪個(gè)方向是正面哪個(gè)方向是背面呢泽本?

通過(guò)分析頂點(diǎn)數(shù)據(jù)的順序可知

頂點(diǎn)順序

背面:?按照順時(shí)針頂點(diǎn)連接順序的三?形面

正?:?按照逆時(shí)針頂點(diǎn)連接順序的三?形?

立體圖形中的正背面

1、左側(cè)三角形頂點(diǎn)順序?yàn)? 1—> 2—> 3 ;?右側(cè)三角形的頂點(diǎn)順序?yàn)? 1—> 2—> 3 .

2姻僧、當(dāng)觀察者在右側(cè)時(shí),則右邊的三?形?向?yàn)槟鏁r(shí)針?向則為正面,而左側(cè)的三?形為順時(shí)針則為背面?

3观挎、當(dāng)觀察者在左側(cè)時(shí),則左邊的三?形為逆時(shí)針?向判定為正面,而右側(cè)的三?角形為順時(shí)針判定為背面.

正面和背面是有三角形的頂點(diǎn)定義順序和觀察者?向共同決定的.隨著觀察者的?度方向的改變,正面背面也會(huì)跟著改變

?戶選擇剔除哪個(gè)面(正面/背面)

void glCullFace(GLenum mode);

mode參數(shù)為: GL_FRONT,GL_BACK,GL_FRONT_AND_BACK ,默認(rèn)GL_BACK

用戶指定繞序那個(gè)為正面

void glFrontFace(GLenum mode);?

mode參數(shù)為: GL_CW,GL_CCW,默認(rèn)值:GL_CCW

例如:剔除正面實(shí)現(xiàn)

glCullFace(GL_BACK);

glFrontFace(GL_CW);?

使用正背面剔除效果后,在旋轉(zhuǎn)的過(guò)程中沒(méi)有黑色陰影出現(xiàn)段化,但是當(dāng)旋轉(zhuǎn)到前后重疊的時(shí)候,會(huì)發(fā)現(xiàn)造成,出現(xiàn)了如下圖所示效果(出現(xiàn)了一個(gè)缺口)显熏?是什么原因?qū)е履兀?/p>

開(kāi)啟正背面剔除后,當(dāng)旋轉(zhuǎn)到正背面重合時(shí)晒屎,出現(xiàn)缺口

在甜甜圈旋轉(zhuǎn)過(guò)程中喘蟆,當(dāng)旋轉(zhuǎn)到前后兩部分重疊時(shí)缓升,正常情況下應(yīng)該顯示的是離我們近的位置即前面部分,后面部分是隱藏面蕴轨,但是OpenGL中并不能清除的區(qū)分港谊,兩個(gè)圖層誰(shuí)顯示在前,誰(shuí)顯示在后橙弱,由此導(dǎo)致甜甜圈產(chǎn)生了缺口

那么如何解決此問(wèn)題呢歧寺?OpenGL給我們提供了哪些方案呢?

在解決問(wèn)題之前需要了解OpenGL坐標(biāo)體系中的兩個(gè)概念棘脐,深度斜筐、深度緩存區(qū)

深度

深度其實(shí)就是該像素點(diǎn)在3D世界中距離攝像機(jī)的距離,Z值

深度值一般由16位,24位或者32位值表示蛀缝,通常是24位顷链。位數(shù)越高的話,深度的精確度越 好屈梁。深度值的范圍在[0,1]之間

值越?表示越靠近觀察者

值越大表示遠(yuǎn)離觀察者

深度緩存區(qū)?

深度緩存區(qū),就是一塊內(nèi)存區(qū)域,專(zhuān)門(mén)存儲(chǔ)著每個(gè)像素點(diǎn)(繪制在屏幕上的)深度值.存儲(chǔ)在顯存中

深度值(Z值)越?,?則離攝像機(jī)就越遠(yuǎn).

深度值(Z值)越小,?則離攝像機(jī)就越近.

為什么需要深度緩沖區(qū)??在不使用深度測(cè)試的時(shí)候,如果我們先繪制一個(gè)距離?較近的物體,再繪制距離較遠(yuǎn)的物體,則距離遠(yuǎn)的位圖因?yàn)楹罄L制,會(huì)把距離近的物體覆蓋掉.?有了深度緩沖區(qū)后,繪制物體的順序就不那么重要了.?實(shí)際上,只要存在深度緩沖區(qū),OpenGL?都會(huì)把像素的深度值寫(xiě)?到緩存區(qū)中.?除非調(diào)?用?glDepthMask(GL_FALSE).來(lái)禁止寫(xiě)?.

還記得在渲染的代碼中有一行就是用來(lái)專(zhuān)門(mén)清除緩存的嗤练,包括顏色緩存、深度緩存在讶;因?yàn)槿绻彺鎱^(qū)不清空煞抬,之前的數(shù)據(jù)會(huì)有殘留,會(huì)對(duì)目前圖形的繪制造成影響真朗;在不清楚清除哪部分?jǐn)?shù)據(jù)的時(shí)候此疹,可以選擇全部清除,如下

//清空顏色遮婶、深度緩存區(qū)

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

在了解了深度以及深度緩存區(qū)之后蝗碎,在面臨上面缺口問(wèn)題的時(shí)候,OpenGL提供的解決方案就正式出場(chǎng)啦---深度測(cè)試

深度測(cè)試

glEnable(GL_DEPTH_TEST);//開(kāi)啟深度測(cè)試

glDisable(GL_DEPTH_TEST);//關(guān)閉深度測(cè)試

開(kāi)啟深度測(cè)試后旗扑,在繪制過(guò)程中蹦骑,像素點(diǎn)新的深度值需要與深度緩存中已經(jīng)存在的深度值作比較,如果新值 > 舊值臀防,則丟棄這部分不繪制眠菇,反之,將新的深度值更新至深度緩存區(qū)袱衷,由于深度緩存區(qū)與顏色緩存區(qū)是一一對(duì)應(yīng)的捎废,同時(shí)也需要更新該像素點(diǎn)的顏色值到顏色緩存區(qū),這個(gè)過(guò)程就是深度測(cè)試

開(kāi)啟深度測(cè)試后致燥,看看效果登疗,在旋轉(zhuǎn)過(guò)程中,即使前后重疊,也不會(huì)出現(xiàn)缺口的現(xiàn)象辐益,如下圖

開(kāi)啟深度測(cè)試效果

深度測(cè)試解決的問(wèn)題:

1断傲、當(dāng)類(lèi)似甜甜圈旋轉(zhuǎn)時(shí),前后2個(gè)部分重疊智政,此時(shí)OpenGL不能清除分辨哪個(gè)圖層在前面认罩,哪個(gè)圖層在后面,則會(huì)出現(xiàn)缺口

2续捂、隱藏面消除垦垂,除了使用正背面剔除外,還可使用深度測(cè)試來(lái)解決

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末疾忍,一起剝皮案震驚了整個(gè)濱河市乔外,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌一罩,老刑警劉巖杨幼,帶你破解...
    沈念sama閱讀 217,185評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異聂渊,居然都是意外死亡差购,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門(mén)汉嗽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)欲逃,“玉大人,你說(shuō)我怎么就攤上這事饼暑∥任觯” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,524評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵弓叛,是天一觀的道長(zhǎng)彰居。 經(jīng)常有香客問(wèn)我,道長(zhǎng)撰筷,這世上最難降的妖魔是什么陈惰? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,339評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮毕籽,結(jié)果婚禮上抬闯,老公的妹妹穿的比我還像新娘。我一直安慰自己关筒,他們只是感情好溶握,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,387評(píng)論 6 391
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著蒸播,像睡著了一般睡榆。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,287評(píng)論 1 301
  • 那天肉微,我揣著相機(jī)與錄音,去河邊找鬼蜡塌。 笑死碉纳,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的馏艾。 我是一名探鬼主播劳曹,決...
    沈念sama閱讀 40,130評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼琅摩!你這毒婦竟也來(lái)了铁孵?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 38,985評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤房资,失蹤者是張志新(化名)和其女友劉穎蜕劝,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體轰异,經(jīng)...
    沈念sama閱讀 45,420評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡岖沛,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,617評(píng)論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了搭独。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片婴削。...
    茶點(diǎn)故事閱讀 39,779評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖牙肝,靈堂內(nèi)的尸體忽然破棺而出唉俗,到底是詐尸還是另有隱情,我是刑警寧澤配椭,帶...
    沈念sama閱讀 35,477評(píng)論 5 345
  • 正文 年R本政府宣布虫溜,位于F島的核電站,受9級(jí)特大地震影響颂郎,放射性物質(zhì)發(fā)生泄漏吼渡。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,088評(píng)論 3 328
  • 文/蒙蒙 一乓序、第九天 我趴在偏房一處隱蔽的房頂上張望寺酪。 院中可真熱鬧,春花似錦替劈、人聲如沸寄雀。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,716評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)盒犹。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間急膀,已是汗流浹背沮协。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,857評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留卓嫂,地道東北人慷暂。 一個(gè)月前我還...
    沈念sama閱讀 47,876評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像晨雳,于是被迫代替她去往敵國(guó)和親行瑞。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,700評(píng)論 2 354