トップページ > 記事閲覧
自前でウィンドウを作成し、メッセージループする際のLive2D描画に関して
名前:Ingaan 日時: 2024/03/08 21:29

ウィンドウ作成とメッセージループは自前で行い、WM_PAINT時にDxLib機能を使ってLive2Dを描画する、 という運用をしようと思うのですが、いくつか質問があります。 (1)DPI設定の変更 DxLibを呼び出すとDPI設定が変更され、先に作成したメニューバーの大きさが合わなくなります。 これは無効にできるものでしょうか? それとも、変更されることを前提に設計すべきものでしょうか? [000_DxLibを呼び出さない場合](ttps://ibb.co/N2YbFMS) [001_DxLibを呼び出した場合](ttps://ibb.co/Y2vHbx5) (2)ウィンドウサイズを変更した際にリサイズバッファを行いたい。 例えばDxLib呼び出し時のウィンドウサイズがごく小さいと顕著ですが、 後から画像寸法に合わせてウィンドウを大きくしてもSwapChainのバッファは変更されず、ぼやけてしまいます。 Graphics_D3D11_OutputWindow_ResizeBuffer( int Index, int NewSizeX, int NewSizeY ) ; がやっているようなことを能動的に呼び出すことは可能でしょうか? [002_呼び出し時のウィンドウサイズがごく小さい場合](ttps://ibb.co/x32pMGL) (3)モーションファイルが存在しない場合の安全対策 model3に記載されているmotion3ファイルが存在しない場合、Live2D_Model_StartMotion呼び出しでアクセス違反になります。 どうもDxLib側ではなくCubismNative側の問題のように思えますが、DxLib側でできる回避策はあるでしょうか? ちなみにphysics3が存在しない場合はLive2D_LoadModel時点でエラーが返ってきました。 以上よろしくお願いします。
メンテ

Page: 1 |

Re: 自前でウィンドウを作成し、メッセージループする際のLive2D描画に関して ( No.1 )
名前:管理人 日時:2024/03/08 23:36

> (1)DPI設定の変更 > DxLibを呼び出すとDPI設定が変更され、先に作成したメニューバーの大きさが合わなくなります。 > これは無効にできるものでしょうか? DXライブラリが行っているのは『このアプリケーションは高DPIに対応しているかどうか』という設定を 『対応している』に設定する処理です DXライブラリ内部では高DPIに対応した処理を行っているので、こちらを無効にすることはできません ”『このアプリケーションは高DPIに対応しているかどうか』という設定を『対応している』に設定する処理” は、具体的には Windows の SetProcessDpiAwareness という API に PROCESS_SYSTEM_DPI_AWARE という引数を 渡して呼んでいるだけです SetProcessDpiAwareness( PROCESS_SYSTEM_DPI_AWARE ); この API 呼び出しを実行することで各種 DPI が関わる API の設定値や取得値が変化するので、上記処理を プログラムの開始直後( WinMain の最初 )で呼ぶことで『先に作成したメニューバー』なども正常に表示されるかもしれません ( 因みに使用するには shellscalingapi.h をインクルードして、Shcore.lib をリンクするファイルに追加する必要があります ) > (2)ウィンドウサイズを変更した際にリサイズバッファを行いたい。 SetGraphMode でウィンドウサイズに合わせてゲーム画面の解像度を変更することでぼやけなくなると思います <SetGraphMode の関数リファレンス> https://dxlib.xsrv.jp/function/dxfunc_graph3.html#R4N1 ただ、SetGraphMode を呼び出すとそれまでに作成していたグラフィックハンドルなどの描画処理に関係する ハンドルが削除されてしまうので、DxLib_Init() の後に SetChangeScreenModeGraphicsSystemResetFlag( FALSE ); を実行して SetGraphMode が呼び出されてもグラフィックハンドル等が削除されないようにしてください m(_ _)m // 画面モード変更時( とウインドウモード変更時 )にグラフィックスシステムの設定やグラフィックハンドルを // リセットするかどうかを設定する( TRUE:リセットする( デフォルト ) FALSE:リセットしない ) int SetChangeScreenModeGraphicsSystemResetFlag( int Flag ) ; > (3)モーションファイルが存在しない場合の安全対策 すみません、モーションファイルが存在しない場合にアクセス違反になるのはバグでしたので修正しました よろしければこちらの修正版をお使いください 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 11.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 // ソース (中身を既存のライブラリのファイルに上書きして『リビルド』をして下さい)
メンテ
Re: 自前でウィンドウを作成し、メッセージループする際のLive2D描画に関して ( No.2 )
名前:Ingaan 日時:2024/03/09 22:03

ご対応ありがとうございます。 DPIに関してはマニフェストによる指定という方針を採ろうかと思います。 SetGraphModeに関しては呼び出し有無で挙動は変わるものの、やはりDxLib初期化時のウィンドウサイズに左右されてしまうようです。 理想的にはモデル読み込み前のウィンドウは小さくしておきたいのですが、大きくしておかないと拡縮がうまくいきませんでした。 [003_初期化時のウィンドウサイズがモニタ解像度と同値、SetGraphModeを呼び出さない場合](ttps://ibb.co/WpnCWnz) [004_初期化時のウィンドウサイズが200x200で、SetGraphModeを呼び出す場合](ttps://ibb.co/VTczg1g) [005_初期化時のウィンドウサイズが200x200で、SetGraphModeを呼び出さない場合](ttps://ibb.co/Vp3mmss) [006_初期化時のウィンドウサイズがモニタ解像度と同値、SetGraphModeを呼び出す場合](ttps://ibb.co/TKsQrCC) やりたいのはDirect2Dでいうと次のような処理で、Graphics_D3D11_OutputWindow_ResizeBufferがDirect3Dに於ける同等の処理だと思うのですが、 SetGraphModeとバッファサイズの関係がよく分かりませんでした。 /* void CSample::ResizeBuffer() { if (m_pDxgiSwapChain1 != nullptr && m_pD2d1DeviceContext != nullptr && m_hRetWnd != nullptr) { m_pD2d1DeviceContext->SetTarget(nullptr); RECT rc; ::GetClientRect(m_hRetWnd, &rc); HRESULT hr = m_pDxgiSwapChain1->ResizeBuffers(0, rc.right - rc.left, rc.bottom - rc.top, DXGI_FORMAT_B8G8R8A8_UNORM, 0); CComPtr<IDXGISurface> pDxgiSurface; hr = m_pDxgiSwapChain1->GetBuffer(0, IID_PPV_ARGS(&pDxgiSurface)); CComPtr<ID2D1Bitmap1> pD2d1Bitmap1; hr = m_pD2d1DeviceContext->CreateBitmapFromDxgiSurface(pDxgiSurface, nullptr, &pD2d1Bitmap1); m_pD2d1DeviceContext->SetTarget(pD2d1Bitmap1); } } */ またもう一点質問なのですが、ネットワークPC上のmodel3ファイルを指定すると読み込ませんでした。 つまりPC-Aからアプリケーションを立ち上げて、同一ネットワーク上のPC-B上のmodel3を指定するとLive2D_LoadModelでエラーになります。 読み込み先はローカルであることが必要なのでしょうか?
メンテ
Re: 自前でウィンドウを作成し、メッセージループする際のLive2D描画に関して ( No.3 )
名前:管理人 日時:2024/03/11 02:14

参考画像のアップありがとうございます 手元でもテストしてみたところ、SetUserWindow で自前で作成したウィンドウを使用している場合に ResizeBuffer が実行されないバグがありました ネットワーク上のファイルを指定すると読み込めない件もバグで、こちらも併せて修正しましたので よろしければこちらの修正バージョンをお試しください 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 11.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 // ソース (中身を既存のライブラリのファイルに上書きして『リビルド』をして下さい) ↑ こちらのバージョンでウィンドウのサイズに合わせて SetGraphMode を呼び出すように して頂ければ正常に表示されるようになると思います
メンテ
Re: 自前でウィンドウを作成し、メッセージループする際のLive2D描画に関して ( No.4 )
名前:Ingaan 日時:2024/03/12 21:45

度々の対応ありがとうございます。 無事、期待していた動作を実現することができました。
メンテ

Page: 1 |

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

   クッキー保存