URP渲染管线下的 huawei AREngine预览流绘制

本文介绍了将华为AREngine的预览流从默认的内置渲染管线迁移到Unity的Universal Render Pipeline (URP)的实现过程。在内置渲染管线中,预览流通过GPU直接传递到着色器,而URP则需要利用RenderFeature创建自定义渲染通道。通过ARBackgroundRenderPassFeature类和ScriptableRenderPass,实现了在BeforeRenderingOpaques渲染事件中绘制预览流。虽然在PC上预览流可能显示为紫色,但通过特定的Shader可以在编辑器中仿真手机效果。迁移至URP时,需要注意整体渲染流程的调整。

huawei AREngine 默认的 builtin 的渲染管线绘制预览流, 在如今行业普遍使用的自定义渲染管线有点儿过时。 看 ARFoundation 的实现, 已经默认支持builtin和urp的无缝切换, 于是就想着把 AREngine 的预览流绘制使用urp来实现一遍。

builtin的预览流实现:

首先预览流信息直接由GPU端直传到 glsl(shader)里了, 这个不需要经过cpu, 比如说转yuv这些格式, 这个效率是非常高了, 像官方c#里的代码的实现很多都是冗余的代码, 完全没有必要且可以删减。

AREngine渲染预览流

真正传递camera信息过来是在glsl里使用了特使的标记 samplerExternalOES:

 uniform samplerExternalOES _MainTex;

关于Android是如何获取预览流并绑定纹理具体可以参考链接

在使用 samplerExternalOES 纹理前, 需要开启camera, 这个步骤既可以通过 AREngine的 SesssionComponent 组件, 也可以使用 unity 自带的 WebCamera来实现。 获取到纹理之后, 如何显示在屏幕上呢?

AREngine 使用的 CommandBuffer Blit, 这点跟 ARCore是一致的, 且绑定了 BeforeForwardOpaque、BeforeGBuffer 两个Event, 分别对应 前向渲染 和延时渲染。


                
在使用URP渲染管线Unity Pico MR环境中实现正常的实景遮挡,可采用以下方法: ### 场景与相机设置 在URP渲染管线中,需要确保场景和相机的设置正确。设置相机为MR相机以捕捉真实环境画面,同时,要根据URP的特性来调整相机的参数,如投影矩阵、视锥体等。对于平行光源组件,相比向前渲染管线URP多了Bias设置,其设置为”Use Pipeline Settings”时,需去Pipeline Settings里面查看与光相关Bias设置[^1]。 ### 深度信息获取与处理 利用Pico设备提供的深度信息,这是实现实景遮挡的关键。在URP中,可以通过Pico SDK提供的接口获取深度图数据。然后在着色器中处理这些深度信息,根据深度值判断虚拟对象是否被真实场景遮挡。以下是一个简单的URP着色器示例,用于根据深度信息进行基本的遮挡处理: ```glsl Shader "URP/MR_Occlusion" { Properties { _MainTex ("Texture", 2D) = "white" {} } SubShader { Tags { "RenderType"="Opaque" "RenderPipeline" = "UniversalRenderPipeline"} LOD 100 Pass { HLSLPROGRAM #pragma vertex vert #pragma fragment frag #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" struct appdata { float4 vertex : POSITION; float2 uv : TEXCOORD0; }; struct v2f { float2 uv : TEXCOORD0; float4 vertex : SV_POSITION; }; sampler2D _MainTex; float4 _MainTex_ST; v2f vert (appdata v) { v2f o; o.vertex = TransformObjectToHClip(v.vertex.xyz); o.uv = TRANSFORM_TEX(v.uv, _MainTex); return o; } half4 frag (v2f i) : SV_Target { // 这里可以添加根据深度信息进行遮挡判断的逻辑 half4 col = tex2D(_MainTex, i.uv); return col; } ENDHLSL } } FallBack "Diffuse" } ``` ### 遮挡剔除优化 使用遮挡剔除(Occulusion Culling)来优化性能。在URP中,点击相机中的Occulusion Culling开启功能,然后通过window -> rendering -> occlusion culling,点击Bake,最后在visualization中查看遮挡情况。这样可以避免渲染被遮挡的虚拟对象,提高性能[^2]。 ### 碰撞检测与物理模拟 利用Unity的物理引擎模拟虚拟对象与真实环境的碰撞。为虚拟对象添加碰撞体组件,监听碰撞事件。当虚拟对象与真实场景发生碰撞时,根据碰撞结果进行遮挡处理。 ### 实时更新与优化 由于MR环境是实时变化的,需要实时更新深度信息和虚拟对象的状态。同时,采用分层渲染、视锥体剔除等技术优化性能,避免过多的计算影响帧率。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值