imgui導入メモ(directx11)
後ほどじっくり書きたいが、最近directx11を触っている
その際途中からimguiという、オープンソースのGUIフレームワークを導入したときのメモ
とりあえず動かすには?
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を参考に解消