I'm following TheCherno's tutorials on OpenGL (I've gone ahead and modified a few things though). I'm on MacOS mojave and have OpenGL 2.1. However, when I got to the ImGui part of the tutorial, things started behaving weirdly.
Since I have an older version of OpenGL, I'm using the glfw_opengl2_impl of ImGui, and the example code at https://github.com/ocornut/imgui/blob/master/examples/example_glfw_opengl2/main.cpp works, but I have to include a few other cpp files in addition to the .h files (seen at the top of my code).
When I tried this with my own code, I've found that I had to unbind shaders, vertex buffers/index buffers, and vertex arrays before calling ImGui_ImplOpenGL2_RenderDrawData(ImGui::GetDrawData());
This actually worked as intended once, but upon closing and restarting the program, the windows have refused to focus and the text is displaying as rectangles. Like
this.
My code:
#include "imgui.h"
#include "imgui_impl_opengl2.h"
#include "imgui_impl_glfw.h"
#include "imgui.cpp"
#include "imgui_impl_glfw.cpp"
#include "imgui_impl_opengl2.cpp"
#include "imgui_draw.cpp"
#include "imgui_widgets.cpp"
#include "imgui_demo.cpp"
// other includes
// Init GLEW, GLFW, etc
// Removing this chunk of code fixes the problem
localBuf = stbi_load(path.c_str(), &width, &height, &bits, 4);
glGenTextures(1, &id);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, id);
setRenderHints({{GL_TEXTURE_MIN_FILTER, GL_NEAREST}, {GL_TEXTURE_MAG_FILTER, GL_NEAREST}});
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, localBuf);
if (localBuf) {
stbi_image_free(localBuf);
}
glGenerateMipmap(GL_TEXTURE_2D);
IMGUI_CHECKVERSION();
ImGui::CreateContext();
ImGuiIO& io = ImGui::GetIO(); (void)io;
ImGui::StyleColorsClassic();
ImGui_ImplGlfw_InitForOpenGL(window, true);
ImGui_ImplOpenGL2_Init();
while (!glfwWindowShouldClose(win)) {
// some logic for the camera ...
ImGui_ImplOpenGL2_NewFrame();
ImGui_ImplGlfw_NewFrame();
ImGui::NewFrame();
{
ImGui::Begin("Hello, world!");
ImGui::ColorEdit3("Tint: ", (float *) &tint);
ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / ImGui::GetIO().Framerate,
ImGui::GetIO().Framerate);
ImGui::Text("Count: %iu", counter);
ImGui::End();
}
ImGui::Render();
glClearColor(0.25f, 0.25f, 1, 1);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glDrawElements(GL_QUADS, 24, GL_UNSIGNED_INT, nullptr);
glBindVertexArray(0);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
glUseProgram(0);
ImGui_ImplOpenGL2_RenderDrawData(ImGui::GetDrawData());
glUseProgram(shader);
glBindVertexArray(vao);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo);
/* Swap front and back buffers */
glfwSwapBuffers(window);
/* Poll for and process events */
glfwPollEvents();
}
ImGui_ImplOpenGL2_Shutdown();
ImGui_ImplGlfw_Shutdown();
ImGui::DestroyContext();
// terminate glfw.
Edit: I just discovered that completely removing all the textures fixes the problem. Unbinding the textures before the draw does nothing.
Edit 2: apparently having multiple textures is the problem?!! Having one texture is fine, but having multiple causes this issue. Again, unbinding does nothing.