夜風のMixedReality

xRと出会って変わった人生と出会った技術を書き残すためのGeekなHoloRangerの居場所

MixedRealityToolkitGrahpicsToolsの拡大鏡機能をHoloLensで使えるようにする 実機で画面反転を補正する

本日はMRGT枠です。

昨日に引き続きMRGTの最新機能拡大鏡機能をHoloLensで動かしていきます。

〇MixedRealityToolkitGraphicsToolsとは?

MixedRealityToolkitGraphicsTools(MRGT)はMicrosoftによって提供されているMixedRealityアプリ向けのUnitySDKであるMixedRealityToolkit3(MRTK3)の一つでグラフィックを担っています。

xRデバイスでのパフォーマンスを維持したグラフィックをコンセプトに開発されているため、例えばxRデバイスの開発でよく発生するトラブルである片目が描画されないといったトラブルが発生しない作りであるとともに、Unity開発で役立つ数多くのツールが同梱されています。

github.com

〇拡大鏡機能とは?

 拡大鏡は比較的新しく導入された機能で現在experimental(実験的)な機能です。

 アクセシビリティの観点からアプリケーション内での快適な体験をより多くの人が行える等にというロービジョンの方々の使用を想定して開発が行われました。

 機能開発に際して以下のMicrosoft ResearchのVR内でのロービジョンの方々へのVRのアプローチがきっかけであることがイシューで述べられています。

www.microsoft.com

github.com

〇v0.4.18時点での実機での問題

 実機で動かした場合拡大鏡に表示される画面が反転するという問題がありました。

redhologerbera.hatenablog.com

 イシューを立ててチームに問題を共有しますが、HoloLensでOpaqueTexutreを使用した際にこのようにUVが反転してしまう現象があったため原因はOpaqueTextureにあると思われます。

〇問題の解消

今回は根本的解決法ではありませんが、描画を行っているGraphics Tools/Magnifierシェーダーを改修して対応するようにしました。

改修点はフラグメントシェーダーになります。

            half4 frag(v2f i) : SV_Target
            {               
                float2 normalizedScreenSpaceUV = GetNormalizedScreenSpaceUV(i.vertex);

                float2 normalizedScreenSpaceUVStereo = UnityStereoTransformScreenSpaceTex(normalizedScreenSpaceUV);              

                normalizedScreenSpaceUVStereo.y *=-1; //追加
                float2 zoomedUv = zoomIn(normalizedScreenSpaceUVStereo, MagnifierMagnification, Center);
               
                float4 output = SAMPLE_TEXTURE2D_X(MagnifierTexture, samplerMagnifierTexture, zoomedUv);
                                
                return output;
            }

改修した点は次の一行です。

                normalizedScreenSpaceUVStereo.y *=-1; //追加

 これはUV座標に当たる変数で、今回実機上で上下が反転していたためy成分に-1を掛けわせて反転挙動を取るようにしました。

〇実機で確認

今回はPinchSliderで拡大率を変えれるように改修しました。

コードは以下になります。

    [SerializeField] private MagnifierManager _magnifierManager;

    public void SliderData(SliderEventData data)
    {
        _magnifierManager.Magnification = data.NewValue;
    }

MagnifierManager.Magnificationは拡大率(ズーム率)になります。

実機で確認すると正常に拡大鏡機能が描画されることが確認できました。

www.youtube.com

本日は以上です。