OpenGL ES 3.0 深度測試(OC)(二)

先看最終的效果
WechatIMG6.jpeg

本文章是基于文章一突雪,開始講解的。
效果就是個3D的正方體的盒子。
如果實現(xiàn)這個效果需要的步驟:
1.創(chuàng)建窗口
2.初始化環(huán)境(Context)
3.申請緩存區(qū)(渲染緩存廷蓉,深度測試,幀緩存)
4.加載著色器關聯(lián)鏈接程序
5.設置頂點
6.加載紋理
7.渲染
其中舷夺,創(chuàng)建窗口苦酱,初始化環(huán)境(Context),申請緩存區(qū)(渲染緩存给猾,幀緩存)疫萤,加載著色器關聯(lián)鏈接程序,設置頂點敢伸,加載紋理扯饶。
這幾個步驟同文章一,下面主要講解下申請緩存區(qū)(深度測試)池颈,和渲染的步驟尾序。

1.申請緩存區(qū)(深度測試)

一般情況下我們要申請渲染緩存區(qū),幀緩存區(qū)躯砰,如果使用深度測試也需要申請深度緩存區(qū)每币。
其中渲染緩存區(qū)

// 創(chuàng)建 綁定 渲染緩存
    glGenRenderbuffers(1, &_myColorRenderBuffer);
    glBindRenderbuffer(GL_RENDERBUFFER, _myColorRenderBuffer);

幀緩沖區(qū)

// 創(chuàng)建 綁定幀緩存
    glGenFramebuffers(1, &_myColorFrameBuffer);
    glBindFramebuffer(GL_FRAMEBUFFER, _myColorFrameBuffer);

在創(chuàng)建和綁定好渲染緩存區(qū)和幀緩存區(qū)后,還需要綁定下

    // 在幀緩存 和 渲染緩存創(chuàng)建 和 綁定結束后需要
    // 渲染緩存作為幀緩存的某種(顏色琢歇、深度兰怠、模板)附件
    glFramebufferRenderbuffer(
                              //幀緩沖區(qū)類型
                              GL_FRAMEBUFFER,
                              //緩沖附件類型
                              GL_COLOR_ATTACHMENT0,
                              //渲染緩沖區(qū)類型
                              GL_RENDERBUFFER,
                              //渲染緩沖句柄
                              _myColorRenderBuffer);

下面需要開始創(chuàng)建深的緩存區(qū)

    // 深度緩存
    GLint width;
    GLint height;
    glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_WIDTH, &width);
    glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_HEIGHT, &height);
    
    // 申請深度渲染緩存
    glGenRenderbuffers(1, &_depthRenderBuffer);
    glBindRenderbuffer(GL_RENDERBUFFER, _depthRenderBuffer);
    // 設置深度測試的存儲信息
    glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, width, height);
    // 關聯(lián)深度緩沖到幀緩沖區(qū)
    // 將渲染緩存掛載到GL_DEPTH_ATTACHMENT這個掛載點上
    glFramebufferRenderbuffer(
                              GL_FRAMEBUFFER,
                              GL_DEPTH_ATTACHMENT,
                              GL_RENDERBUFFER,
                              _depthRenderBuffer);
    // GL_RENDERBUFFER綁定的是深度測試渲染緩存梦鉴,所以要綁定回色彩渲染緩存
    glBindRenderbuffer(GL_RENDERBUFFER, _myColorRenderBuffer);

其中這次glFramebufferRenderbuffer,是將深度緩存區(qū)添加到幀緩存區(qū)的深度(GL_DEPTH_ATTACHMENT)附件中揭保。并且還需要重新綁定一次渲染緩存區(qū)肥橙。

2.渲染

當申請好深度緩存區(qū)后,就可以通過glEnable(GL_DEPTH_TEST);開啟深度測試秸侣。
最后在每次渲染的時候還需要執(zhí)行glClear(GL_DEPTH_BUFFER_BIT);清除深度緩存區(qū)存筏。整個深度測試流程就結束了。

