2017-09-12 21 views
0

おそらく私はいくつかの愚かな問題があります。誰かが返事をくれれば感謝します。 すべての問題は、Android環境とOpenGL ESに基づいています。glBlitFramebufferを使用してMSAAを実装すると無効な操作を受けます

  1. 私がMSAAを開いたかどうかを確認する方法は?ポイントサイズ50のGL_POINTSを描くと、いくつかの小さな四角形があります。私が4x MSAAを有効にした場合、小さな四角形は丸い点になりますか?

  2. FBAとBlitFBOでMSAAを有効にするために最善を尽くしました。しかし、何も描画されず、glBlitFramebuffer()呼び出し後にINVALID_OPERATIONエラーが発生します。ここで

は、私は上記のmentioed完了したプロジェクトです: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も削除する必要があります。次のように正しいコードがある:CONST 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 }。 –

関連する問題