トップページ > 記事閲覧
DrawStringがImGuiの上に描画される
名前:uncle 日時: 2024/09/13 04:59

お世話になっております。 現在DxLibにImGuiを組み込んで使用しているのですが、 DrawStringの描画結果が意図した描画順を無視し、ImGuiよりも上に表示されてしまう問題が発生しております。 最小構成を作成し確認しましたが依然として再現され、解決策が見つからず困っております。 お力添えいただけますと幸いです。 よろしくお願いします。 #include <windows.h> #include <DxLib.h> #include <ImGui/Backends/imgui_impl_win32.h> #include <ImGui/Backends/imgui_impl_dx11.h> ID3D11Device* g_pd3dDevice = nullptr; ID3D11DeviceContext* g_pd3dDeviceContext = nullptr; extern IMGUI_IMPL_API LRESULT ImGui_ImplWin32_WndProcHandler( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam ); // ImGuiにプロシージャの情報を流す LRESULT CALLBACK WndProc( HWND hWnd, UINT msg, WPARAM wp, LPARAM lp ){ if( ImGui_ImplWin32_WndProcHandler( hWnd, msg, wp, lp ) ){ return true; } return 0; } int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ){ // ウィンドウモードで描画 ChangeWindowMode( TRUE ); SetWindowStyleMode( 10 ); // Dxライブラリ初期化処理 if( DxLib_Init() == -1 ){ return false; } // ImGuiの初期化 ImGui::CreateContext(); g_pd3dDevice = (ID3D11Device*)( GetUseDirect3D11Device() ); g_pd3dDeviceContext = (ID3D11DeviceContext*)GetUseDirect3D11DeviceContext(); ImGui_ImplWin32_Init( GetMainWindowHandle() ); ImGui_ImplDX11_Init( g_pd3dDevice, g_pd3dDeviceContext ); SetHookWinProc( WndProc ); ImGui::GetIO().Fonts->AddFontFromFileTTF( "c:/Windows/Fonts/meiryo.ttc", 18.0f, NULL, ImGui::GetIO().Fonts->GetGlyphRangesJapanese() ); int handle = LoadGraph( "TestImg.png" ); while( 1 ){ if( ProcessMessage() == -1 ){ break; } // 描画準備 SetDrawScreen( DX_SCREEN_BACK ); SetDrawAreaFull(); ClearDrawScreen(); // @正常に描画される DrawBox( 40, 20, 70, 60, 0xff0000ff, TRUE ); // A正常に描画される DrawGraph( 40, 50, handle, TRUE ); // B※ImGuiよりも上に来てしまう DrawString( 40, 80, "hello", 0xffff0000 ); // ImGuiの描画 ---> ImGui_ImplDX11_NewFrame(); ImGui_ImplWin32_NewFrame(); ImGui::NewFrame(); if( ImGui::Begin( "window" ) ){ ImGui::Text( "hoge" ); } ImGui::End(); ImGui::Render(); ImGui_ImplDX11_RenderDrawData( ImGui::GetDrawData() ); // <--- // 表示 ScreenFlip(); } ImGui_ImplDX11_Shutdown(); ImGui_ImplWin32_Shutdown(); ImGui::DestroyContext(); // Dxライブラリ使用の終了処理 DxLib_End(); return 0; }
メンテ

Page: 1 |

Re: DrawStringがImGuiの上に描画される ( No.1 )
名前:管理人 日時:2024/09/13 23:12

DXライブラリは高速描画処理の為に DrawGraph や DrawString が呼ばれた際に描画は行わず、 描画する画像が変更されたりブレンドモードが変更されたり ScreenFlip が呼ばれた際に一度に描画を 行うようにしていますので、DXライブラリ外のライブラリによる描画が途中で挟まれると描画の順序が 意図した通りにならなくなります ( 本件の例ではBの描画は ScreenFlip の際に行われているため、DrawString の描画が ImGui よりも 上に来ている状態です ) この『高速描画のために一旦ストックされている描画情報』の描画を明示的に行うための関数として RenderVertex という関数がありますので、こちらを ImGui の処理が始まる直前( Bの直後 ) に 呼び出すようにしていただければ DrawString の描画が ImGui よりも上に表示されることはなくなります // 頂点バッファに溜まった頂点データを描画する( 特殊用途 ) int RenderVertex( void ); よろしければお試しください m(_ _)m
メンテ
Re: DrawStringがImGuiの上に描画される ( No.2 )
名前:uncle(解決済み) 日時:2024/09/14 20:05

ありがとうございます、 無事、意図した通りの挙動を実装できました!
メンテ

Page: 1 |

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

   クッキー保存