3.什么是深度測試

  1. 深度測試的概念:
    深度其實就是該像素點在3D世界中距離攝像機的距離Z值
  2. 什么是深度緩沖區(qū)味榛?
    深度緩存區(qū)椭坚,就是一塊內(nèi)存區(qū)域,專門儲存著每個像素點(繪制在屏幕上的)深度值励负。深度值(Z值)越大藕溅,則離攝像機越遠匕得。
  3. 為什么需要緩沖區(qū)继榆?
    在不使用深度測試的時候,如果我們先繪制一個距離比較近的物理汁掠,再繪制距離較遠的物理略吨,則距離遠的位圖因為后繪制,會被距離近的物體覆蓋掉考阱。有了深度緩沖區(qū)后翠忠,繪制 物體的順序就不那么重要的。實際上乞榨,只要存在深度緩沖區(qū)秽之,OpenGL都會把像素的深度值寫入到緩沖區(qū)中。除非調(diào)用glDepthMask(GL_FALSE)來禁止寫入吃既。
  4. 為什么每次渲染需要執(zhí)行一次Clear
    深度緩沖區(qū)原理就是把一個距離觀察平面(近裁剪面)的深度值(或距離)與窗口中的每個像素相關聯(lián)考榨。
    首先,使用glClear(GL_DEPTH_BUFFER_BIT),把所有像素的深度值設置為最大值(一般是遠裁剪面)鹦倚。然后河质,在場景中以任意次序繪制所有物體。硬件或者軟件所執(zhí)行的圖形計算把每一個繪制表面轉換為窗口上一些像素的集合震叙,此時并不考慮是否被其他物體遮擋掀鹅。其次,OpenGL會計算這些表面和觀察平面的距離媒楼。如果啟用了深度緩沖區(qū)乐尊,在繪制每個像素之前,OpenGL會把它的深度值和已經(jīng)存儲在這個像素的深度值進行比較划址。新像素深度值<原先像素深度值扔嵌,則新像素值會取代原先的昏滴;反之,新像素值被遮擋对人,他顏色值和深度將被丟棄谣殊。為了啟動深度緩沖區(qū),必須先啟動它牺弄,即glEnable(GL_DEPTH_TEST)姻几。每次繪制場景之前,需要先清除深度緩沖區(qū)势告,即glClear(GL_DEPTH_BUFFER_BIT)蛇捌,然后以任意次序繪制場景中的物體。

代碼:
https://github.com/YBYHunter/OpenGL-ES-Demo/tree/master

記得Star!Star!

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末咱台,一起剝皮案震驚了整個濱河市络拌,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌回溺,老刑警劉巖春贸,帶你破解...
    沈念sama閱讀 222,104評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異遗遵,居然都是意外死亡萍恕,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評論 3 399
  • 文/潘曉璐 我一進店門车要,熙熙樓的掌柜王于貴愁眉苦臉地迎上來允粤,“玉大人,你說我怎么就攤上這事翼岁±嗟妫” “怎么了?”我有些...
    開封第一講書人閱讀 168,697評論 0 360
  • 文/不壞的土叔 我叫張陵琅坡,是天一觀的道長悉患。 經(jīng)常有香客問我,道長脑蠕,這世上最難降的妖魔是什么购撼? 我笑而不...
    開封第一講書人閱讀 59,836評論 1 298
  • 正文 為了忘掉前任,我火速辦了婚禮谴仙,結果婚禮上迂求,老公的妹妹穿的比我還像新娘。我一直安慰自己晃跺,他們只是感情好揩局,可當我...
    茶點故事閱讀 68,851評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著掀虎,像睡著了一般凌盯。 火紅的嫁衣襯著肌膚如雪付枫。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,441評論 1 310
  • 那天驰怎,我揣著相機與錄音阐滩,去河邊找鬼。 笑死县忌,一個胖子當著我的面吹牛掂榔,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播症杏,決...
    沈念sama閱讀 40,992評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼装获,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了厉颤?” 一聲冷哼從身側響起穴豫,我...
    開封第一講書人閱讀 39,899評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎逼友,沒想到半個月后精肃,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,457評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡翁逞,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,529評論 3 341
  • 正文 我和宋清朗相戀三年肋杖,在試婚紗的時候發(fā)現(xiàn)自己被綠了溉仑。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片挖函。...
    茶點故事閱讀 40,664評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖浊竟,靈堂內(nèi)的尸體忽然破棺而出怨喘,到底是詐尸還是另有隱情,我是刑警寧澤振定,帶...
    沈念sama閱讀 36,346評論 5 350
  • 正文 年R本政府宣布必怜,位于F島的核電站,受9級特大地震影響后频,放射性物質發(fā)生泄漏梳庆。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,025評論 3 334
  • 文/蒙蒙 一卑惜、第九天 我趴在偏房一處隱蔽的房頂上張望膏执。 院中可真熱鬧,春花似錦露久、人聲如沸更米。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽征峦。三九已至迟几,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間栏笆,已是汗流浹背类腮。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留蛉加,地道東北人存哲。 一個月前我還...
    沈念sama閱讀 49,081評論 3 377
  • 正文 我出身青樓,卻偏偏與公主長得像七婴,于是被迫代替她去往敵國和親祟偷。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,675評論 2 359