• Dear ImGui(Immediate Mode Graphical User Interface, ImGui)는 애플리케이션에 디버그 인터페이스, 개발 도구, 실험적인 UI 등을 빠르게 추가하기 위해 사용하는 오픈 소스 C++ 라이브러리

    • 게임 개발이나 그래픽스 프로그래밍같은 실시간 애플리케이션 개발에 많이 사용됨

1. 주요 특징

  • Immediate Mode 기반

    • Immediate Mode란 UI 요소들이 매 프레임마다 다시 생성되고 렌더링된다는 의미

    • 기존의 UI 라이브러리들이 Retained Mode(UI 상태를 내부적으로 유지) 기반이라면, ImGui는 프레임 단위로 UI 상태를 관리하지 않고, 코드에서 직접 그림

  • 간단한 API

    • 버튼, 슬라이더, 체크박스 등의 UI 요소를 몇 줄의 코드로 쉽게 추가 가능

      if (ImGui::Button("Click Me")) {
          // 버튼이 눌렸을 때의 동작
      }
      
      ImGui::SliderFloat("Float Slider", &value, 0.0f, 1.0f);
      
  • 실시간 피드백

    • 애플리케이션 상태나 데이터를 실시간으로 확인하거나 조정하는 데 유용

    • 디버깅용 툴을 빠르게 구현할 때 많이 사용

  • 렌더링 백엔드와 분리

    • 그래픽스 API(DirectX, Vulkan 등)에 독립적으로 설계되어, 다양한 렌더링 백엔드를 지원함

    • UI 요소를 Draw 호출로 변환하고, 이를 렌더링 엔진이 처리하도록 위임

  • 확장성과 커스터마이징

    • 다양한 위젯(슬라이더, 드롭다운 메뉴, 텍스트 입력 등)을 제공하며, 필요에 따라 새로운 UI 요소를 정의할 수도 있음

    • 스타일과 테마 조정도 가능

2. 장점

  • 빠른 프로토타이핑: UI를 빠르게 추가하고 수정 가능

  • 적은 러닝 커프: API가 매우 직관적이여서 사용하기 쉬움

  • 경량성: 복잡한 구조 없이 단순하게 동작

3. 단점

  • 프레임 기반 업데이트 필요: Immediate Mode 기반이기 때문에 때문에 복잡한 UI에서는 성능 이슈 발생

    • 복잡한 UI에는 부적합
  • 모던 디자인 부족: 기본 제공 스타일은 디버그 중심이라 모던한 애플리케이션 UI로 사용하기에는 외형이 좀 투박…

4. 사용하는 경우

  • 게임 엔진이나 그래픽스 엔진 개발 중 디버그 UI를 추가할 때

  • 데이터 시각화 및 디버깅용 도구 제작

  • 실험적 프로토타입 UI를 빠르게 생성해야 할 때

5. 사용 예제

void RenderUI() {
    ImGui::Begin("Debug Window");

    if (ImGui::Button("Hello Button")) {
        std::cout << "Button Pressed!" << std::endl;
    }

    static float sliderValue = 0.5f; // 매 프레임마다 UI를 새로 생성하므로, 값을 유지하기 위해 static 지역변수 사용!

    ImGui::SliderFloat("Float Slider", &sliderValue, 0.0f, 1.0f);
    ImGui::End();
}
  • ‘Debug Window’라는 창을 생성하고, 버튼과 슬라이더를 렌더링하는 예제

  • 하나 반드시 알아두어야 하는 것은, ImGui::Begin()ImGui::End()는 UI 생성 / 파괴가 아님!

  • ImGui는 실제 UI 객체를 생성 / 삭제하지 않고 매 프레임마다 해당 프레임 내 UI의 구조를 기술할 뿐임

    • 실제 렌더링은 그래픽스 API에 위임
  • ImGui::Begin(): 새 Window 컨텍스트를 push

  • ImGui::End(): 해당 Window 컨텍스트를 pop

    • 일종의 스코프 제어로 사용하는 함수이기 때문에 반드시 Begin과 End가 대응되어야 함

    • 조건문 등에서 Begin이 사용되어 실제 생성될 지 안될 지 모르는 상황에서도 조건과 무관하게 End는 반드시 호출하는 패턴을 강제함