2017-06-21 119 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