UE4でウィンドウキャプチャーできるプラグイン(WindowCapture2D)をマーケットプレイスに公開しました

WindowCapture2Dとは Unreal Engineで使えるWindow Captureのプラグインです。 Windowsの他のアプリケーションのWindowの表示を、自分のUE4プロジェクトのテクスチャとして扱うことができるようになります。 そのためメッシュに張り付けて3D空間に配置したり、UMG上のImageに張り付けることなんかができるようになります。 リアルタイムにスキャンしてテクスチャの中身を更新しているので、キャプチャー元のWindowの表示が更新されればテクスチャの表示も更新されます。 UE4のMedia PlayerとMedia Textureを使って動画を表示するのに近い使い勝手かと思います。 ブループリントOnlyのプロジェクトでも使用可能です。 詳しくは以前の記事を参照してください。 なぜ作ることにしたのか等書いています。 UE4でウィンドウキャプチャー機能を作ってみた - AYU MAX UE4 マーケットプレイス 以下のページにて公開しています。 WindowCapture2D:ayumax:Code Plugins - UE4 マーケットプレイス 価格はFreeです。 Engineのバージョンには4.22に対応しています。(近いうちに4.20と4.21にも対応させます) また、ソース一式も以下のGitHubにてMITライセンスで公開しています。 現状の機能とこれから 今(2019/7)のところウィンドウのキャプチャーのみ行えます。 今後はこれに操作機能(VRコントローラーなどでキャプチャーしたウィンドウを操作)を作ろうと考えています。 その他、今よりもパフォーマンスの改善や使い勝手の改善なども行っていく予定です。 特にキャプチャー対象のウィンドウの解像度が上がっていくと、処理負荷が高くなっていくのでその当たりが一番の課題かなと思っています。 こんな機能を追加してほしいなどのご要望ありましたら教えてください。

2019-07-07 · 1 分 · 34 文字 · ayumax

UE4 WindowCapture機能をUMG対応しました

UMG対応 先日GitHubに公開しましたUE4向けのウィンドウキャプチャープラグインのWindowCapture2DにUMG対応を実施しました。 {{< x user=“ayuma_x” id=“1141689312255172608” >}} これで3D空間だけでなく、ウィンドウ内の固定位置にキャプチャー画像の貼り付けが可能になります。 使い方 UserWidgetに"WindowCaptureUMG"を配置します。 それだけです。 WindowCaptureUMGに設定するプロパティはActor版のWindowCapturePlaneと同じものになるため、ActorでもWidgetでも同じ設定方法で使えます。 Editor Widgetへの応用 応用としてEditorWidgetにも使えます。 ただし、現状EditorWidgetに使用するとコンパイルボタンを押したときに起こる終了→再初期化の処理が通常のUMGとは異なるせいでクラッシュしてしまいます。。。 現在直し方を調整中です。 ※ どうやらEditorWidgetを起動中にコンパイルすると落ちてしまうようです。一度EditorWidgetのウィンドウを閉じてからコンパイルすると落ちないことを確認しました。(2019/6/22) {{< x user=“ayuma_x” id=“1142066827872239617” >}} {{< x user=“ayuma_x” id=“1142074587980554240” >}}

2019-06-22 · 1 分 · 29 文字 · ayumax

UE4でウィンドウキャプチャー機能を作ってみた

WindowCapture2D 今回UnrealEngineで使えるウィンドウキャプチャープラグインをGitHub上に公開しました。 今はGitHubでのみ公開していますが、もう少し機能がまとまり次第マーケットプレイスにも出そうと思っています。 WindowCaptureへの思い ある時にVRコンテンツをUE4でWindows上のアプリケーションをVR空間に表示したくて色々調べてたのですが、中々ダイレクトでマッチする機能は探せず。 当時はそんなに時間もなかったのでUE4で実現するのをあきらめていました。 そんな中ネットを見ているとUnityならドンピシャの機能を作られている方がいて、試してみると普通にやりたい事ができてしまい感動した記憶があります。 Unity で Windows のデスクトップ画面をテクスチャとして表示するプラグインを作ってみた - 凹みTips 凄い凄いと思いながら、Unityでも実現できてるんだからUnrealでも作れるんじゃないだろうかと思い、トライしてみたのが始まりです。 Windowをキャプチャーする 私は25歳の時に今で言う「未経験からエンジニア」で転職したのですが、その時最初にやった業務がWindows上でのウィンドウキャプチャーでした。 C++, MFCで戦っていたのですが、当時はHDC? HWND?何それ?メモリDCってなに?って感じだったのを覚えています。 そのためウィンドウをキャプチャーするという技術には特別な思いがあります。 キャプチャー方法 私の知っているウィンドウキャプチャー方法は以下の2つです。 WindowのDCを取得してBitBlt WindowのDCを取得してPrintWindow 速度的にはBitBltの方がPrintWindowよりも早くて良いのですが、ChromeやUE4で作ったアプリケーションなどはBitBltではキャプチャーできません。 Windowを直接キャプチャーするのではなく、デスクトップのDCからキャプチャーして必要な領域をトリミングすると、どんなウィンドウでもキャプチャーできるのですが、 キャプチャーするのにディスプレイモニターのリフレッシュレート分待たされてしまう問題や、重なったウィンドウの背面側はキャプチャーできない等問題も数多くありました。 もう一つのPrintWindowも当初はChromeのキャプチャーはできないと思っていたのですが、Microsoftのヘルプに載っていない引数(PW_RENDERFULLCONTENT=2)を与えるとキャプチャーできるようになる発見がありました。 そこで今回はPrintWindowで作ってみる事にしました。 (その他にDirectXを使ってウィンドウキャプチャーする方法もあるそうですが、これはまだ試していません) UE4での実装 とりあえずTickの中でターゲットのウィンドウをキャプチャーしてテクスチャの中身を書き換えてみました。 テクスチャー(UTexture2D)の書き換えは以下のコードで実現できます。 auto Region = new FUpdateTextureRegion2D(0, 0, 0, 0, TextureTarget->GetSizeX(), TextureTarget->GetSizeY()); TextureTarget->UpdateTextureRegions(0, 1, Region, 4 * TextureTarget->GetSizeX(), 4, (uint8*)m_BitmapBuffer); TextureTargetがターゲットとなるTexture2Dで、 m_BitmapBufferはBGRA形式のピクセルバッファです。 この2行で動的にテクスチャーの書き換えができます。 実行するとうまくいったかのように見えたのですが、対象のウィンドウのサイズが大きくなるとカクツキが酷くなってしまい困りました。 {{< x user=“ayuma_x” id=“1137004503868223491” >}} そこで次はキャプチャーの部分のみTaskを使ってバックグラウンドで処理してみました。 void ACaptureMachine::Tick() { AsyncTask(ENamedThreads::BackgroundThreadPriority, [this]() { // キャプチャー処理を実施 }); } そうすると先ほどよりもフレームレートが上がり効果がありましたので、次に複数ウィンドウのキャプチャーにトライしました。 ...

2019-06-19 · 1 分 · 147 文字 · ayumax