imgui導入メモ(directx11)

後ほどじっくり書きたいが、最近directx11を触っている

その際途中からimguiという、オープンソースGUIフレームワークを導入したときのメモ

github.com

とりあえず動かすには?

directx11のサンプルプロジェクトにあるimgui_impl_dx11.{h, cpp}を自分のプロジェクトに取り込んで、初期化等すればとりあえず動く(簡単で助かる)

初期化

ウィンドウハンドルとdirectx11のデバイス、デバイスコンテキストを渡せば初期化完了 ImGui_ImplDX11_Init(g_hWnd, g_pd3dDevice, g_pImmediateContext);

描画前準備

imguiのウィジェットを描画登録する前(ゲームループの初めとか)に↓を記述する

これがないとクラッシュする

ImGui_ImplDX11_NewFrame();

ウィンドウに文字列を表示する

Beginの第一引数がウィンドウを識別するIDになっており、Endが実行されるまでは、Beginで指定したIDのウィンドウにウィジェットが追加される

ImGui::SetNextWindowSize(ImVec2(320, 100), ImGuiSetCond_Once);
ImGui::Begin("hoge", &show_another_window);
ImGui::Text("fugafuga");
ImGui::End();

描画

Presentが実行される前に↓ ImGui::Render();

後処理

解放は忘れずに ImGui_ImplDX11_Shutdown();

以下は少しでも躓いた所

描画されるけどマウスで操作できない

ウィンドウプロシージャでImGui_ImplDX11_WndProcHandlerを呼び出す

サンプルでは↓のように使われていた

if (ImGui_ImplDX11_WndProcHandler(hWnd, msg, wParam, lParam))
        return true;

SetNextWindowSizeでサイズを指定しているが変更されない

定義は↓のようになっており、第二引数でサイズを設定する条件を指定できるようだった ImGui::SetNextWindowSize(const ImVec2& size, ImGuiSetCond cond)

全部で4種類の条件が設定できる

条件 説明
ImGuiSetCond_Always 常に設定する
ImGuiSetCond_Once アプリケーションを起動して一度だけ設定する
ImGuiSetCond_FirstUseEver 一番初めだけ設定する(その後は設定ファイルが作成されるので、そちらから読み込まれて設定される)
ImGuiSetCond_Appearing 表示/非表示の切り替え時のみ設定する

これらの条件の内ImGuiSetCond_FirstUseEverを最初に使っていたので、アプリケーションを起動しなおしてもサイズが設定されなくなっていた

日本語フォントを読み込んでいるはずなのに表示されない

最初はこのように読み込んでいた

ImGuiIO& io = ImGui::GetIO();
io.Fonts->AddFontDefault();
io.Fonts->AddFontFromFileTTF("c:\\Windows\\Fonts\\meiryo.ttc", 18.0f, NULL, io.Fonts->GetGlyphRangesJapanese());

実装を追っていないが、AddFontDefaultを抜くと日本語フォントで表示された

ImGuiIO& io = ImGui::GetIO();
io.Fonts->AddFontFromFileTTF("c:\\Windows\\Fonts\\meiryo.ttc", 18.0f, NULL, io.Fonts->GetGlyphRangesJapanese());

半角文字はデフォルトのままにしたかった

上記の方法で読み込むと、半角英数までメイリオフォントになってしまい、少し見づらかった

↓のようにすると、日本語フォントのみを上書きしてくれる

ImGuiIO& io = ImGui::GetIO();
ImFontConfig config;
config.MergeMode = true;
io.Fonts->AddFontDefault();
io.Fonts->AddFontFromFileTTF("c:\\Windows\\Fonts\\meiryo.ttc", 18.0f, &config, io.Fonts->GetGlyphRangesJapanese());

一部の日本語が?と表示される

以下のQiitaを参考に解消

qiita.com