首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >虚拟现实中的Unity ReadPixels

虚拟现实中的Unity ReadPixels
EN

Stack Overflow用户
提问于 2018-08-21 05:03:36
回答 1查看 302关注 0票数 0

我尝试使用以下命令将当前屏幕捕获到纹理中:

代码语言:javascript
复制
texture.ReadPixels(new Rect(0, 0, Screen.width, Screen.height), 0, 0, false);
texture.Apply();

然后直接使用以下命令全屏呈现:

代码语言:javascript
复制
GL.PushMatrix();
GL.LoadOrtho();
GL.LoadProjectionMatrix(matrix); //matrix = Matrix4x4.identity * Matrix4x4.Scale(new Vector3(2, -2, 1)) * Matrix4x4.Translate(new Vector3(-0.5f, -0.5f, 0));
Graphics.DrawTexture(rect, texture, mat); //rect = new Rect(0, 0, 1, 1);
GL.PopMatrix();

这在桌面上测试时效果很好,但是当在Android上为VR (google cardboard)构建时,纹理会失真。我猜罪魁祸首是VR SDK的投影矩阵,所以我查看了Camera.SetStereoProjectionMatrix。然而,设置这些似乎不会影响任何事情。

我尝试了代码的第二部分,使用了一个预定义的纹理,它在设备上渲染得很好,因此可以将其范围缩小到捕获阶段。

有没有人能解释一下?

EN

回答 1

Stack Overflow用户

发布于 2018-08-22 02:40:04

只填充了一半的纹理,我突然想到,在VR中,每只眼睛都需要单独渲染。我对这个管道不够熟悉,但我尝试的第一件事是在创建新的纹理和BAM时使用RenderTexture大小而不是屏幕大小!显然,我为我的纹理分配了错误的(双倍)大小,使它在渲染时看起来像是挤压的。

代码语言:javascript
复制
RenderTexture curr = RenderTexture.active;
RenderTexture.active = Camera.main.activeTexture;
texture = new Texture2D(curr.width, curr.height, TextureFormat.ARGB32, false);
texture.ReadPixels(new Rect(0, 0, curr.width, curr.height), 0, 0, false);
texture.Apply();
RenderTexture.active = curr;

我可能仍然需要考虑两个不同的眼睛,从而捕获两个纹理,但这是另一个冒险,干杯!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51938467

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档