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

先看最終的效果
WechatIMG6.jpeg

本文章是基于文章一,開始講解的。
效果就是個3D的正方體的盒子。
如果實現這個效果需要的步驟:
1.創(chuàng)建窗口
2.初始化環(huán)境(Context)
3.申請緩存區(qū)(渲染緩存,深度測試,幀緩存)
4.加載著色器關聯鏈接程序
5.設置頂點
6.加載紋理
7.渲染
其中,創(chuàng)建窗口,初始化環(huán)境(Context),申請緩存區(qū)(渲染緩存,幀緩存),加載著色器關聯鏈接程序,設置頂點,加載紋理。
這幾個步驟同文章一,下面主要講解下申請緩存區(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);
    // 關聯深度緩沖到幀緩沖區(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ū),就是一塊內存區(qū)域,專門儲存著每個像素點(繪制在屏幕上的)深度值。深度值(Z值)越大,則離攝像機越遠。
  3. 為什么需要緩沖區(qū)?
    在不使用深度測試的時候,如果我們先繪制一個距離比較近的物理,再繪制距離較遠的物理,則距離遠的位圖因為后繪制,會被距離近的物體覆蓋掉。有了深度緩沖區(qū)后,繪制 物體的順序就不那么重要的。實際上,只要存在深度緩沖區(qū),OpenGL都會把像素的深度值寫入到緩沖區(qū)中。除非調用glDepthMask(GL_FALSE)來禁止寫入。
  4. 為什么每次渲染需要執(zhí)行一次Clear
    深度緩沖區(qū)原理就是把一個距離觀察平面(近裁剪面)的深度值(或距離)與窗口中的每個像素相關聯。
    首先,使用glClear(GL_DEPTH_BUFFER_BIT),把所有像素的深度值設置為最大值(一般是遠裁剪面)。然后,在場景中以任意次序繪制所有物體。硬件或者軟件所執(zhí)行的圖形計算把每一個繪制表面轉換為窗口上一些像素的集合,此時并不考慮是否被其他物體遮擋。其次,OpenGL會計算這些表面和觀察平面的距離。如果啟用了深度緩沖區(qū),在繪制每個像素之前,OpenGL會把它的深度值和已經存儲在這個像素的深度值進行比較。新像素深度值<原先像素深度值,則新像素值會取代原先的;反之,新像素值被遮擋,他顏色值和深度將被丟棄。為了啟動深度緩沖區(qū),必須先啟動它,即glEnable(GL_DEPTH_TEST)。每次繪制場景之前,需要先清除深度緩沖區(qū),即glClear(GL_DEPTH_BUFFER_BIT),然后以任意次序繪制場景中的物體。

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

記得Star!Star!

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內容