2012-05-16 4 views
2

렌더링 코드를 쉐이더를 지원하도록 전환하기 시작했습니다. 백 버퍼로 렌더링 할 때 모두 잘 작동합니다. 이제 FBO로 렌더링하려고 노력하고 있습니다 만, 색상과 법선 모두에 흰색 텍스처가 있습니다.여러 텍스처에 대한 OpenGL 렌더링, 결과는 흰색입니다.

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 
나는 현재 렌더 타겟을 설정하는 데 사용

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

그리고 코드 : 여기

내 FBO 생성 코드입니다

답변

3

GL_TEXTURE_MIN_FILTER은 기본값으로 GL_NEAREST_MIPMAP_LINEAR입니다. 밉맵을 제공하거나 GL_LINEAR 또는 GL_NEAREST으로 전환하십시오.

OpenGL 위키 has more.

+0

밉맵에 대해 잊어 버려서 문제가 될 것이라고 생각하지 않았습니다. FBO를위한 glClear에 대한 호출이 없어졌고 텍스처가 거꾸로되어 있었지만, 그것들은 모두 사소한 수정이었습니다 – Phantom5800

+0

그래, 그 잡았다는 많은 사람들을 때렸어. 그러므로 위키에 대한 FAQ – genpfault

관련 문제