LoginSignup
12
7

More than 5 years have passed since last update.

directx11のアプリケーションにimguiを導入した際のメモ

Last updated at Posted at 2017-06-28

directx11のアプリケーションにimguiというオープンソースのGUIフレームワークを導入したときのメモです
https://github.com/ocornut/imgui

とりあえず動かすには?

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を参考に解消
http://qiita.com/benikabocha/items/a25571c1b059eaf952de

12
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
7