2 minutes
🚂 Dear ImGui
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 컨텍스트를 pushImGui::End(): 해당 Window 컨텍스트를 pop일종의 스코프 제어로 사용하는 함수이기 때문에 반드시 Begin과 End가 대응되어야 함
조건문 등에서 Begin이 사용되어 실제 생성될 지 안될 지 모르는 상황에서도 조건과 무관하게 End는 반드시 호출하는 패턴을 강제함