Unity はマルチビューをサポートする Android デバイスの シングルパスステレオレンダリング をサポートします。マルチビューは GL_OVR_multiview2 と GL_OVR_multiview_multisampled_render_to_texture OpenGL ES 拡張で構成されます。これらの拡張は、各目に 1つずつ、2 つのスライスで構成される 2D テクスチャ配列を使用するシェーダーを必要とします。
カスタムシェーダーでシングルパスステレオレンダリングを使用するには、追加のシェーダーコードを加える必要があるかもしれません。カスタムシェーダーが以下の場合は、追加のコードを加える必要はありません。
ノート: これらのシェーダーの変更はマルチパスステレオレンダリングに対応し ています。
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
の最後に全一覧が表示されています。