Version: 2020.1
言語: 日本語
開発の迅速なイテレーションのためのアプリケーションのパッチ処理
Android プラグインのビルドと使用

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

現在シングルパス ステレオレンダリングに対応しているデバイスは Gear VR と Daydream です。この機能を有効にするために、 OpenGL|ES 拡張機能* である GL_OVR_multiview2GL_OVR_multiview_multisampled_render_to_texture を使用します。これらの拡張機能は、テクスチャ 2D 配列を 1 つとスライスを 2 つ (各眼 1 スライスずつ) を必要とします。 これは Unity の PC/PS4 の実装 (単純に 2 倍幅 の 2D テクスチャを 1 つ使用している) とは異なります。そのため、シェーダーへの変更も異なります。

シェーダースクリプトの必要条件

シングルパスステレオレンダリング機能をカスタムシェーダーと併用する場合は、下に掲載するコードの追加が必要な場合があります。これは、 Unity によって自動変換されるサーフェスシェーダーや機能が固定されたパイプラインシェーダーには当てはまりません。ただし、カスタム頂点処理が含まれるサーフェスシェーダーには当てはまります。

シェーダースクリプトへのこれらの変更はマルチパスステレオレンダリングと互換性があるため、マルチパスステレオレンダリングモードでも大きな影響はありません。

まず、頂点シェーダーの後のシェーダーステージで unity_StereoEyeIndex を使用したい場合は、 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_DECLARE_SCREENSPACE_TEXTURE() が作られました。このマクロを使って全てのテクスチャをラップします。すると、テクスチャはマルチパスモードとシングルパスモードの両方で機能するようになります。

テクスチャのサンプリングを行う場合は、以下のマクロを使用してください。

UNITY_SAMPLE_SCREENSPACE_TEXTURE()

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

シェーダーコードに関する詳細は 頂点シェーダーとフラグメントシェーダーの例 のページを参照してください。

* これらの OpenGL|ES 拡張機能は比較的新しいものであるため、デバイスのドライバーに起因するグラフィックス関連の問題が発生する場合があります。**


  • バージョン 5.5 の新機能

  • 2017–06–20 公開ページ

開発の迅速なイテレーションのためのアプリケーションのパッチ処理
Android プラグインのビルドと使用