0

也许我有一些愚蠢的问题。如果有人可以回复他们,我将不胜感激。所有问题都基于Android环境和OpenGL ES。

  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);
    }
}

帧缓冲区已完成。

4

1 回答 1

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

};
于 2017-09-14T19:02:17.770 回答