невозможно добавить im gui в существующую сцену OpenGL - PullRequest
0 голосов
/ 04 августа 2020

Я пытаюсь добавить im gui для отладки сцены, но im gui всегда визуализируется сзади независимо от порядка, в котором я вызываю визуализацию. scene и im gui отрисовывается нормально, если выполняется индивидуально (с комментариями к другому). Я попытался отключить проверку глубины, используя функцию трафарета, каждый раз, когда сначала отображается im gui. render l oop как

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

также для инициализации Im Gui, так как я инициализировал ядро ​​окна с помощью opengl 4.4

ImGui_ImplOpenGL3_Init("#version 440");

, также этот код находится в другом пространстве имен и делает dll, который затем связывается.

Изменить: я получил ошибку, которой на самом деле не было, я использовал ImGui_ImplOpenGL3_RenderDrawData(ImGui::GetDrawData()); после glfwSwapBuffers(window);

1 Ответ

0 голосов
/ 04 августа 2020

Может показаться, что

ImGui_ImplOpenGL3_RenderDrawData(ImGui::GetDrawData());

- это то, что на самом деле отображает интерфейс Im gui, но это происходит сразу после

glClear(GL_COLOR_BUFFER_BIT);

, в то время как это происходит в конце l oop на практике произойдет следующее:

  1. Clear

  2. Draw Im GUi

  3. DrawRest

  4. Clear

et c ..

, поэтому im Gui всегда будет назад. Чтобы исправить это, попробуйте поставить

ImGui_ImplOpenGL3_RenderDrawData(ImGui::GetDrawData());

перед

glClearColor(0.1f, 0.1f, 0.1f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT)

и посмотрите, исправит ли это это.

...