VR中的Unity ReadPixels

时间:2018-08-20 21:03:36

标签: unity3d opengl graphics rendering google-cardboard

我正在尝试使用以下命令将当前屏幕捕获为纹理:

texture.ReadPixels(new Rect(0, 0, Screen.width, Screen.height), 0, 0, false);
texture.Apply();

然后直接使用以下命令将其全屏显示:

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(谷歌纸板)时,纹理会变形。我猜想罪魁祸首是VR SDK投影矩阵,所以我研究了Camera.SetStereoProjectionMatrix。设置这些似乎并不影响任何事情。

我使用预定义的纹理尝试了代码的第二部分,该纹理在设备上可以正常显示,从而将其范围缩小到捕获阶段。

有人可以阐明这一点吗?

enter image description here

1 个答案:

答案 0 :(得分:1)

只有一半的纹理被填充,我突然想到在VR中,每只眼睛需要分别渲染。我对该管道还不太熟悉,但是我尝试的第一件事是在创建新的Texture和BAM时使用RenderTexture大小而不是Screen大小!显然我为我的纹理分配了错误的(两倍)大小,使它在渲染时显得被压缩了。

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;

我可能仍然需要考虑两只不同的眼睛,从而捕获2种纹理,但这是另一种冒险,欢呼!