unity 实时画面投屏到手机_将Unity实时画面投屏到手机

本文介绍了尝试将Unity实时画面投屏到手机的过程,通过创建Render Texture和使用脚本来获取相机数据。然而,在高分辨率下,数据传输速率过高,现有网络环境无法满足。作者尝试使用Compute Shader压缩像素,但效果仍不理想,期待更多解决方案。
摘要由CSDN通过智能技术生成

一直有个想法,如果手机只作为VR显示端,那么用PC来运行VR程序,传输实时画面到手机不就可以了。今天就来实验下,看看方案是否可行。

首先创建一个Render Texture,用于将相机渲染到该目标。

创建以下脚本,实时获取Render Texture中的数据:

using UnityEngine;

using UnityEngine.UI;

public class GetCameraTexture : MonoBehaviour

{

Camera cam;

RenderTexture rt;

public RawImage ri;

public Text text;

void Start()

{

cam = GetComponent();

rt = cam.targetTexture;

rt.vrUsage = VRTextureUsage.TwoEyes;

t2d = new Texture2D(rt.width, rt.height, TextureFormat.ARGB32, false, true);

ri.texture = t2d;

}

const float MB = 1024 * 1024;

float max = 0;

float min = float.MaxValue;

void OnPostRender()

{

GetRTPixels(rt);

byte[] x = t2d.GetRawTextureData();

//byte[] x = t2d.EncodeToJPG(); //这种也不靠谱,帧率瞬间降至15 float send = x.Length / MB;

float cur = send / Time.deltaTime;

max = Mathf.Max(max, cur);

min = Mathf.Min(min, cur);

text.text = "发送一次的大小:" + send.ToString("0.##") + " MB\n\n" + "单位:MB/S\n当前:" + cur.ToString("0.##") + "\n最大:" + max.ToString("0.##") + "\n最小:" + min.ToString("0.##");

}

static Texture2D t2d;

static public Texture2D GetRTPixels(RenderTexture rt)

{

RenderTexture currentActiveRT = RenderTexture.active;

RenderTexture.active = rt;

t2d.ReadPixels(new Rect(0, 0, t2d.width, t2d.height), 0, 0);

t2d.Apply();

RenderTexture.active = currentActiveRT;

return t2d;

}

}

然后将Unity切换到XR模式,运行看效果:

当使用HTC Vive分辨率时,传输需要的速率一下上升到了600MB/S,以现在的Wifi网络环境根本达不到这要求呀,看来还是放弃算了。

今天的实验到此结束,欢迎神通广大的网友说说你的看法吧~

更新于 2018年7月30日

1080P分辨率发送一次的数据量如此庞大,于是决定进行一下小小的压缩。思路就是通过ComputeShader来将一个像素压缩到一个16bit大小的单元中。经过今天一晚上的努力终于成功了,不过最终结果就是数据体积减半,实际使用还是不太现实。

首先创建一个ComputeShader来用于压缩像素,将最终压缩完的像素保存到以下变量:

RWStructuredBuffer Result;

然后编写脚本,在每帧中读取GPU为我们压缩好的数据:

void RunShader()

{

int kernelHandle = shader.FindKernel("CSMain");

shader.SetTexture(kernelHandle, "InputTex", rt);

shader.SetBuffer(kernelHandle, "Result", buffer);

shader.SetTexture(kernelHandle, "OutputTex", rt_result);

shader.Dispatch(kernelHandle, rt.width, rt.height, 1);

buffer.GetData(output);

}

运行以后最终结果,测试还是使用的是华为手机1080P分辨率大小

看结果一帧画面还是很大,广大网友们有没有更好的思路呢。。。

联系我们

* 网址:神工团队

* 工作邮箱:2423200363@qq.com

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值