WebCamTexture API详解 https://blog.csdn.net/it_yanghui/article/details/78615209
在使用ZXing库竖屏扫描二维码时,发现画面旋转了90度。
解决方案:使用下面的shader校正渲染到RawImage上的画面
Shader "Custom/WebCamShader" { Properties { _MainTex ("Texture", 2D) = "white" {} } SubShader { Tags { "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; float4 _MainTex_ST; v2f vert (appdata v) { v2f o; o.vertex = UnityObjectToClipPos(v.vertex); o.uv = TRANSFORM_TEX(v.uv, _MainTex); return o; } fixed4 frag(v2f i) : SV_Target { //解决竖屏时WebCamTexture,画面旋转,反转问题 fixed2 uv = fixed2(1 - i.uv.y, i.uv.x); fixed4 col = tex2D(_MainTex, uv); return col; } ENDCG } } }
using System; using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; /// <summary> /// 摄像头控制器 /// </summary> public class WebCamController : MonoBehaviour { public int deviceIndex = 0; public string deviceName; public int requestedWidth = 400; public int requestedHeight = 300; public int requestedFPS = 12; [SerializeField] private RawImage _rawImage; [SerializeField] private bool _playOnAwake = false; private WebCamTexture _webCamTexture; //摄像头启动成功 public Action<WebCamTexture> OnWebCamStarted; //没有权限启动摄像头 public Action OnNoPermission; //未找到摄像头 public Action OnNotFoundCamera; private void Awake() { if (_playOnAwake) Startup(); } //启动摄像头 public void Startup() { if (_webCamTexture == null) { StartCoroutine(StartupCamera()); return; } if (!_webCamTexture.isPlaying) { _webCamTexture.Play(); OnWebCamStarted?.Invoke(_webCamTexture); } } //停止 public void Stop() { if (_webCamTexture != null && _webCamTexture.isPlaying) _webCamTexture.Stop(); } //暂停 public void Pause() { if (_webCamTexture != null && _webCamTexture.isPlaying) _webCamTexture.Pause(); } //启动摄像头 private IEnumerator StartupCamera() { yield return Application.RequestUserAuthorization(UserAuthorization.WebCam); if (Application.HasUserAuthorization(UserAuthorization.WebCam)) { WebCamDevice[] devices = WebCamTexture.devices; if (devices.Length == 0) { Debug.LogError("Not found camera."); OnNotFoundCamera?.Invoke(); yield break; } deviceName = devices[deviceIndex].name; _webCamTexture = new WebCamTexture(deviceName, requestedWidth, requestedHeight, requestedFPS); _webCamTexture.Play(); if (_rawImage != null) _rawImage.texture = _webCamTexture; OnWebCamStarted?.Invoke(_webCamTexture); } else { Debug.LogError("Unable not start the camera without permissions."); OnNoPermission?.Invoke(); } } //复制摄像头画面 public Texture2D CopyWebCamTexture() { if (_webCamTexture == null) { Texture2D test_tex = Resources.Load<Texture2D>("Texture/body_seg"); return test_tex; } Texture2D tex = new Texture2D(_webCamTexture.width, _webCamTexture.height, TextureFormat.RGBA32, false); Color[] colors = _webCamTexture.GetPixels(); tex.SetPixels(colors); tex.Apply(); return tex; } private void OnDestroy() { Stop(); if (_rawImage != null) _rawImage.texture = null; _webCamTexture = null; OnWebCamStarted = null; OnNoPermission = null; } public void ShowVideoImage() { if (_rawImage == null) return; _rawImage.gameObject.SetActive(true); } public void HideVideoImage() { if (_rawImage == null) return; _rawImage.gameObject.SetActive(false); } }