URP 管线下的 AREngine 预览流绘制

本文介绍了如何在 Unity 的 Universal Render Pipeline (URP) 下,使用 C# 和 Shader 实现 Huawei AREngine 预览流的绘制。通过创建自定义的 ARBackgroundRenderFeature 和 RenderPass,实现了预览流在 URP 中的无缝集成。在 PC 平台,由于平台差异,需要额外处理以模拟手机上的预览效果。文章还强调了在 URP 管线中完全切换 AREngine 需要对其他渲染部分进行相应调整。

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, 分别对应 前向渲染 和延时渲染。


                
Unity引擎中,使用Universal Render Pipeline (URP) 创建车漆材质Shader通常涉及到Shader Graph编写。下面是一个基本的步骤和一个简化的脚本示例,用于创建一个基础的车漆效果。请注意,实际项目可能需要更复杂的设置以适应光照、反射等特性。 首先,确保你已经安装了URP并了解了Shader Graph的基本操作。创建一个新的Unlit Master Node Shader,命名为`CarPaint`. 1. **节点结构**: - 添加`Base Color`输入节点作为底色。 - 添加`Roughness`输入节点控制表面粗糙度。 - `UV`输入节点获取纹理坐标。 - `Image Texture`节点用于加载车漆纹理。 - `One Over Distance`节点用于渐变效果,如颜色淡化边缘。 2. **节点连接**: - 将`Image Texture`节点的输出连接到`Sample Texture`节点。 - 通过`UV`节点将纹理坐标传给`Sample Texture`节点。 - 使用`Multiply`节点将底色乘以纹理颜色。 - 使用`One Over Distance`节点的输出做为透明度,较远的地方颜色会淡出。 ```shader Shader "Custom/CarPaint" { Properties { _Color ("Base Color", Color) = (1, 1, 1, 1) _Roughness ("Roughness", Range(0, 1)) = 0.5 _MainTex ("Texture", 2D) = "white" {} } SubShader { Tags {"Queue"="Transparent" "RenderType"="Opaque"} LOD 100 Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" struct appdata { float4 vertex : POSITION; float2 uv : TEXCOORD0; }; struct v2f { float2 uv : TEXCOORD0; float4 vertex : SV_POSITION; }; sampler2D _MainTex; fixed4 _Color; float _Roughness; v2f vert (appdata v) { v2f o; o.vertex = UnityObjectToClipPos(v.vertex); o.uv = v.uv; return o; } fixed4 frag (v2f i) : SV_Target { fixed4 col = tex2D(_MainTex, i.uv); col.rgb *= _Color.rgb; col.a *= smoothstep(_Roughness, 0.0, saturate(distance(i.uv, vec2(0.5, 0.5)))); return col; } ENDCG } } FallBack "Diffuse" } ```
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值