【问题标题】:OpenGL Framebuffer only writing to one face of cubemapOpenGL帧缓冲区只写入立方体贴图的一个面
【发布时间】:2017-06-21 16:59:17
【问题描述】:

我似乎只能将我的场景渲染到立方体贴图的一侧。目前一切都是硬编码的,我只是试图将场景的相同视图渲染到立方体贴图的 6 个面中,如下所示:

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

根据我给 glFramebufferTexture2D() 的“GL_TEXTURE_CUBE_MAP_..._.”值,它总是将场景渲染到那张脸 - 就像它没有根据什么交换要渲染的脸“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个相关案例,但都没有解决

【问题讨论】:

  • 我认为您应该将GL_TEXTURE_CUBE_MAP_NEGATIVE_X 替换为GL_TEXTURE_CUBE_MAP_POSITIVE_X,因为它是按顺序排列的第一个立方体贴图面。
  • glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, m_TxId, 0); 这行应该会出错,因为m_TxId 不是二维纹理。这是一个立方体贴图纹理。
  • 嘿 Nicol,谢谢我已经从 fbo 初始化代码中删除了 glFramebufferTexture2D() 行,无论如何它是不必要的,仍然只有一张脸被渲染成:(

标签: opengl framebuffer render-to-texture


【解决方案1】:

您只有一个深度缓冲区。由于您对每个面进行完全相同的渲染,并假设默认的glDepthFunc() 比较模式为GL_LESS,因此第一次迭代后生成的所有片段都将无法通过深度测试。

您需要在循环中清除深度缓冲区。可能需要也可能不需要清除颜色缓冲区,具体取决于您绘制场景的方式。

【讨论】:

  • 你是个明星 :) 我已经坚持了 2 天多了,非常感谢你帮助我 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多