无法将 imgui 添加到现有场景 OpenGL
unable to add imgui to existing scene OpenGL
我正在尝试添加 imgui 以调试场景,但 imgui 总是在后面渲染,无论我调用渲染的顺序如何。如果单独完成(评论另一个),场景和 imgui 渲染良好。我尝试禁用深度测试,使用模板功能,每次首先渲染 imgui。
渲染循环为
void render() {
bool show_demo_window = true;
bool show_another_window = false;
ImVec4 clear_color = ImVec4(0.1f, 0.1f, 0.1f, 1.0f);
float m_time = glfwGetTime();
while (!glfwWindowShouldClose(window))
glfwGetFramebufferSize(window, &framebufferwidth, &framebufferheight);
glViewport(0, 0, framebufferwidth, framebufferheight);
glBindFramebuffer(GL_FRAMEBUFFER, 0);
glBindVertexArray(0);
glBindTexture(GL_TEXTURE_2D, 0);
finalShader->Use();
for (int i = 0; i < finTex.size(); i++) {
finTex[i]->bind();
std::string top = "texture" + std::to_string(i);
finalShader->setUniform1i(top.c_str(), finTex[i]->getTextureUnit());
}
window2D->updateProjMatrix(window);
winCam->sendToShader(finalShader);
window2D->updateModelMatrix();
window2D->Draw();
finalShader->unUse();
// Rendering ImGui
ImGuiIO& io = ImGui::GetIO();
int framebufferwidth;
int framebufferheight;
glfwGetFramebufferSize(window, &framebufferwidth, &framebufferheight);
io.DisplaySize = ImVec2(framebufferwidth, framebufferheight);
float time = glfwGetTime();
io.DeltaTime = 1 / 60.f;
// Start the Dear ImGui frame
ImGui_ImplOpenGL3_NewFrame();
ImGui_ImplGlfw_NewFrame();
ImGui::NewFrame();
if (show_demo_window)
ImGui::ShowDemoWindow(&show_demo_window);
ImGui::EndFrame();
ImGui::Render();
preRender();
postRender();
glfwSwapBuffers(window);
glfwPollEvents();
glClearColor(0.1f, 0.1f, 0.1f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
ImGui_ImplOpenGL3_RenderDrawData(ImGui::GetDrawData());
}
ImGui_ImplOpenGL3_Shutdown();
ImGui_ImplGlfw_Shutdown();
ImGui::DestroyContext();
}
也用于初始化 ImGui,因为我用 opengl 4.4window 核心初始化
ImGui_ImplOpenGL3_Init("#version 440");
此代码也在不同的命名空间中,并生成一个 dll 文件,然后将其链接。
编辑:
我得到的错误实际上不是我在 glfwSwapBuffers(window);
之后使用 ImGui_ImplOpenGL3_RenderDrawData(ImGui::GetDrawData());
好像
ImGui_ImplOpenGL3_RenderDrawData(ImGui::GetDrawData());
是实际渲染 Imgui 界面的东西,但它发生在
之后
glClear(GL_COLOR_BUFFER_BIT);
虽然它发生在循环的末尾,但实际上会发生什么
清除
绘制 ImGUI
DrawRest
清除
等..
所以 imGui 永远在后面。
要修复它,请尝试将
ImGui_ImplOpenGL3_RenderDrawData(ImGui::GetDrawData());
之前
glClearColor(0.1f, 0.1f, 0.1f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT)
看看是否能解决问题。
我正在尝试添加 imgui 以调试场景,但 imgui 总是在后面渲染,无论我调用渲染的顺序如何。如果单独完成(评论另一个),场景和 imgui 渲染良好。我尝试禁用深度测试,使用模板功能,每次首先渲染 imgui。 渲染循环为
void render() {
bool show_demo_window = true;
bool show_another_window = false;
ImVec4 clear_color = ImVec4(0.1f, 0.1f, 0.1f, 1.0f);
float m_time = glfwGetTime();
while (!glfwWindowShouldClose(window))
glfwGetFramebufferSize(window, &framebufferwidth, &framebufferheight);
glViewport(0, 0, framebufferwidth, framebufferheight);
glBindFramebuffer(GL_FRAMEBUFFER, 0);
glBindVertexArray(0);
glBindTexture(GL_TEXTURE_2D, 0);
finalShader->Use();
for (int i = 0; i < finTex.size(); i++) {
finTex[i]->bind();
std::string top = "texture" + std::to_string(i);
finalShader->setUniform1i(top.c_str(), finTex[i]->getTextureUnit());
}
window2D->updateProjMatrix(window);
winCam->sendToShader(finalShader);
window2D->updateModelMatrix();
window2D->Draw();
finalShader->unUse();
// Rendering ImGui
ImGuiIO& io = ImGui::GetIO();
int framebufferwidth;
int framebufferheight;
glfwGetFramebufferSize(window, &framebufferwidth, &framebufferheight);
io.DisplaySize = ImVec2(framebufferwidth, framebufferheight);
float time = glfwGetTime();
io.DeltaTime = 1 / 60.f;
// Start the Dear ImGui frame
ImGui_ImplOpenGL3_NewFrame();
ImGui_ImplGlfw_NewFrame();
ImGui::NewFrame();
if (show_demo_window)
ImGui::ShowDemoWindow(&show_demo_window);
ImGui::EndFrame();
ImGui::Render();
preRender();
postRender();
glfwSwapBuffers(window);
glfwPollEvents();
glClearColor(0.1f, 0.1f, 0.1f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
ImGui_ImplOpenGL3_RenderDrawData(ImGui::GetDrawData());
}
ImGui_ImplOpenGL3_Shutdown();
ImGui_ImplGlfw_Shutdown();
ImGui::DestroyContext();
}
也用于初始化 ImGui,因为我用 opengl 4.4window 核心初始化
ImGui_ImplOpenGL3_Init("#version 440");
此代码也在不同的命名空间中,并生成一个 dll 文件,然后将其链接。
编辑:
我得到的错误实际上不是我在 glfwSwapBuffers(window);
ImGui_ImplOpenGL3_RenderDrawData(ImGui::GetDrawData());
好像
ImGui_ImplOpenGL3_RenderDrawData(ImGui::GetDrawData());
是实际渲染 Imgui 界面的东西,但它发生在
之后glClear(GL_COLOR_BUFFER_BIT);
虽然它发生在循环的末尾,但实际上会发生什么
清除
绘制 ImGUI
DrawRest
清除
等..
所以 imGui 永远在后面。 要修复它,请尝试将
ImGui_ImplOpenGL3_RenderDrawData(ImGui::GetDrawData());
之前
glClearColor(0.1f, 0.1f, 0.1f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT)
看看是否能解决问题。