2017-09-12 207 views
0

也許我有一些愚蠢的問題。如果有人能回覆他們,我將不勝感激。 所有問題都基於Android環境和OpenGL ES。當我使用glBlitFramebuffer實現MSAA時,我收到無效的操作

  1. 如何驗證我是否已打開MSAA?如果我繪製點數爲50的GL_POINTS,有一些小方塊。如果我啓用了4x MSAA,那麼小方格可以變成圓點嗎?

  2. 我盡我所能使用FBO和BlitFBO啓用MSAA。但是它沒有畫任何東西,並且在調用glBlitFramebuffer()之後有INVALID_OPERATION錯誤。

這裏是我超過上述規定的完整項目:https://github.com/Enoch-Liu/GL

而下面是關鍵代碼:

void Renderer::MultisampleAntiAliasing() { 
    glGenRenderbuffers(1, &m_MSColor); 
    glBindRenderbuffer(GL_RENDERBUFFER, m_MSColor); 
    glRenderbufferStorageMultisample(GL_RENDERBUFFER, 4, GL_RGBA8, m_width, m_height); 
    checkGLError("GenMSColorBuffer"); 

    glGenFramebuffers(1, &m_MSFBO); 
    glBindFramebuffer(GL_FRAMEBUFFER, m_MSFBO); 


    glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, m_MSColor); 
    checkGLError("FboRbo,COLORATTACHMENT"); 

    glGenRenderbuffers(1, &m_MSDepth); 
    glBindRenderbuffer(GL_RENDERBUFFER, m_MSDepth); 
    glRenderbufferStorageMultisample(GL_RENDERBUFFER, 4, GL_DEPTH_COMPONENT16, m_width, m_height); 
    checkGLError("GenDepthBuffer"); 

    glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, m_MSDepth); 
    checkGLError("DepthBuffer,Renderbuffer"); 
    GLenum drawBufs[] = {GL_COLOR_ATTACHMENT0}; 
    glDrawBuffers(1, drawBufs); 
    checkGLError("DrawBuffer"); 

    if(glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) { 
     LOG_ERROR("failed to make complete framebuffer object %x", glCheckFramebufferStatus(GL_FRAMEBUFFER)); 
    } 
} 


void Renderer::drawFrame() { 
    //LOG_INFO("drawFrame %d x %d", width, height); 
    static float r=0.9f; 
    static float g=0.2f; 
    static float b=0.2f; 

    LOG_INFO("xxx %d, %d", m_width,m_height); 
    if (OPENMSAA) 
    { 
     glBindFramebuffer(GL_FRAMEBUFFER, m_MSFBO); 
     glBindRenderbuffer(GL_RENDERBUFFER, m_MSColor); 
     checkGLError("BindTwoBuffers"); 
    } 

    glViewport(0,0,m_width,m_height); 
    glScissor(0,0,m_width,m_height); 

    glClearColor(r, g, b, 1.0f); 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
    glDisable(GL_DEPTH_TEST); 

    const GLfloat landscapeOrientationMatrix[16] = { 
      1.0f, 0.0f, 0.0f, 0.0f, 
      0.0f, 1.0f, 0.0f, 0.0f, 
      0.0f, 0.0f, 0.0f, 0.0f, 
      0.0f, 0.0f, 0.0f, 1.0f }; 
    const GLfloat color[4] = { 
      1.0f, 0.0f, 0.0f, 1.0f 
    }; 
    glUseProgram(m_program); 
    glUniformMatrix4fv(m_uMvp, 1, GL_FALSE, landscapeOrientationMatrix); 
    glUniform4fv(m_uColor, 1, color); 
    m_p = glGetAttribLocation(m_program, "vPosition"); 
    m_p1 = glGetAttribLocation(m_program, "vPosition1"); 

    glEnableVertexAttribArray(m_p); 
    glVertexAttribPointer(m_p , 3, GL_FLOAT, false, 3 * sizeof(float), squareCoords); 

    glDrawArrays(GL_POINTS, 0, 4); 
    glDisableVertexAttribArray(m_p); 
    glFlush(); 
    checkGLError("Before Blit"); 
    if (OPENMSAA) 
    { 
     glBindFramebuffer(GL_READ_FRAMEBUFFER, m_MSFBO); 
     checkGLError("BindReadBuffer"); 
     glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0); 
     checkGLError("BindFramebuffer"); 
     glBlitFramebuffer(0, 0, m_width, m_height, 0, 0, m_width, m_height, GL_COLOR_BUFFER_BIT, GL_NEAREST); 
     checkGLError("BlitFramebufferColor"); 
     glBlitFramebuffer(0, 0, m_width, m_height, 0, 0, m_width, m_height, GL_DEPTH_BUFFER_BIT, GL_NEAREST); 
     checkGLError("BlitFramebufferDepth"); 
     glBindFramebuffer(GL_READ_FRAMEBUFFER, 0); 
     glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0); 
    } 
} 

幀緩衝器完成。

+1

MSAA不影響點是否呈現爲圓形或正方形。它只能在子像素基礎上平滑邊緣。 – BDL

+0

非常感謝,BDL。 –

回答

0

深度緩衝區的內部格式必須匹配:https://www.opengl.org/discussion_boards/showthread.php/173275-Alternative-to-glBlitFramebuffer%28%29

看你的github上的項目您沒有配置深度緩衝可言。從您的項目:

const EGLint attribs[] = { 

//  EGL_SURFACE_TYPE, EGL_WINDOW_BIT, 

     EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT, 

     EGL_SURFACE_TYPE, EGL_PBUFFER_BIT, 

     EGL_BLUE_SIZE, 8, 

     EGL_GREEN_SIZE, 8, 

     EGL_RED_SIZE, 8, 

     EGL_ALPHA_SIZE, 8, 

     EGL_SAMPLE_BUFFERS, 1, 

     EGL_SAMPLES, 4, 

     EGL_NONE 

}; 
+0

是的!你是對的 !但是,在我的代碼中,執行FBO-Blit MSAA的屬性應該更少。 EGL_SAMPLE_BUFFERS和EGL_SAMPLES也應該刪除。和正確的代碼如下:常量EGLint attribs [] = { EGL_SURFACE_TYPE,EGL_WINDOW_BIT, EGL_RENDERABLE_TYPE,EGL_OPENGL_ES2_BIT, EGL_BLUE_SIZE,8, EGL_GREEN_SIZE,8, EGL_RED_SIZE,8, EGL_ALPHA_SIZE,8, EGL_NONE }; –

相關問題