Почему я получаю GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT? - PullRequest
0 голосов
/ 18 сентября 2011

Я занимаюсь разработкой приложения для Android 2.2 с NDK r6b. Я разрабатываю код OpenGL ES 2.0 как собственный код (C ++).

У меня есть этот код C ++:

RenderingEngine2::RenderingEngine2()
{
    // Create & bind the color buffer so that the caller can allocate its space.
    glGenRenderbuffers(1, &m_renderbuffer);
    checkGlError("01 - glGenRenderbuffers");
    glBindRenderbuffer(GL_RENDERBUFFER, m_renderbuffer);
    checkGlError("02 - glBindRenderbuffer");
    LOG("RenderingEngine2::RenderingEngine2()");
}

void RenderingEngine2::Initialize(int width, int height)
{
    LOG("RenderingEngine2::Initialize");
    glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA4, width, height);
    // Create the framebuffer object and attach the color buffer.

    glGenFramebuffers(1, &m_framebuffer);
    checkGlError("03 - glGenFramebuffers");
    glBindFramebuffer(GL_FRAMEBUFFER, m_framebuffer);
    checkGlError("04 - glBindFramebuffer");
    glFramebufferRenderbuffer(GL_FRAMEBUFFER,
                              GL_COLOR_ATTACHMENT0,
                              GL_RENDERBUFFER,
                              m_renderbuffer);
    checkGlError("05 - glFramebufferRenderbuffer");

    GLint status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
    if(status == GL_FRAMEBUFFER_COMPLETE)
    {
        LOG("Framebuffer completed");
    }
    else
    {
        LOGE("Framebuffer error: (0x%x)", status);
    }
    glViewport(0, 0, width, height);
    checkGlError("06 - glViewPort");

    m_simpleProgram = BuildProgram(SimpleVertexShader, SimpleFragmentShader);

    glUseProgram(m_simpleProgram);
    checkGlError("07 - glUseProgram");

    // Initialize the projection matrix.
    ApplyOrtho(2, 3);

    // Initialize rotation animation state.
    OnRotate(DeviceOrientationPortrait);
    m_currentAngle = m_desiredAngle;
}

Когда я запускаю его, я получаю GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT.

Ты знаешь почему?

Ответы [ 3 ]

0 голосов
/ 18 сентября 2011

A возможно решение состоит в том, чтобы использовать стандартный кадровый буфер, предоставляемый оконной системой, который равен 0.

Мне не нравится это решение , потому что я не знаю, почему я не могу сгенерировать FrameBuffer или я могу использовать стандартный кадровый буфер, предоставляемый оконной системой.

Вот мой модифицированный код:

RenderingEngine2::RenderingEngine2()
{
    // Create & bind the color buffer so that the caller can allocate its space.
    glGenRenderbuffers(1, &m_renderbuffer);
    checkGlError("01 - glGenRenderbuffers");
    glBindRenderbuffer(GL_RENDERBUFFER, m_renderbuffer);
    checkGlError("02 - glBindRenderbuffer");
    LOG("RenderingEngine2::RenderingEngine2()");
}

void RenderingEngine2::Initialize(int width, int height)
{
    LOG("RenderingEngine2::Initialize");
/*
    glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA4, width, height);
    // Create the framebuffer object and attach the color buffer.

    glGenFramebuffers(1, &m_framebuffer);
    */
    m_framebuffer = (GLuint) 0;
    checkGlError("03 - glGenFramebuffers");
    glBindFramebuffer(GL_FRAMEBUFFER, m_framebuffer);
    checkGlError("04 - glBindFramebuffer");

    glFramebufferRenderbuffer(GL_FRAMEBUFFER,
                              GL_COLOR_ATTACHMENT0,
                              GL_RENDERBUFFER,
                              m_renderbuffer);
    checkGlError("05 - glFramebufferRenderbuffer");

    GLint status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
    if(status == GL_FRAMEBUFFER_COMPLETE)
    {
        LOG("Framebuffer completed");
    }
    else
    {
        LOGE("Framebuffer error: (0x%x)", status);
    }

    glViewport(0, 0, width, height);
    checkGlError("06 - glViewPort");

    m_simpleProgram = BuildProgram(SimpleVertexShader, SimpleFragmentShader);

    glUseProgram(m_simpleProgram);
    checkGlError("07 - glUseProgram");

    // Initialize the projection matrix.
    ApplyOrtho(2, 3);

    // Initialize rotation animation state.
    OnRotate(DeviceOrientationPortrait);
    m_currentAngle = m_desiredAngle;
}
0 голосов
/ 18 февраля 2013

Попробуйте создать буферы рендеринга глубины и трафарета:

// depth
glGenRenderbuffers(1, &m_depthRenderbuffer);
checkGlError("01 - glGenRenderbuffers");
glBindRenderbuffer(GL_RENDERBUFFER, m_depthRenderbuffer);
checkGlError("02 - glBindRenderbuffer");
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, width, height);

// stencil
glGenRenderbuffers(1, &m_stencilRenderbuffer);
checkGlError("01 - glGenRenderbuffers");
glBindRenderbuffer(GL_RENDERBUFFER, m_stencilRenderbuffer);
checkGlError("02 - glBindRenderbuffer");
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, width, height);

и затем присоедините их к буферу кадров:

glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, m_depthRenderbuffer);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, m_stencilRenderbuffer);
0 голосов
/ 18 сентября 2011

Вы забыли выделить буфер рендера с помощью glRenderbufferStorage ().

...