せまい部屋

web/gameエンジニアのweblog

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がどうやってるかから発展してるぽく、エンジンのコード読んで対応してるあたりは参考にしたい。

参考動画

www.youtube.com

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)
    ...

できたこと

f:id:takoji3:20170411133835p:plain

f:id:takoji3:20170411133854p:plain

になった

まとめ

UE4がんがん更新されてるのでこのあたりも将来的には設定で変更できるようになるのではなかろうかと思いつつの対応。今年のUnite早割も無事申込んだのでまだしばらくゲームエンジンその周辺をいじり続ける所存。