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

> Explains how to use single-pass stereo rendering in your Android application.

Unity はマルチビューをサポートする Android デバイスの[シングルパスステレオレンダリング](/engine/6000.0/manual/platform-specific/xr/graphics/single-pass-stereo-rendering/instancing.md)をサポートしています。マルチビューは、[GL\_OVR\_multiview2](https://www.khronos.org/registry/OpenGL/extensions/OVR/OVR_multiview2.txt) と [GL\_OVR\_multiview\_multisampled\_render\_to\_texture](https://www.khronos.org/registry/OpenGL/extensions/OVR/OVR_multiview_multisampled_render_to_texture.txt) OpenGL ES 拡張で構成されています。これらの拡張は、各目に 1 つずつ、2 つのスライスで構成される 2D テクスチャ配列を使用するシェーダーを必要とします。

## シェーダーコードの必要条件##shader-code-requirements

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

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

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

### シェーダーの修正##modify-your-shaders

`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);
	// sample the texture
	fixed4 col = tex2D(_MainTex, i.uv);
	// apply fog
	UNITY_APPLY_FOG(i.fogCoord, col);
	return col;
}
```

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

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

## ポストプロセスシェーダー##post-processing-shaders

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

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