現在シングルパス ステレオレンダリングに対応しているデバイスは Gear VR と Daydream です。この機能を有効にするために、 OpenGL|ES 拡張機能* である GL_OVR_multiview2 と GL_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 公開ページ
Did you find this page useful? Please give it a rating:
Thanks for rating this page!
What kind of problem would you like to report?
Thanks for letting us know! This page has been marked for review based on your feedback.
If you have time, you can provide more information to help us fix the problem faster.
Provide more information
You've told us this page needs code samples. If you'd like to help us further, you could provide a code sample, or tell us about what kind of code sample you'd like to see:
You've told us there are code samples on this page which don't work. If you know how to fix it, or have something better we could use instead, please let us know:
You've told us there is information missing from this page. Please tell us more about what's missing:
You've told us there is incorrect information on this page. If you know what we should change to make it correct, please tell us:
You've told us this page has unclear or confusing information. Please tell us more about what you found unclear or confusing, or let us know how we could make it clearer:
You've told us there is a spelling or grammar error on this page. Please tell us what's wrong:
You've told us this page has a problem. Please tell us more about what's wrong:
Thank you for helping to make the Unity documentation better!
Your feedback has been submitted as a ticket for our documentation team to review.
We are not able to reply to every ticket submitted.