我有一个用于 Oculus Rift 的简单 Unity3D 场景,并希望添加向用户显示他自己的桌面的功能(从主监视器)。我发现我可以将它渲染到Texture2D,但是如何有效地捕获桌面?
实际上,我需要提供类似http://www.vrdesktop.net/的东西,它允许用户在 VR 中看到他的显示器的内容。但我需要将它实现为 Unity3D 的库。那么最好的方法是什么?
PS 最好有一个跨平台的解决方案,至少是 Windows 和 Linux/Mac。
我有一个用于 Oculus Rift 的简单 Unity3D 场景,并希望添加向用户显示他自己的桌面的功能(从主监视器)。我发现我可以将它渲染到Texture2D,但是如何有效地捕获桌面?
实际上,我需要提供类似http://www.vrdesktop.net/的东西,它允许用户在 VR 中看到他的显示器的内容。但我需要将它实现为 Unity3D 的库。那么最好的方法是什么?
PS 最好有一个跨平台的解决方案,至少是 Windows 和 Linux/Mac。
这个有效(至少对于 Windows):
Texture2D tex = new Texture2D (200, 300, TextureFormat.RGB24, false);
Rectangle screenSize = System.Windows.Forms.Screen.PrimaryScreen.Bounds;
Bitmap target = new Bitmap (screenSize.Width, screenSize.Height);
using (System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(target)) {
g.CopyFromScreen (0, 0, 0, 0, new Size (screenSize.Width, screenSize.Height));
}
MemoryStream ms = new MemoryStream ();
target.Save (ms, ImageFormat.Png);
ms.Seek (0, SeekOrigin.Begin);
tex.LoadImage (ms.ToArray ());
renderer.material.mainTexture = tex;
但是这里的效率是有问题的 - 每一帧都转换为 PNG,另一方面,使用 CopyFromScreen 捕获效果很好。
(限制)正如 Mono 文档中所说:“适用于 Win32 和 X11(但不适用于 Cocoa 和 Quartz)”
我相信 Unity3D 没有这种功能。如果您希望能够与桌面交互,您将使用远程桌面软件。如果要获取桌面视图,可以使用屏幕捕获/录制软件。否则,您将不得不使用极其复杂或花哨的方法将其集成到 Unity 中。这里的评论之一非常有用。