【问题标题】:Depth Testing isn't working when rendering into an FBO渲染到 FBO 时深度测试不起作用
【发布时间】:2022-10-22 11:41:20
【问题描述】:

我正在尝试在帧缓冲区内渲染 3d 金字塔以在 ImGui 窗口中显示它。但是深度测试失败了,我得到了这个:

这是我所拥有的:

glEnable(GL_DEPTH_TEST);
while (!glfwWindowShouldClose(mainwin))
{
    glClearColor(0.5f, 0.5f, 0.5f, 1.0f);

    ImGui_ImplOpenGL3_NewFrame();
    ImGui_ImplGlfw_NewFrame();
    ImGui::NewFrame();

    glEnable(GL_DEPTH_TEST);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
   

    fbo.bind();//framebufferobject bind

    glClearColor(0.8f, 0.8f, 0.8f, 1.0f);

    glEnable(GL_DEPTH_TEST);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    /* Render here */       
    defaultshader.Activate();

    // Handles camera inputs
    camera1.Inputs(mainwin);
    // Updates and exports the camera matrix to the Vertex Shader
    camera1.Matrix(45.0f, 0.1f, 100.0f, defaultshader, "camMatrix");

    tex1.Bind();
    VAO1.Bind();
    // Draw primitives, number of indices, datatype of indices, index of indices
    glDrawElements(GL_TRIANGLES, sizeof(indices) / sizeof(int), GL_UNSIGNED_INT, 0);
    //---------------------------------------------------------------------------------------------------------------------------
    fbo.unbind();

    ImGui::Begin("Viewport");

    AppImguiAddImage(fbtex.FBtexID);//adds image to imgui drawlist

    ImGui::End();

    AppImguiFrameEnd();

    /* Swap front and back buffers */
    glfwSwapBuffers(mainwin);

    /* Poll for and process events */
    glfwPollEvents();

}

笔记: 我得到 AppImguiAddImage() 和 Clear() 最初来自: https://gamedev.stackexchange.com/questions/150214/render-in-a-imgui-window

我已经为 while 循环中的两个 Clear() 函数尝试了颜色清除和深度清除的不同组合,以获得相同的结果。

出了什么问题?

【问题讨论】:

  • @JesperJuhl 你的评论有什么意义?显然,OP 说深度测试在 OP 的代码中不起作用。
  • 您的 FBO 是否有深度缓冲附件?
  • @YakovGalka 不,我认为深度和模板缓冲区只能附加到 RBO。我找不到有关如何将深度缓冲区附加到帧缓冲区的资源。您能否提供一些链接或示例行?
  • @SubhamSwostikPradhan,您没有将任何东西附加到 RBO;当您将 RBO 附加到 FBO 时,它们是纹理的替代品。

标签: c++ opengl glfw imgui


【解决方案1】:

您的 FBO 是否有深度缓冲附件?

不, ...

那是你的问题。如果您的 FBO 没有 GL_DEPTH_ATTACHMENT,那么当您渲染到该 FBO 时,深度测试将被禁用。

要在 FBO 上设置 GL_DEPTH_ATTACHMENT,您可以附加渲染缓冲区(使用 glFramebufferRenderbuffer)或纹理(使用 glFramebufferTexture)。这些渲染缓冲区/纹理需要位于​​depth formats 之一中。

【讨论】:

  • 感谢您的回复。 AppImguiAddImage() 只接受纹理引用,所以我不能直接使用 RBO 在 imgui 上绘制图像。有没有办法在纹理上使用深度附件?
  • @SubhamSwostikPradhan 请参阅this link,了解如何使用纹理作为 FBO 的深度缓冲区。
  • @SubhamSwostikPradhan 您可以在使用纹理作为颜色缓冲区时使用 RBO 作为深度。由于 imgui 只需要颜色,所以这不是问题。如果您也坚持使用纹理作为深度,则创建过程基本相同。
  • 谢谢你们!现在可以了。我现在可以将深度附加到 FBO :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多