养生 装修 购物 美食 感冒 便秘 营销 加盟 小吃 火锅 管理 创业 搭配 减肥 培训 旅游

Unity 实用教程 之 实现类AR扫描全屏幕效果

时间:2024-11-11 20:21:18

Unity实用教程之实现AR扫描全屏幕效果。本节介绍,在Unity开发中,实现简单AR扫描全屏幕效果,具体如下

Unity 实用教程 之 实现类AR扫描全屏幕效果

工具/原料

Unity

方法/步骤

1、打开Unity,新建一个空工程,具体如下图

Unity 实用教程 之 实现类AR扫描全屏幕效果

2、在场景中添加一个RawImage,改名为Image(多余操作),具体如下图

Unity 实用教程 之 实现类AR扫描全屏幕效果

Unity 实用教程 之 实现类AR扫描全屏幕效果

3、在工程中,新建一个Shader,命名为ScanEffect,并打开编辑,具体如下图

Unity 实用教程 之 实现类AR扫描全屏幕效果

4、Shader脚本具体代码如下图

Unity 实用教程 之 实现类AR扫描全屏幕效果

Unity 实用教程 之 实现类AR扫描全屏幕效果

Unity 实用教程 之 实现类AR扫描全屏幕效果

Unity 实用教程 之 实现类AR扫描全屏幕效果

5、Shader脚本具体内容如下:Shader"Custom/S罕铞泱殳canEffect"撑俯擂摔{ properties{ _MainTex("MainTex",2D)=""{} edgeColor("edge",Color)=(1,0,0,1) Range1("R",Range(0,5))=1 } Subshader{ pass{ CGPROGRAM #pragmavertexvert #pragmafragmentfrag structa2v{ float4vertex:POSITION; float4texcoord:TEXCOORD; }; structv2f{ float4pos:SV_POSITION; half2uv[9]:TEXCOORD0; }; sampler2D_MainTex; float4_MainTex_ST; float4_MainTex_TexelSize; fixed4edgeColor; floatRange1; v2fvert(a2vv){ v2fo; o.pos=UnityObjectToClipPos(v.vertex); o.uv[0]=v.texcoord.xy+_MainTex_TexelSize.xy*half2(-1,-1); o.uv[1]=v.texcoord.xy+_MainTex_TexelSize.xy*half2(0,-1); o.uv[2]=v.texcoord.xy+_MainTex_TexelSize.xy*half2(1,-1); o.uv[3]=v.texcoord.xy+_MainTex_TexelSize.xy*half2(-1,0); o.uv[4]=v.texcoord.xy+_MainTex_TexelSize.xy*half2(0,0); o.uv[5]=v.texcoord.xy+_MainTex_TexelSize.xy*half2(1,0); o.uv[6]=v.texcoord.xy+_MainTex_TexelSize.xy*half2(-1,-1); o.uv[7]=v.texcoord.xy+_MainTex_TexelSize.xy*half2(0,-1); o.uv[8]=v.texcoord.xy+_MainTex_TexelSize.xy*half2(1,-1); returno; } fixedluminance(fixed4c){ return0.2125*c.r+0.7154*c.g+0.0721*c.b; } halfSobel(v2fx){ consthalfGx[9]={ -1,-2,-1, 0,0,0, 1,2,1 }; consthalfGy[9]={ -1,0,1, -2,0,2, -1,0,1 }; halfedgeX=0; halfedgeY=0; halft; for(inti=0;i<9;i++) { t=tex2D(_MainTex,x.uv[i]); edgeX+=t*Gx[i]; edgeY+=t*Gy[i]; } halfedge=abs(edgeX)+abs(edgeY); returnedge; } fixed4frag(v2fi):SV_Target{ fixed4col=fixed4(1,0,0,1); half2v1=i.uv[4]; col=tex2D(_MainTex,v1); halfd=Sobel(i); if(d>Range1) { if(abs(v1.y-frac(_Time.y))<0.05) { col=lerp(col,edgeColor,d); } } returncol; } ENDCG } }}

6、编译正确,回到Unity界面,新建一个材质Material,命名为Scan讵症慧鹱Screen,shader选择之前刚建的Shader,具体如下图

Unity 实用教程 之 实现类AR扫描全屏幕效果

7、在工程中,新建一个脚本ScanScreenEffect,双击脚本或者右键OpenC#Project打开脚本,具体如下图

Unity 实用教程 之 实现类AR扫描全屏幕效果

8、脚本的具体代码如下图

Unity 实用教程 之 实现类AR扫描全屏幕效果

Unity 实用教程 之 实现类AR扫描全屏幕效果

9、脚本的具体内容如下:usingSystem.Coll娣定撰钠ections;usingSystem.Collec墉掠载牿tions.Generic;usingUnityEngine;usingUnityEngine.UI;publicclassScanScreenEffect:MonoBehaviour{[SerializeField]privateRawImagewebRawImage;publicMaterialma;voidStart(){StartCoroutine(startOpenCamera());}IEnumeratorstartOpenCamera(){yieldreturnApplication.RequestUserAuthorization(UserAuthorization.WebCam);if(Application.HasUserAuthorization(UserAuthorization.WebCam)){WebCamTexturewbt=newWebCamTexture();WebCamDevice[]devices=WebCamTexture.devices;string_deviceName="";if(devices.Length>=1){_deviceName=devices[0].name;}wbt.name=_deviceName;webRawImage.texture=wbt;wbt.Play();}}voidOnRenderImage(RenderTexturesrc,RenderTexturedest){if(ma!=null){Graphics.Blit(src,dest,ma);}else{Graphics.Blit(src,dest);}}}

10、脚本编译正确,回到Unity界面,挂载脚本到MainCamera,把RawImage和ScanScreen材质赋值给脚本,具体如下图

Unity 实用教程 之 实现类AR扫描全屏幕效果

11、其中Canvas的RenderMode咯悝滩镞为Screen-SpaceCamera,RenderCamera为MainCamera,具体如下图

Unity 实用教程 之 实现类AR扫描全屏幕效果

12、打包编译,打开应用,结果具体如下图

Unity 实用教程 之 实现类AR扫描全屏幕效果

13、到此,《Unity实用教程之实现类AR扫描全屏幕效果》讲解结束,谢谢

© 一点知识