本文章是基于文章一突雪,開始講解的。
效果就是個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.什么是深度測試
- 深度測試的概念:
深度其實就是該像素點在3D世界中距離攝像機的距離Z值 - 什么是深度緩沖區(qū)味榛?
深度緩存區(qū)椭坚,就是一塊內(nèi)存區(qū)域,專門儲存著每個像素點(繪制在屏幕上的)深度值励负。深度值(Z值)越大藕溅,則離攝像機越遠匕得。 - 為什么需要緩沖區(qū)继榆?
在不使用深度測試的時候,如果我們先繪制一個距離比較近的物理汁掠,再繪制距離較遠的物理略吨,則距離遠的位圖因為后繪制,會被距離近的物體覆蓋掉考阱。有了深度緩沖區(qū)后翠忠,繪制 物體的順序就不那么重要的。實際上乞榨,只要存在深度緩沖區(qū)秽之,OpenGL都會把像素的深度值寫入到緩沖區(qū)中。除非調(diào)用glDepthMask(GL_FALSE)來禁止寫入吃既。 - 為什么每次渲染需要執(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!