トップページ > 記事閲覧
DxLibでImGuiを使用して、画面外にウィンドウを表示したいです
名前:NN 日時: 2021/10/16 13:38

お世話になっております。 DxLibをベースとしたゲームエンジン(しょぼい)を作成している者です。 題名の通りなのですが、ImGui(https://github.com/ocornut/imgui/tree/docking)を使用して画面外にウィンドウを表示したいと思っております。 下記のように組んでみると動くには動くのですが、ImGuiのウィンドウがDxLibで生成されたウィンドウ外に出ると DxLibで描画しているテクスチャ等が描画されず、画面が黒で塗りつぶされてしまいます。 もし可能であればご教授いただけると幸いです。 このソースコードでは判断が難しい場合、プロジェクトをメール等でお送りすることも可能です。 どうか、よろしくお願い致します。 DxLib:3.22e #include "DxLib.h" #include "imgui.h" #include "imgui_impl_win32.h" #include "imgui_impl_dx11.h" // Forward declare message handler from imgui_impl_win32.cpp extern IMGUI_IMPL_API LRESULT ImGui_ImplWin32_WndProcHandler(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam); LRESULT WINAPI WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { ImGui_ImplWin32_WndProcHandler(hWnd, msg, wParam, lParam); // メッセージ処理はDxLibで行っているようだ return 0; } int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int gh = -1; // グラフィックハンドル // 初期設定 { // DxLib { DxLib::SetGraphMode(1280, 720, 32); DxLib::ChangeWindowMode(true); DxLib::SetUseDirect3DVersion(DX_DIRECT3D_11); DxLib::SetHookWinProc(WndProc); DxLib::SetAlwaysRunFlag(true); if (DxLib::DxLib_Init() == -1) { return false; } DxLib::SetDrawScreen(DX_SCREEN_BACK); gh = LoadGraph("test1.bmp"); // ★このファイルはDxLibのサンプルに入ってたものです(キャラ画像) } // ImGui { IMGUI_CHECKVERSION(); ImGui::CreateContext(); ImGuiIO& io = ImGui::GetIO(); (void)io; io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard; // Enable Keyboard Controls io.ConfigFlags |= ImGuiConfigFlags_DockingEnable; // Enable Docking io.ConfigFlags |= ImGuiConfigFlags_ViewportsEnable; // Enable Multi-Viewport / Platform Windows ★ここ消すとマルチウィンドウ解除 ImGuiStyle& style = ImGui::GetStyle(); if (io.ConfigFlags & ImGuiConfigFlags_ViewportsEnable) { style.WindowRounding = 0.0f; style.Colors[ImGuiCol_WindowBg].w = 1.0f; } ImGui_ImplWin32_Init(DxLib::GetMainWindowHandle()); ImGui_ImplDX11_Init((ID3D11Device*)DxLib::GetUseDirect3D11Device(), (ID3D11DeviceContext*)DxLib::GetUseDirect3D11DeviceContext()); } } // メインループ while (!DxLib::ProcessMessage()) { // 更新部 { // DxLib { // 特になし } // ImGui { ImGui_ImplDX11_NewFrame(); ImGui_ImplWin32_NewFrame(); ImGui::NewFrame(); ImGui::ShowDemoWindow(); } } // 描画部 { DxLib::ClearDrawScreen(); // DxLib { DrawGraph(0, 0, gh, true); // ★これが消えてしまう } // ImGui { ImGui::Render(); ImGui_ImplDX11_RenderDrawData(ImGui::GetDrawData()); // Update and Render additional Platform Windows if (ImGui::GetIO().ConfigFlags & ImGuiConfigFlags_ViewportsEnable) { ImGui::UpdatePlatformWindows(); ImGui::RenderPlatformWindowsDefault(); // ★これが怪しい } } DxLib::ScreenFlip(); } } // 終了処理 { // ImGui { ImGui_ImplDX11_Shutdown(); ImGui_ImplWin32_Shutdown(); ImGui::DestroyContext(); } // DxLib { DxLib::DxLib_End(); } } return 0; }
メンテ

Page: 1 |

Re: DxLibでImGuiを使用して、画面外にウィンドウを表示したいです ( No.1 )
名前:NN 日時:2021/10/16 20:26

追記用レス(分かったこと、試したことを追記していきます) ・SetWindowStyleMode(7) もしくは SetWindowSizeChangeEnableFlag(true, false) を DxLib_Init() の前に呼ぶ ウィンドウのサイズを変更した後だとDxLibで描画したものは消えず、問題なく動作しました。 DxLib_WinProc の WM_SIZING 内の処理が関係している・・・? ・DxLibが生成したWindowとは別に自前でWindowを生成して、そのWindowとImGuiを紐付けてみる? こうするとDxLibが管理しているWindowには影響を与えずにImGuiの描画を行えるのではないか? 自前で生成したWindowは非表示にしておけば邪魔にはならない(ImGuiのWindowも非表示になる可能性はあるが)
メンテ
Re: DxLibでImGuiを使用して、画面外にウィンドウを表示したいです ( No.2 )
名前:管理人 日時:2021/10/17 06:52

すみません、ソースを拝見しただけではちょっと分かりません ただ、ImGui との併用は想定していないので現象を手元で拝見しても 解決できるか不明ですが、もしよろしければプロジェクトをメールでこちら BQE00322(あっとまーく)nifty.com ( (あっとまーく) を @ に置き換えてください ) に送っていただけないでしょうか? m(_ _)m > ・SetWindowStyleMode(7) もしくは SetWindowSizeChangeEnableFlag(true, false) を DxLib_Init() の前に呼ぶ > ウィンドウのサイズを変更した後だとDxLibで描画したものは消えず、問題なく動作しました。 > DxLib_WinProc の WM_SIZING 内の処理が関係している・・・? こちらで問題解決、という状況でしょうか? (・・ > ・DxLibが生成したWindowとは別に自前でWindowを生成して、そのWindowとImGuiを紐付けてみる? > こうするとDxLibが管理しているWindowには影響を与えずにImGuiの描画を行えるのではないか? > 自前で生成したWindowは非表示にしておけば邪魔にはならない(ImGuiのWindowも非表示になる可能性はあるが) 試してみる価値はあるのではないかと思います
メンテ
Re: DxLibでImGuiを使用して、画面外にウィンドウを表示したいです ( No.3 )
名前:NN 日時:2021/10/17 19:08

さっそくのご返信ありがとうございます。 指定されたメールアドレスにプロジェクトを添付したメールを送らせて頂きました。 > こちらで問題解決、という状況でしょうか? (・・ 詳細内容はプロジェクトのソースファイルに記載させて頂きました(★マークがついています)。 サイズを変更しなくても、正常にDxLibで生成されたウィンドウにテクスチャ等が描画されて欲しいので、解決はしておりません。 ただ、解決するのに役に立つ情報かもしれないと思い、記載させて頂きました。 > 試してみる価値はあるのではないかと思います こちらまだ検証できておりませんが、検証を行おうと思います。 お忙しいところ大変恐縮ですが、どうか宜しくお願い致します。
メンテ
Re: DxLibでImGuiを使用して、画面外にウィンドウを表示したいです ( No.4 )
名前:管理人 日時:2021/10/19 02:15

メールありがとうございます 添付していただいたプロジェクトを手元で実行した所、本件の現象を確認できました ImGui などの Direct3D を使用する外部ライブラリを使用する場合は、 外部ライブラリの描画APIを呼んだ後、DXライブラリの関数を呼ぶ前に RefreshDxLibDirect3DSetting(); を実行する必要があるのですが、 RefreshDxLibDirect3DSetting(); の呼び出しを追加しても現象が発生したまま だったので調べた所、レンダーターゲットの再設定を行っていませんでした… レンダーターゲットの再設定も RefreshDxLibDirect3DSetting(); の中に 追加した所、正常に描画されるようになりましたので、 よろしければこちらの修正版をダウンロードしてください m(_ _;m https://dxlib.xsrv.jp/temp/DxLibVCTest.zip // Windows版 VisualC++ 用 https://dxlib.xsrv.jp/temp/DxLibBCCTest.zip // Windows版 BorlandC++ 用 https://dxlib.xsrv.jp/temp/DxLibBCC2Test.zip // Windows版 C++ Builder 10.3 用 https://dxlib.xsrv.jp/temp/DxLibGCC_MinGWTest.zip // Windows版 MinGW 用 https://dxlib.xsrv.jp/temp/DxLibDotNet.zip // Windows版 .NET用 https://dxlib.xsrv.jp/temp/DxLibMakeTest.zip // ソース (中身を既存のライブラリのファイルに上書きして『リビルド』をして下さい) ↑ こちらのバージョンをご使用の上で、 // ImGui { ImGui::Render(); ImGui_ImplDX11_RenderDrawData(ImGui::GetDrawData()); // Update and Render additional Platform Windows if (ImGui::GetIO().ConfigFlags & ImGuiConfigFlags_ViewportsEnable) { ImGui::UpdatePlatformWindows(); ImGui::RenderPlatformWindowsDefault(); // ★これが怪しい } } ↑ こちらの部分の最後で RefreshDxLibDirect3DSetting(); を呼ぶようにしてみてください m(_ _)m // ImGui { ImGui::Render(); ImGui_ImplDX11_RenderDrawData(ImGui::GetDrawData()); // Update and Render additional Platform Windows if (ImGui::GetIO().ConfigFlags & ImGuiConfigFlags_ViewportsEnable) { ImGui::UpdatePlatformWindows(); ImGui::RenderPlatformWindowsDefault(); // ★これが怪しい } RefreshDxLibDirect3DSetting(); }
メンテ
Re: DxLibでImGuiを使用して、画面外にウィンドウを表示したいです ( No.5 )
名前:NN(解決) 日時:2021/10/19 21:58

お忙しいところ、申し訳ありませんでした。。 修正して頂いたDXライブラリをお送りしたプロジェクトに入れ、コード修正して実行したところ 理想通りに動くことを確認しました! 助かりました! ありがとうございます!
メンテ

Page: 1 |

題名
名前
コメント
パスワード (記事メンテ時に使用)

   クッキー保存