OpenGL ES 幀緩衝區位塊傳送

前文 OpenGL ES 多目標渲染(MRT) 咱們瞭解了利用 MRT 技術能夠一次渲染到多個緩衝區,本文將利用幀緩衝區位塊傳送實現高性能緩衝區之間的像素拷貝。


OpenGL ES 幀緩衝區位塊傳送


幀緩衝區位塊傳送(Blit)也是 OpenGL ES 3.0 的新特性,主要用於幀緩衝區之間的像素拷貝,性能高且使用方便,能夠指定緩衝區任意矩形區域的像素拷貝。web


幀緩衝區位塊傳送(Blit)api

本文的繪製流程是,新建一個 FBO 綁定紋理做爲顏色附着,而後綁定該幀緩衝區進行一次離屏渲染,最後綁定渲染到屏幕的緩衝區做爲渲染緩衝區,重新的幀緩衝區中拷貝像素。api


渲染代碼:微信


//首先獲取當前默認幀緩衝區的 id 
GLint defaultFrameBuffer = GL_NONE;
glGetIntegerv(GL_FRAMEBUFFER_BINDING, &defaultFrameBuffer);

//綁定咱們新建立的幀緩衝區進行渲染
glBindFramebuffer(GL_FRAMEBUFFER, m_FBO);
glViewport ( 00, m_RenderImage.width, m_RenderImage.height);
glClear(GL_COLOR_BUFFER_BIT);
glDrawBuffers(ATTACHMENT_NUM, attachments);

glUseProgram (m_ProgramObj);
glBindVertexArray(m_VaoId);
UpdateMVPMatrix(m_MVPMatrix, 0, m_AngleY, (float)screenW / screenH);
glUniformMatrix4fv(m_MVPMatLoc, 1, GL_FALSE, &m_MVPMatrix[0][0]);

glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, m_TextureId);
glUniform1i(m_SamplerLoc, 0);

glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, (const void *)0);

//綁定默認的幀緩衝區對象,將像素重新建的幀緩衝區拷貝到當前默認的幀緩衝區
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, defaultFrameBuffer);
glViewport ( 00, m_SurfaceWidth, m_SurfaceHeight);
glClear(GL_COLOR_BUFFER_BIT);

//位塊傳送
BlitTextures();


進行幀緩衝區間位塊傳以前,須要指定好源幀緩衝區 GL_READ_FRAMEBUFFER 和目標幀緩衝區 GL_DRAW_FRAMEBUFFER,下面代碼實現是將四個顏色附着對應的緩衝區像素,分別拷貝到當前渲染緩衝區中的 1/4 矩形區域內:app


void FBOBlitSample::BlitTextures() {
    //很重要,指定源幀緩衝區
    glBindFramebuffer(GL_READ_FRAMEBUFFER, m_FBO);

    glReadBuffer(GL_COLOR_ATTACHMENT0);
    glBlitFramebuffer(00, m_RenderImage.width, m_RenderImage.height,
                        00, m_SurfaceWidth/2, m_SurfaceHeight/2,
                        GL_COLOR_BUFFER_BIT, GL_LINEAR);

    glReadBuffer(GL_COLOR_ATTACHMENT1);
    glBlitFramebuffer(00, m_RenderImage.width, m_RenderImage.height,
                        m_SurfaceWidth/20, m_SurfaceWidth, m_SurfaceHeight/2,
                        GL_COLOR_BUFFER_BIT, GL_LINEAR);

    glReadBuffer(GL_COLOR_ATTACHMENT2);
    glBlitFramebuffer(00, m_RenderImage.width, m_RenderImage.height,
                        0, m_SurfaceHeight/2, m_SurfaceWidth/2, m_SurfaceHeight,
                        GL_COLOR_BUFFER_BIT, GL_LINEAR);

    glReadBuffer(GL_COLOR_ATTACHMENT3);
    glBlitFramebuffer(00, m_RenderImage.width, m_RenderImage.height,
                        m_SurfaceWidth/2, m_SurfaceHeight/2, m_SurfaceWidth, m_SurfaceHeight,
                        GL_COLOR_BUFFER_BIT, GL_LINEAR);
}


最後呈現的效果是將四張圖像渲染到一個屏幕上。
編輯器


幀緩衝區位塊傳送(Blit)


-- END --性能


進技術交流羣,掃碼添加個人微信:Byte-Flo學習



獲取視頻教程和源碼flex



推薦:
google

字節流動 OpenGL ES 技術交流羣來啦
spa

FFmpeg + OpenGL ES 實現 3D 全景播放器

FFmpeg + OpenGLES 實現視頻解碼播放和視頻濾鏡

一文掌握 YUV 圖像的基本處理

Android OpenGL ES 從入門到精通系統性學習教程

OpenGL ES 實現動態(水波紋)漣漪效果


以爲不錯,點個在看唄~

本文分享自微信公衆號 - 字節流動(google_developer)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索