Version: 2022.1
言語: 日本語
画面設定
フレームバッファの向き

Android 向けシングルパスステレオレンダリング

Unity supports single-pass stereo rendering for Android devices that support multiview. Multiview consists of the GL_OVR_multiview2 and GL_OVR_multiview_multisampled_render_to_texture OpenGL ES extensions. These extensions require shaders to use a 2D texture array that consists of two slices, one slice per eye. This differs from Unity’s PC/PS4 implementation of single-pass stereo rendering which uses a double-wide 2D texture. This means that shader modifications to support single-pass stereo rendering on Android are different from other platforms.

シェーダーコードの必要条件

カスタムシェーダーでシングルパスステレオレンダリングを使用するには、追加のシェーダーコードを加える必要があるかもしれません。カスタムシェーダーが以下の場合は、追加のコードを加える必要はありません。

  • カスタム頂点処理をしていないサーフェスシェーダー
  • 固定機能パイプラインシェーダー

ノート: これらのシェーダーの変更はマルチパスステレオレンダリングに対応し ています。

シェーダーの修正

unity_StereoEyeIndex ビルトインシェーダー変数を使用して、GPU がどの眼に描画しているかを知りたい場合は、UNITY_VERTEX_OUTPUT_STEREO をシェーダーステージ出力構造体で宣言する必要がありま す。例えば、以下のようになります。

struct v2f {
    float2 uv : TEXCOOR0;
    float4 vertex : SV_POSITION;
    UNITY_VERTEX_OUTPUT_STEREO
};

出力データを初期化するには、頂点シェーダー関数内で UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO() を使用します。例えば、以下のようになります。

v2f vert (appdata v)
{
    v2f o;
    UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);
    o.vertex = UnityObjectToClipPos(v.vertex);
    o.uv = TRANSFORM_TEX(v.uv, _MainTex);
    return o;
}

unity_StereoEyeIndex を後続のステージで初期化するために、以下のように冒頭に UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX() を加えます。

fixed4 frag (v2f i) : SV_Target
{
    UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(i);
    // テクスチャをサンプリング
    fixed4 col = tex2D(_MainTex, i.uv);
    // fog を適用
    UNITY_APPLY_FOG(i.fogCoord, col);
    return col;
}

シェーダーが他のシェーダーステージを使用する場合は、UNITY_TRANSFER_VERTEX_OUTPUT_STEREO() マクロを使用して、アイインデックスを後続ステージに転送します。

ヒント: オブジェクトの最終位置を計算するには、mul(UNITY_MATRIX_MVP, IN.vertex) の代わりに UnityObjectToClipPos(IN.vertex) を使用するのが最も効率的です。

ポストプロセスシェーダー

目のテクスチャが 2D テクスチャ配列であることに対処するために、ポストプロセスシェーダーを更新する必要があります。これを支援するために、Unity には UNITY_DECLARE_SCREENSPACE_TEXTURE() マクロが含まれています。マルチパスとシングルパスの両方のモードでテクスチャを動作させるには、各テクスチャをこのマクロでラップします。また、テクスチャをサンプリングするときは、 UNITY_SAMPLE_SCREENSPACE_TEXTURE() マクロを使用します。

このマクロを使用するには、シングルパスモード中に事前に UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX() が呼び出す必要があります。また、Unity には、深度テクスチャとスクリーンスペースのシャドウマップ用にこれに類似したマクロがあります。HLSLSupport.cginc の最後に全一覧が表示されています。

画面設定
フレームバッファの向き