CODE $\Sigma$

2023/01/21
ImGuiのサンプルを動かす

ImGui(https://github.com/ocornut/imgui)という、OpenGLやDirectXで動作するGUIライブラリがあります。今回は、ImGuiのリポジトリにある、exampleフォルダー内の、example_sdl_opengl3を実行してみようと思います。

ファイル構成

CMakeを使ってBuildしたので、下記のような構成にしています。

├───dependencies
│   ├───IMGUI
│   │   ├───backends
│   │   │  └───vulkan
│   │   └───CMakeLists.txt
│   └───SDL2
├───CMakeLists.txt
└───main.cpp

main.cppは、IMGUIのexample_sdl_opengl3のmain.cppです。
SDL2はIMGUIには入っていないので、別途自分でダウンロードし、Buildしました。

なお、SDL2のインストールには次の記事も参考にしてください。
https://www.ryostudy.com/2023/01/18/sdl2-with-cmake/

CMakeLists.txt

フォルダ内に2つCMakeLists.txtがありますが、それぞれの内容は以下のとおりです。

cmake_minimum_required (VERSION 3.8)

set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED true)

project ("ImguiTest" VERSION 0.0)
set (BUILD_PATH "${PROJECT_SOURCE_DIR}/build")
set (SDL2_DIR "${PROJECT_SOURCE_DIR}/dependencies/SDL2/lib/cmake/SDL2")

find_package(SDL2 CONFIG REQUIRED)
add_subdirectory ("${PROJECT_SOURCE_DIR}/dependencies/IMGUI")

set (IMGUI_INCLUDE_DIRS ${PROJECT_SOURCE_DIR}/dependencies/IMGUI)
add_executable (${CMAKE_PROJECT_NAME} "${PROJECT_SOURCE_DIR}/main.cpp")
target_include_directories(${CMAKE_PROJECT_NAME} PUBLIC
    ${SDL2_INCLUDE_DIRS}
    ${IMGUI_INCLUDE_DIRS}
)
target_link_libraries(${CMAKE_PROJECT_NAME} 
    Imgui
    ${SDL2_LIBRARIES}
    OpenGL32
)

set (RUN_TIME_LIBS
    ${PROJECT_SOURCE_DIR}/dependencies/SDL2/bin/SDL2.dll
)
install(FILES ${RUN_TIME_LIBS} DESTINATION ${CMAKE_BINARY_DIR})

LinuxでCMake Installすると、特に設定をせずとも、find_packageで所望のライブラリを発見できますが、Windowsで開発していたので、SDL2_DIR 変数を設定しています。
OpenGLを使うので、忘れずにtarget_link_librariesにOpenGL32を追加しておきましょう。

SDLにはランタイムライブラリがあるので、buildした先にコピーできるように、installコマンドを設定しています。

dependenciesディレクトリ内のCMakeLists.txtは以下のとおりです。

set (IMGUI_SRC
    imgui.cpp
    imgui_demo.cpp
    imgui_draw.cpp
    imgui_tables.cpp
    imgui_widgets.cpp
    backends/imgui_impl_sdl.cpp
    backends/imgui_impl_opengl3.cpp
)
message("IMGUI_SRC: ${IMGUI_SRC}")
add_library(Imgui ${IMGUI_SRC})
target_include_directories(Imgui PUBLIC
    ${PROJECT_SOURCE_DIR}/dependencies/IMGUI
    ${PROJECT_SOURCE_DIR}/dependencies/IMGUI/backends
    ${SDL2_INCLUDE_DIRS}
)
target_link_libraries(Imgui
    ${SDL2_LIBRARIES}
)

ImGuiのbackendsディレクトリには多数のsource codeがありますが、それらすべてが実行に必要なわけではなく、SDLかつOpenGL3で動かすには、imgui_impl_sdl.cpp、imgui_impl_opengl3.cppの2つで十分です。

Build

以下のコマンドを順次実行していきます。

cd path/to/project_dir
mkdir build
cd build
cmake -S .. -B . -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=Release
cmake --build .
cmake --install .
.\ImguiTest.exe

コンパイルにMinGWを使っているので、あらかじめインストールしておいてください。Ninjaでもできました。
https://www.mingw-w64.org/downloads/