프로그래밍 언어/C++

ImGui 기본 사용법

readme.md 2024. 9. 9. 23:45

출처: https://github.com/ocornut/imgui/wiki/Getting-Started

ImGui는 여러 플랫폼을 지원하는 C++ GUI 라이브러리이다. ImGui를 사용하는 방법은 다음과 같다.

1. 컴파일링/링킹

ImGui를 자신의 프로젝트에서 사용하기 위한 컴파일, 링킹 단계이다. ImGui 위키의 내용을 따라 다음과 같이 진행해주면 된다.

  1. master 혹은 docking 브랜치 중에서 하나를 선택한다.
  2. 선택한 브랜치를 자신의 프로젝트의 서브모듈로 추가하거나, 압축을 풀어 프로젝트 경로에 위치시킨다.
  3. 자신의 프로젝트나 빌드 시스템에 따라서 ImGui의 파일들을 추가해준다. 선택한 파일들은 프로젝트에 컴파일/링킹된다.
    • 루트 디렉토리에 있는 모든 *.cpp, *.h 파일을 추가한다.
    • backends 경로에 있는 imgui_impl_xxxx 라는 이름을 가진 파일들을 자신의 개발 환경에 맞춰 추가해야 한다. ImGui는 별도의 .lib 파일을 제공하지 않고, backends에서 선택한 파일을 빌드하여 사용하기 때문에 다음과 같이 빌드를 위한 소스 파일을 만들어 준다. 이 파일이 빌드되어 생성된 바이너리를 이용해서 프로젝트 내에서 ImGui를 사용할 수 있게 된다.
// ImGuiBuild.cpp
// glfw + openl3 사용 예제

#include <glad/glad.h> // for imgui_opengl3.cpp

#include "backends/imgui_impl_glfw.cpp"
#include "backends/imgui_impl_opengl3.cpp"

2. ImGui & Backends 설정하기

이제 프로젝트에서 ImGui와 Backends를 사용할 차례이다. 각 플랫폼에 따른 세부적인 구현 내용들은 ImGui 프로젝트의 example 하위 경로에서 찾아볼 수 있다. glfw, opengl3을 사용하는 일반적인 코드 작성 루틴은 다음과 같다.

  1. ImGui를 사용하려는 파일에 메인 라이브러리(imgui.h)와 백엔드(imgui_impl_glfw.h, imgui_impl_opengl3.h)를 추가해준다.
#include "imgui.h"
#include "imgui_impl_glfw.h"
#include "imgui_impl_opengl3.h"
  1. ImGui::CreateContext 함수를 이용해 컨텍스트를 생성해준다.
  2. 백엔드에서 설정한 플랫폼의 초기화를 진행해준다.
// Setup Dear ImGui context
IMGUI_CHECKVERSION();
ImGui::CreateContext();
ImGuiIO& io = ImGui::GetIO();
io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard;     // Enable Keyboard Controls
io.ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad;      // Enable Gamepad Controls
io.ConfigFlags |= ImGuiConfigFlags_DockingEnable;         // IF using Docking Branch

// Setup Platform/Renderer backends
ImGui_ImplGlfw_InitForOpenGL(YOUR_WINDOW, true);          // Second param install_callback=true will install GLFW callbacks and chain to existing ones.
ImGui_ImplOpenGL3_Init();
  1. 메인 루프의 시작(Start).(poll events + ImGui_ImplXXX_NewFrame() + ImGui::NewFrame() 로 구성됨)
// (Your code calls glfwPollEvents())
// ...
// Start the Dear ImGui frame
ImGui_ImplOpenGL3_NewFrame();
ImGui_ImplGlfw_NewFrame();
ImGui::NewFrame();
ImGui::ShowDemoWindow(); // Show demo window! :)
  1. 메인 루프의 끝(End).(ImGui::Render() + ImGui_ImplXXX_Render() 로 구성됨)
// Rendering
// (Your code clears your framebuffer, renders your other stuff etc.)
ImGui::Render();
ImGui_ImplOpenGL3_RenderDrawData(ImGui::GetDrawData());
// (Your code calls glfwSwapBuffers() etc.)
  1. 대부분의 백엔드는 이벤트 처리를 위한 함수를 제공한다.
  2. 백엔드 및 ImGui 컨텍스트 종료
ImGui_ImplOpenGL3_Shutdown();
ImGui_ImplGlfw_Shutdown();
ImGui::DestroyContext();
  1. 어플리케이션의 입력 로직에서 ImGui::GetIO()WantCaptureMouse/WantCaptureKeyboard 를 폴링하여 ImGui가 기본 앱에서 마우스/키보드 입력을 차단하는지 확인할 수 있다. 예를 들어 창을 호버링하면 WantCaptureMouse가 true로 설정되면, 마우스 이벤트를 메인 어플리케이션으로 전달하지 않는 전략을 취할 수 있다.