Unity 支持适用于支持多视图的 Android 设备的单通道立体渲染。多视图包含GL_OVR_multiview2 和GL_OVR_multiview_multisampled_render_to_texture OpenGL ES 扩展。这些扩展需要着色器在 GPU 上运行的程序。 更多信息
参见词汇表来使用一个由两片组成、每只眼睛一片的 2D 纹理数组。
要使用自定义着色器的单通道立体渲染,您可能需要包含其他着色器代码。如果您的自定义着色器是
注意:这些着色器更改与多通道立体渲染兼容。
如果您想使用内置着色器变量 unity_StereoEyeIndex
来了解 GPU 正在渲染哪只眼睛,则必须在您拥有的任何着色器阶段输出结构中声明 UNITY_VERTEX_OUTPUT_STEREO
。例如
struct v2f {
float2 uv : TEXCOOR0;
float4 vertex : SV_POSITION;
UNITY_VERTEX_OUTPUT_STEREO
};
要初始化输出数据,请在顶点着色器在渲染 3D 模型时,在模型的每个顶点上运行的程序。 更多信息
参见词汇表函数中使用 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()
宏将眼睛索引传输到后续阶段。
提示:要计算对象的最终位置,最佳实践是使用 UnityObjectToClipPos(IN.vertex)
而不是 mul(UNITY_MATRIX_MVP, IN.vertex)
。
您必须更新后期处理在图像显示在屏幕上之前,通过应用滤镜和效果来提高产品视觉效果的过程。例如,您可以使用后期处理效果来模拟物理相机和胶片属性,例如 Bloom 和景深。 更多信息 后期处理, 后期处理, 后处理
参见词汇表着色器以处理眼睛纹理成为 2D 纹理数组。为了帮助解决这个问题,Unity 包含了 UNITY_DECLARE_SCREENSPACE_TEXTURE()
宏。为了使纹理在多通道和单通道模式下都能工作,请将每个纹理包装在此宏中。此外,当您对纹理进行采样时,请使用 UNITY_SAMPLE_SCREENSPACE_TEXTURE()
宏。
此宏要求您在单通道模式下预先调用 UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX()
。Unity 还包含用于深度纹理和屏幕空间阴影贴图的类似宏。您可以在 HLSLSupport.cginc
底部查看完整列表。