Unity3d:适用于安卓的单通道立体渲染

推荐:将NSDT场景编辑器加入你的3D工具链
3D工具集:NSDT简石数字孪生

适用于安卓的单通道立体渲染

Unity 支持支持多视图的 Android 设备的单通道立体渲染。Multiview 由 GL_OVR_multiview2 和 GL_OVR_multiview_multisampled_render_to_texture OpenGL ES 扩展组成。这些扩展要求着色器使用由两个切片组成的 2D 纹理数组,每个切片每个切片。这与 Unity 的单通道立体渲染的 PC/PS4 实现不同,后者使用双宽 2D 纹理。这意味着在 Android 上支持单通道立体渲染的着色器修改与其他平台不同。

着色器代码要求

若要将单通道立体渲染与自定义着色器一起使用,可能需要包含其他着色器代码。如果自定义着色器符合以下条件,则无需包含其他代码:

  • 没有自定义顶点处理的表面着色器。
  • 固定函数管道着色器。

: 这些着色器更改与多通道立体渲染兼容。

修改着色器

如果要使用内置着色器变量来了解 GPU 正在渲染到哪只眼睛,则必须在你拥有的任何着色器阶段输出结构中声明。例如:unity_StereoEyeIndexUNITY_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_StereoEyeIndexUNITY_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);
    // 应用雾
    UNITY_APPLY_FOG(i.fogCoord, col);
    return col;
}

如果着色器使用其他着色器阶段,请使用宏将眼睛索引传输到后续阶段。UNITY_TRANSFER_VERTEX_OUTPUT_STEREO()

提示: 要计算对象的最终位置,最佳做法是使用 代替 。UnityObjectToClipPos(IN.vertex)mul(UNITY_MATRIX_MVP, IN.vertex)

后处理着色器

必须更新后处理着色器,以处理作为 2D 纹理数组的眼睛纹理。为了帮助解决这个问题,Unity 包含了宏。要使纹理在多通道和单通道模式下都有效,请将每个纹理包装在此宏中。此外,在对纹理进行采样时,请使用宏。UNITY_DECLARE_SCREENSPACE_TEXTURE()UNITY_SAMPLE_SCREENSPACE_TEXTURE()

此宏要求您在单通道模式下事先调用。Unity 还包括用于深度纹理和屏幕空间阴影贴图的类似宏。您可以在 的底部看到完整列表。UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX()HLSLSupport.cginc

3D建模学习工作室整理翻译,转载请标明出处!

上一篇:Unity3d:在运行时管理资源包 (mvrlink.com)

下一篇:Unity3d:Vulkan 交换链预旋转 (mvrlink.com)

NSDT场景编辑器 | NSDT 数字孪生 | GLTF在线编辑器 | 3D模型在线转换 | UnrealSynth虚幻合成数据生成器 | 3D模型自动纹理化工具
2023 power by nsdt©鄂ICP备2023000829号