2012-05-16 43 views
2

我已經開始將我的渲染代碼切換到支持着色器,並且在渲染到後臺緩衝區時所有工作都正常。所以現在我正在致力於渲染FBO,但我所得到的都是白色紋理,用於顏色和法線。OpenGL渲染到多個紋理,結果是白色

這裏是我的FBO創建代碼:

void RenderTarget_GL::CreateFBO (void) 
{ 
    // if the machine supports the GL FBO extension 
    if (s_supportfbo) 
    { 
    // Create FBO 
    glGenFramebuffersEXT(1, &m_fbo); 
    glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m_fbo); 

    // Create default texture buffer 
    char *buffer = new char [static_cast<int>(g_window->GetWidth() * m_screenWidth) * static_cast<int>(g_window->GetHeight() * m_screenHeight) * 4]; 
    std::memset(buffer, 0, static_cast<int>(g_window->GetWidth() * m_screenWidth) * static_cast<int>(g_window->GetHeight() * m_screenHeight) * 4); 

    // Create Render Texture 
    glGenTextures(1, &m_rendertexture); 
    glBindTexture(GL_TEXTURE_2D, m_rendertexture); 
    glTexImage2D(GL_TEXTURE_2D, 0, 4, static_cast<int>(g_window->GetWidth() * m_screenWidth), static_cast<int>(g_window->GetHeight() * m_screenHeight), 0, GL_RGBA, GL_UNSIGNED_BYTE, buffer); 

    // Bind Render Texture to FBO 
    glBindTexture(GL_TEXTURE_2D, 0); 
    glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, m_rendertexture, 0); 

    // Create Normal Texture if this FBO will be rendering normals 
    if (m_hasnormal) 
    { 
     glGenTextures(1, &m_normaltexture); 
     glTexImage2D(GL_TEXTURE_2D, 0, 4, static_cast<int>(g_window->GetWidth() * m_screenWidth), static_cast<int>(g_window->GetHeight() * m_screenHeight), 0, GL_RGBA, GL_UNSIGNED_BYTE, buffer); 

     // Bind Normal Texture to FBO 
     glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT1_EXT, GL_TEXTURE_2D, m_normaltexture, 0); 
    } 

    // UnBind FBO and cleanup default buffer 
    delete [] buffer; 
    Clear(); 
    } 
} 

和代碼我用來設置當前的渲染目標:

void RenderTarget_GL::Set (void) 
{ 
    if (s_supportfbo && g_glgraphics->GetShaderEnabled()) 
    { 
    static const GLenum buffer1[] = {GL_COLOR_ATTACHMENT0_EXT}; 
    static const GLenum buffer2[] = {GL_COLOR_ATTACHMENT0_EXT, GL_COLOR_ATTACHMENT1_EXT}; 

    glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m_fbo); 
    if (m_hasnormal) 
     glDrawBuffers(2, buffer2); 
    else 
     glDrawBuffers(1, buffer1); 
    } 
} 

最後,我實際的繪製代碼:

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); 
// Setup the camera transformation 
glMatrixMode(GL_MODELVIEW); 
glPushMatrix(); 

if (m_camera) 
    m_camera->GLMatrix(); 
else 
    m_defaultCam.GLMatrix(); 

// Setup Render Target 
if (m_shaderenabled) 
{ 
    glPushAttrib(GL_VIEWPORT_BIT); 
    glViewport(0,0,g_window->GetWidth(),g_window->GetHeight()); 
    m_initialpass->Set(); 
} 

// Draw All Objects with their per-object shaders 

// Clear render target and shader bindings 
if (m_shaderenabled) 
{ 
    glPopAttrib(); 
    RenderTarget_GL::Clear(); 
    Shader_GL::ClearShaderBinding(); 
} 

glPopMatrix(); 

glMatrixMode(GL_PROJECTION); 
glPushMatrix(); 
glLoadIdentity(); 

// Draw Scene 
glActiveTexture(GL_TEXTURE0); 
glBindTexture(GL_TEXTURE_2D, m_initialpass->GetColorTexture()); 
glBegin(GL_QUADS); 
    glTexCoord2f(0.0f, 0.0f); 
    glVertex3f(-1.0f, -1.0f, 0.0f); 
    glTexCoord2f(1.0f, 0.0f); 
    glVertex3f(1.0f, -1.0f, 0.0f); 
    glTexCoord2f(1.0f, 1.0f); 
    glVertex3f(1.0f, 1.0f, 0.0f); 
    glTexCoord2f(0.0f, 1.0f); 
    glVertex3f(-1.0f, 1.0f, 0.0f); 
glEnd(); 

Texture_GL::ClearTextureBinding(); 
glPopMatrix(); 

// Swap Buffers 

回答

3

GL_TEXTURE_MIN_FILTER默認爲GL_NEAREST_MIPMAP_LINEAR。提供mipmap或切換到GL_LINEARGL_NEAREST

The OpenGL Wiki has more

+0

謝謝,忘了mipmapping,並不認爲這會是一個問題。也錯過了爲FBO調用glClear,並且我的紋理是顛倒的,但這些都是微不足道的修復 – Phantom5800

+0

是的,這個陷阱似乎碰到了很多人。因此Wiki上的常見問題解答:) – genpfault