2011-09-18 282 views
0

我正在開發一款採用NDK r6b的Android 2.2應用程序。我正在開發OpenGL ES 2.0代碼作爲本機代碼(C++)。爲什麼我會得到一個GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT?

我有這樣的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。

你知道爲什麼嗎?

回答

0

你忘了用glRenderbufferStorage()分配你的渲染緩衝區。

+0

對不起,但這不是問題。我取消了評論,但仍然收到相同的錯誤。感謝您的回答。 – VansFannel

0

一個可能解決方案是使用默認的窗口系統提供的幀緩衝區,這是0

我不喜歡這個解決方案,因爲我不知道我爲什麼不能產生一個FrameBuffer,或者如果我可以使用默認的window-system提供的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

嘗試創建深度和模板renderbuffers:

// 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); 
相關問題