본문 바로가기
개념공부/기타

[C++] GUI 추천 Dear ImGui (아임구이)

by Zach Choi 2024. 10. 28.
728x90
반응형

 회사에서 누군가 ImGui로 GUI를 만들어 놓아서 유지보수를 위해 반강제로 공부하게 되었다ㅎㅎ. 그런데 사용성도 간편하고, 비쥬얼라이저 효과가 좋아서 공부하길 잘한 것 같다. ImGui로 코드 짜신 분께 감사함!

 

GitHub - ocornut/imgui: Dear ImGui: Bloat-free Graphical User interface for C++ with minimal dependencies

Dear ImGui: Bloat-free Graphical User interface for C++ with minimal dependencies - ocornut/imgui

github.com


Dear ImGui

Dear ImGui는 가볍고 불필요한 기능을 줄인 C++용 그래픽 사용자 인터페이스 라이브러리 (GUI)이다. C++로 작성되었기에 당연히 C 언어 기반 프로젝트에도 사용할 수 있다.

 

 Dear ImGui는 일단 빠르고, 프로젝트에 이식하기가 편하다. 그 이유는 라이브러리가 아닌 소스코드 형태로 배포되기 때문이다. 소스코드 및 헤더 파일의 개수도 10개 남짓이라, 개인 프로젝트에 그냥 임포트 하여 사용하면 된다. 그리고 외부 라이브러리에 대한 의존성도 없다.

 

 위 Github 에서 코드를 다운로드 하여 압축을 풀면 아래와 같다. 소스코드와 backends 그리고 예제 폴더가 있다. 이 중 왼쪽 사진에서 클릭한 파일만 임포트 하면 된다. 그리고 개인 프로젝트에서 사용 중인 GUI 플랫폼 및 렌더러에 해당하는 파일들을 backends 폴더에서 선택해 같이 임포트 하면 된다. ImGui에서는 플랫폼(ex/ GLFW, SDL, Win32)과 렌더러 (OpenGL2, OpenGL3, DirectX)와 같은 것을 backends라 지칭한다.

 

 ImGui에서 Getting Started를 제공하고 있으니 참고하자.

 

Getting Started

Dear ImGui: Bloat-free Graphical User interface for C++ with minimal dependencies - ocornut/imgui

github.com

반응형

ImGui 사용 예시

 ImGui를 사용하면 대략 아래와 같은 Table, Visualizer, Debug Tool을 간단한 코드로 작성할 수 있다. 코드를 보면 느껴지겠지만 ImGui는 플랫폼과 렌더러의 사용성과 편의성을 높인 코드이다. 

Reference https://github.com/ocornut/imgui?tab=readme-ov-file

ImGui::Text("Hello, world %d", 123);
if (ImGui::Button("Save"))
    MySaveFunction();
ImGui::InputText("string", buf, IM_ARRAYSIZE(buf));
ImGui::SliderFloat("float", &f, 0.0f, 1.0f);

Reference : https://github.com/ocornut/imgui?tab=readme-ov-file

// Create a window called "My First Tool", with a menu bar.
ImGui::Begin("My First Tool", &my_tool_active, ImGuiWindowFlags_MenuBar);
if (ImGui::BeginMenuBar())
{
    if (ImGui::BeginMenu("File"))
    {
        if (ImGui::MenuItem("Open..", "Ctrl+O")) { /* Do stuff */ }
        if (ImGui::MenuItem("Save", "Ctrl+S"))   { /* Do stuff */ }
        if (ImGui::MenuItem("Close", "Ctrl+W"))  { my_tool_active = false; }
        ImGui::EndMenu();
    }
    ImGui::EndMenuBar();
}

// Edit a color stored as 4 floats
ImGui::ColorEdit4("Color", my_color);

// Generate samples and plot them
float samples[100];
for (int n = 0; n < 100; n++)
    samples[n] = sinf(n * 0.2f + ImGui::GetTime() * 1.5f);
ImGui::PlotLines("Samples", samples, 100);

// Display contents in a scrolling region
ImGui::TextColored(ImVec4(1,1,0,1), "Important Stuff");
ImGui::BeginChild("Scrolling");
for (int n = 0; n < 50; n++)
    ImGui::Text("%04d: Some text", n);
ImGui::EndChild();
ImGui::End();

 

728x90

사용 시 유의할 점

 ImGui를 사용할 때는 플랫폼과 랜더러를 backends에 포함된 파일을 수정하지 말고 사용해야 한다. 괜히 개인 프로젝트에 맞추어 무언가를 수정했다가는 오히려 공수가 들어갈 수도 있다.. 그냥 ImGui backends에서 제공하는 플랫폼과 렌더러를 바로 사용하는게 훨씬 편하다. 이는 공식 페이지에서도 안내되고 있다.

 

 ImGui에서 유지하는 플랫폼과 랜더러는 아래와 같다.

728x90
반응형

'개념공부 > 기타' 카테고리의 다른 글

PC에서 개발한 소스코드를 임베디드 소스코드로 만들기  (0) 2024.09.14
OSQP Solver 빌드하기  (0) 2023.12.22
QP Solver  (0) 2023.11.29
FLOPS  (0) 2023.10.25
[OpenGL] GLUT  (0) 2023.09.11