UE4 + HTC VIVE モニタリング表示領域をいじる
通常のVRPreview再生だと左右に黒帯が入った状態で再生されるが、展示その他ギャラリーがゲーム画面を見るのを想定すると、フルHD等一般的な解像度になっててほしいとか微妙な要望があるので調べた。
調査
まず表示解像度の変更と思い込んでそのあたりから調べ。
http://pafuhana1213.hatenablog.com/entry/2015/12/08/001421 にまてめてらっしゃる方もいらっしゃり素晴らしい限り。
HMDに関するコマンドがたくさんあって実行してみるが、Oculus用のコマンドなのか動作はしてるようだけどモニタリング側がフリーズして、HMDもSteamの待機中のまま動かない感じだった。
https://answers.unrealengine.com/questions/311721/vr-mirror-standard-output.html
hmd mirror mode [0|1|2]
でなく hmd mirror 1
とか指定するとviveでも二眼映像になったり反応はある。けどAnswerHubにあるような0~2の変更はできないようでフリーズしてしまっていた。多分この辺のコンソールからコマンド叩くと止まるとかの諸々
https://forums.unrealengine.com/showthread.php?110529-VR-Mirror-Window-turned-Black
最終的にはこちらのフォーラムで解決へ
https://forums.unrealengine.com/showthread.php?117032-Problem-about-monitor-resolution-display-in-vive-vr-mode
エンジン内のSteamVRRender.cppを更新して、ミラーリング用に切り出す領域を変えると目的自体は達成できる模様。変数変えるだけなので16:9でなくても求める比率で指定すればどうとでもなりそう。自分の環境ではUE4ビルドして実現できたので良しとしてる。 EpicGamesLauncherから動かしてる場合はできないこともないのかもしれないけどちょっと都合がわからない。元々はReddit内でRawDataがどうやってるかから発展してるぽく、エンジンのコード読んで対応してるあたりは参考にしたい。
参考動画
Engine/Plugins/Runtime/Steam/SteamVR/Private/SteamVRRender.cpp
の更新
if (WindowMirrorMode == 1) { // need to clear when rendering only one eye since the borders won't be touched by the DrawRect below RHICmdList.ClearColorTexture(BackBuffer, FLinearColor::Black, FIntRect()); /* RendererModule->DrawRectangle( RHICmdList, FIntPoint(ViewportWidth, ViewportHeight), FIntPointViewportWidth / 4, 0, ViewportWidth / 2, ViewportHeight, 0.1f, 0.2f, 0.3f, 0.6f,(1, 1), *VertexShader, EDRF_Default); */ RendererModule->DrawRectangle( RHICmdList, 0, 0, ViewportWidth, ViewportHeight, 0.006f, 0.2825f, 0.44f, 0.4425f, FIntPoint(ViewportWidth, ViewportHeight), FIntPoint(1, 1), *VertexShader, EDRF_Default); } else if (WindowMirrorMode == 2) ...
できたこと
が
になった
まとめ
UE4がんがん更新されてるのでこのあたりも将来的には設定で変更できるようになるのではなかろうかと思いつつの対応。今年のUnite早割も無事申込んだのでまだしばらくゲームエンジンその周辺をいじり続ける所存。