当我使用glBlitFramebuffer实现MSAA时,我收到了无效操作

时间:2017-09-12 07:56:41

标签: android opengl-es framebuffer msaa

也许我有一些愚蠢的问题。如果有人能回复,我会很感激。 所有问题都基于Android环境和OpenGL ES。

  1. 如何验证我是否已打开MSAA?如果我用点大小为50绘制一些glBlitFramebuffer(),则会有一些小方块。如果我启用了4x MSAA,那么小方块是否可以成为圆点?

  2. 我尽力使用FBO和BlitFBO启用MSAA。但它没有得出任何内容,并且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); } } 调用后出现了INVALID_OPERATION错误。

  3. 以下是我上面提到的完整项目:to_csv

    以下是关键代码:

    @angular/common/http

    帧缓冲完成。

1 个答案:

答案 0 :(得分: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

};