一直有个想法,如果手机只作为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