Dear ImGuiの組み込み

1. はじめに

デバッグ用にGUIが欲しいので,Dear ImGuiの組み込んだサンプルプログラムを作ってみました。
 以前は自前でバックエンドを実装していたのですが,最近はImGui側でバックエンドが用意されているので,今回はそれを使う形にしてみました。

実行結果

2. 組み込み

今回はimgui-1.92.5を対象として組み込みをしてみます。まずは,Dear ImGuiのGithubページから対象バージョンをダウンロードします。
Github - imgui 1.92.5

zipをダウンロードしたら展開して,組み込みしたいプロジェクトに配置してください。
DirectX12を対象としたwin32アプリケーションの場合,必要なソースコードは以下になりますので,これをプロジェクトに追加してください。

インクルードパスも忘れずに追加しておいてください。

まず初期化ですが,次のような感じでアプリケーションの初期化処理を行う箇所にImGui::CreateContext()の呼び出しと,ImGui_ImplWin32_Init(), ImGui_ImplDX12_Init()の呼び出しをそれぞれ行ってください。日本語フォントを使用した場合は,グリフ設定を忘れずに。

    // ImGuiの初期化処理.
    {
        // コンテキスト作成.
        ImGui::CreateContext();

        // ダークカラースタイルに変更.
        ImGui::StyleColorsDark();

        // 日本語フォントの設定.
        ImWchar const glyph_ranges[] = { 0x0020, 0xffd, 0 };
        auto io = ImGui::GetIO();
        [[maybe_unused]] auto font = io.Fonts->AddFontFromFileTTF("C:\\Windows\\Fonts\\meiryo.ttc", 18.0f, nullptr, glyph_ranges);

        // Win32バックエンドの初期化.
        if (!ImGui_ImplWin32_Init(m_hWnd))
        {
            ELOG("Error : ImGui_ImplWin32_Init() Failed.");
            return false;
        }

        // DX12バックエンドの初期化.
        ImGui_ImplDX12_InitInfo info = {};
        info.Device                 = m_Device.Get();
        info.CommandQueue           = m_GraphicsQueue.Get();
        info.NumFramesInFlight      = 2;
        info.RTVFormat              = m_SwapChainFormat;
        info.DSVFormat              = m_DepthStencilFormat;
        info.SrvDescriptorHeap      = m_HeapRes.Get();
        info.SrvDescriptorAllocFn   = AllocDescriptor;
        info.SrvDescriptorFreeFn    = FreeDescriptor;
        info.UserData               = this;
        if (!ImGui_ImplDX12_Init(&info))
        {
            ELOG("Error : ImGui_ImplDX12_Init() Failed.");
            return false;
        }
    }

続いて、描画処理です。描画処理の先頭でNewFrameを呼び出してください。次のような感じです。

    // ImGuiのフレーム開始処理.
    ImGui_ImplWin32_NewFrame();
    ImGui_ImplDX12_NewFrame();
    ImGui::NewFrame();

上記を呼び出した後で,ImGuiの関数を呼び出してGUIを構築します。構築し終えたら,Direct3D 12のコマンドリストに描画コマンドを積みます。これを行うにはImGui::Render()とImGui_ImplDX12_RenderDrawData()を呼び出せば良いです。

    // ImGuiの描画.
    {
        ImGui::Render();
        ImGui_ImplDX12_RenderDrawData(ImGui::GetDrawData(), m_CommandList.Get());
    }

描画処理は以上です。
 最後に終了処理を行います。下記のように,Shutdown()メソッドとDestroyContext()を呼び出してください。

    // ImGuiの終了処理.
    if (ImGui::GetCurrentContext() != nullptr)
    {
        ImGui_ImplDX12_Shutdown();
        ImGui_ImplWin32_Shutdown();
        ImGui::DestroyContext();
    }

 ちゃんと正しく実装されていれば,このページ先頭にある画像のようにImGuiが描画されるはずです。

サンプルコード

本ソースコードおよびプログラムはMITライセンスに準じます。
プログラムの作成にはWindows 11, およびMicrosoft Visual Studio 2026 Communityを用いています。




Copyright © 2006-2026 Pocol.