2017-06-21 71 views
1

我似乎只能將我的場景渲染到立方體貼圖的一側。在一切都硬編碼的那一刻,我只是想渲染場景相同的觀點到每個立方體貼圖的6個面的,就像這樣:OpenGL Framebuffer只寫入立方體貼圖的一張臉

glBindFramebuffer(GL_FRAMEBUFFER, m_FboId); 
    glViewport(0, 0, CUBEMAP_SIZE, CUBEMAP_SIZE); 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

    shader.bind(); 
    shader.loadProjectionMtx(glm::perspective(90.0f, 1.0f, 0.001f, 300.0f)[0][0]); 
    shader.loadViewMtx(glm::lookAt(glm::vec3(0.0f, 0.0f, 0.0f), glm::vec3(1.0f, 0.0f, 0.0f), glm::vec3(0.0f, 1.0f, 0.0f))[0][0]); 

    for (unsigned int f = 0; f < 6; f++) 
    { 
     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_CUBE_MAP_NEGATIVE_X + f, m_glId, 0); 

     for (unsigned int i = 0; i < entities.size(); i++) 
     { 
      // Rendering the scene like normal 
     } 
    } 

    glBindFramebuffer(GL_FRAMEBUFFER, 0); 

根據什麼「GL_TEXTURE_CUBE_MAP_ .. 「__」value我給glFramebufferTexture2D()它總是將場景渲染到那一張臉上 - 就像它不會根據循環中的「f」的值來交換要呈現的臉部。

但是,一個渲染到的立方體面總是呈現正確的。

這裏的立方體貼圖& FBO創建代碼:

glGenFramebuffers(1, &m_FboId); 
    glBindFramebuffer(GL_FRAMEBUFFER, m_FboId); 

    glGenTextures(1, &m_TxId); 
    glBindTexture(GL_TEXTURE_CUBE_MAP, m_TxId); 

    for (unsigned int i = 0; i < 6; i++) 
    { 
     glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, GL_RGB, CUBEMAP_SIZE, CUBEMAP_SIZE, 0, GL_RGB, GL_UNSIGNED_BYTE, (void*)nullptr); 
    } 

    glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 
    glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 
    glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE); 

    glBindTexture(GL_TEXTURE_CUBE_MAP, 0); 

    glGenRenderbuffers(1, &m_DepthId); 
    glBindRenderbuffer(GL_RENDERBUFFER, m_DepthId); 
    glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT24, CUBEMAP_SIZE, CUBEMAP_SIZE); 

    glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, m_TxId, 0); 
    glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, m_DepthId); 

    glDrawBuffer(GL_COLOR_ATTACHMENT0); 

    int fbo_Status = glCheckFramebufferStatus(GL_FRAMEBUFFER); 
    if (fbo_Status != GL_FRAMEBUFFER_COMPLETE) printf(" ::ENGINE:: FBO Creation Failed! glError: %i\n", fbo_Status); 

    glBindFramebuffer(GL_FRAMEBUFFER, 0); 

我已經找到2其他相關案件的在線但是沒有得到解決

+1

我認爲你應該用'GL_TEXTURE_CUBE_MAP_POSITIVE_X'替換'GL_TEXTURE_CUBE_MAP_NEGATIVE_X' ,因爲它是第一個立方體貼圖。 – SurvivalMachine

+0

'glFramebufferTexture2D(GL_FRAMEBUFFER,GL_COLOR_ATTACHMENT0,GL_TEXTURE_2D,m_TxId,0);'這行應該給出錯誤,因爲'm_TxId'不是2D紋理。這是一個立方體貼圖紋理。 –

+0

嘿尼科爾,謝謝我已經從fbo初始化代碼中刪除了glFramebufferTexture2D()行,無論如何它是不必要的,仍然只有一個面被渲染到:( – HelloWorldCpp

回答

1

你只需要一個深度緩衝。由於您在每張臉上渲染完全相同,並且假定GL_LESS的默認比較模式爲glDepthFunc(),所以在第一次迭代後生成的所有片段都將無法進行深度測試。

您需要清除循環中的深度緩衝區。清除顏色緩衝區可能需要也可能不需要,具體取決於您如何繪製場景。

+0

你是一個明星:)我一直卡在這個超過2天,非常感謝你幫助我:) – HelloWorldCpp