六、更改可視化平面樣式(請參考ARFoundation Samples )
1.新建一個Shader命名為 FeatheredPlaneShader 代碼如下
Shader "Unlit/FeatheredPlaneShader" { Properties { _MainTex ("Texture", 2D) = "white" {} _TexTintColor("Texture Tint Color", Color) = (1,1,1,1) _PlaneColor("Plane Color", Color) = (1,1,1,1) } SubShader { Tags { "RenderType"="Transparent" "Queue"="Transparent" } LOD 100 Blend SrcAlpha OneMinusSrcAlpha ZWrite Off Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" struct appdata { float4 vertex : POSITION; float2 uv : TEXCOORD0; float3 uv2 : TEXCOORD1; }; struct v2f { float4 vertex : SV_POSITION; float2 uv : TEXCOORD0; float3 uv2 : TEXCOORD1; }; sampler2D _MainTex; float4 _MainTex_ST; fixed4 _TexTintColor; fixed4 _PlaneColor; float _ShortestUVMapping; v2f vert (appdata v) { v2f o; o.vertex = UnityObjectToClipPos(v.vertex); o.uv = TRANSFORM_TEX(v.uv, _MainTex); o.uv2 = v.uv2; return o; } fixed4 frag (v2f i) : SV_Target { fixed4 col = tex2D(_MainTex, i.uv) * _TexTintColor; col = lerp( _PlaneColor, col, col.a); // Fade out from as we pass the edge. // uv2.x stores a mapped UV that will be "1" at the beginning of the feathering. // We fade until we reach at the edge of the shortest UV mapping. // This is the remmaped UV value at the vertex. // We choose the shorted one so that ll edges will fade out completely. // See ARFeatheredPlaneMeshVisualizer.cs for more details. col.a *= 1-smoothstep(1, _ShortestUVMapping, i.uv2.x); return col; } ENDCG } } }
2.新建一個材質球,使用上面寫的 FeatheredPlaneShader Shader,命名為 FeatheredPlaneMaterial
3.將 FeatheredPlaneMaterial 材質球中的 Texture 替換成為右側鏈接中下載的圖片,貼圖下載鏈接:https://pan.baidu.com/s/1TBVeZ7sN03dVj0iKt-nWPQ 密碼:cb3f
4.Hierarchy->XR->AR Default Plane 創建AR Default Plane 命名為 AR Feathered Plane Fade
5.將 AR Feathered Plane Fade 身上的 Line Renderer 組件移除掉
6.將 AR Feathered Plane Fade 身上的Mesh Renderer材質球改成 FeatheredPlaneMaterial
7.將 AR Feathered Plane Fade 制作成為預制體,並且將 Hierarchy 中的AR Feathered Plane Fade刪除掉
8.將ARPlaneManager->Plane Prefab 設置成 AR Feathered Plane Fade
9.新建一個腳本命名為 ARFeatheredPlaneMeshVisualizer 掛載在 AR Feathered Plane Fade 上,代碼如下
using System.Collections.Generic; using UnityEngine; using UnityEngine.XR.ARFoundation; /// <summary> /// This plane visualizer demonstrates the use of a feathering effect /// at the edge of the detected plane, which reduces the visual impression /// of a hard edge. /// </summary> [RequireComponent(typeof(ARPlaneMeshVisualizer), typeof(MeshRenderer), typeof(ARPlane))] public class ARFeatheredPlaneMeshVisualizer : MonoBehaviour { [Tooltip("The width of the texture feathering (in world units).")] [SerializeField] float m_FeatheringWidth = 0.2f; /// <summary> /// The width of the texture feathering (in world units). /// </summary> public float featheringWidth { get { return m_FeatheringWidth; } set { m_FeatheringWidth = value; } } void Awake() { m_PlaneMeshVisualizer = GetComponent<ARPlaneMeshVisualizer>(); m_FeatheredPlaneMaterial = GetComponent<MeshRenderer>().material; m_Plane = GetComponent<ARPlane>(); } void OnEnable() { m_Plane.boundaryChanged += ARPlane_boundaryUpdated; } void OnDisable() { m_Plane.boundaryChanged -= ARPlane_boundaryUpdated; } void ARPlane_boundaryUpdated(ARPlaneBoundaryChangedEventArgs eventArgs) { GenerateBoundaryUVs(m_PlaneMeshVisualizer.mesh); } /// <summary> /// Generate UV2s to mark the boundary vertices and feathering UV coords. /// </summary> /// <remarks> /// The <c>ARPlaneMeshVisualizer</c> has a <c>meshUpdated</c> event that can be used to modify the generated /// mesh. In this case we'll add UV2s to mark the boundary vertices. /// This technique avoids having to generate extra vertices for the boundary. It works best when the plane is /// is fairly uniform. /// </remarks> /// <param name="mesh">The <c>Mesh</c> generated by <c>ARPlaneMeshVisualizer</c></param> void GenerateBoundaryUVs(Mesh mesh) { int vertexCount = mesh.vertexCount; // Reuse the list of UVs s_FeatheringUVs.Clear(); if (s_FeatheringUVs.Capacity < vertexCount) { s_FeatheringUVs.Capacity = vertexCount; } mesh.GetVertices(s_Vertices); Vector3 centerInPlaneSpace = s_Vertices[s_Vertices.Count - 1]; Vector3 uv = new Vector3(0, 0, 0); float shortestUVMapping = float.MaxValue; // Assume the last vertex is the center vertex. for (int i = 0; i < vertexCount - 1; i++) { float vertexDist = Vector3.Distance(s_Vertices[i], centerInPlaneSpace); // Remap the UV so that a UV of "1" marks the feathering boudary. // The ratio of featherBoundaryDistance/edgeDistance is the same as featherUV/edgeUV. // Rearrange to get the edge UV. float uvMapping = vertexDist / Mathf.Max(vertexDist - featheringWidth, 0.001f); uv.x = uvMapping; // All the UV mappings will be different. In the shader we need to know the UV value we need to fade out by. // Choose the shortest UV to guarentee we fade out before the border. // This means the feathering widths will be slightly different, we again rely on a fairly uniform plane. if (shortestUVMapping > uvMapping) { shortestUVMapping = uvMapping; } s_FeatheringUVs.Add(uv); } m_FeatheredPlaneMaterial.SetFloat("_ShortestUVMapping", shortestUVMapping); // Add the center vertex UV uv.Set(0, 0, 0); s_FeatheringUVs.Add(uv); mesh.SetUVs(1, s_FeatheringUVs); mesh.UploadMeshData(false); } static List<Vector3> s_FeatheringUVs = new List<Vector3>(); static List<Vector3> s_Vertices = new List<Vector3>(); ARPlaneMeshVisualizer m_PlaneMeshVisualizer; ARPlane m_Plane; Material m_FeatheredPlaneMaterial; }
10.打包運行,大功告成!
七、仿ARCore可視化平面樣式
1.下載替換我處理過的貼圖:鏈接:https://pan.baidu.com/s/1Pt7ygv0zCEMiKq6J3Kti0Q 密碼:vyte
2.打包運行,效果如下!
推薦學習資料
2.Unity官方API:學習一門技術,官方教程是最權威的
3.ARFoundation Samples : ARFoundation 示例地址
歡迎對AR技術感興趣的朋友,加入QQ群:883655607 討論