团结,天空和远剪裁

时间:2017-03-21 09:39:49

标签: unity3d google-cardboard virtual-reality google-vr

我正在为movil VR开发,所以必须在这里进行表演。

在VR的每一个好习惯中都写了这个,以避免统一的天空盒,而是使用天幕。我在搅拌器中用它的质地创造了一个圆顶。

我将圆顶导入为fbx,应用移动/无光泽着色器和纹理图像,看起来很棒。

我的问题是,当运行游戏时,圆顶离开远剪裁平面。 选项:

  • 设置更大的远剪裁平面,它引导了很多我想剪辑的东西..没有剪裁。
  • 设置某种两次渲染渲染,我甚至没有尝试,开销听起来很糟糕。
  • 设置高远裁剪平面,然后将每层的剔除设置为其他所有内容,这样可行,但会导致分辨率问题,因为" action"实际上接近玩家。

我没有测试,但我非常确定VR中的圆顶我们可以使用单个渲染作为背景,对于双眼都是一样的(因为它是无限的,不应该是视差。

我做了消化,添加了第二个相机,Clear Flags: Depth onlyculling mask only DomeLayer并实际将相机移动到DomeLayer 主摄像头(来自googleVR演示场景)设置为Clear Flags: Don't clear,剔除掩码为Everything but DomeLayer

它有点有用但是

  1. 两台相机之间存在去同步。 enter image description here 注意小的第一个圆锥(主摄像头)的角度和较大的外圆锥(圆顶摄像头)的方向,顺便说一下我不能将摄像头设置为左或右摄像头的孩子,因为它们在我开始之前不存在游戏。

  2. 开启第二台相机时的开销令人印象深刻.. enter image description here 我关闭了球型摄像机,让它运行一段时间并重新打开,注意SetPass和任何其他指标。第二台相机的影响很难看。

  3. 我在没有专用显卡的笔记本电脑上运行,但仍然存在开销,而且这个问题是在移动设备上运行的。

    我做错了吗?

3 个答案:

答案 0 :(得分:2)

只需使用两个相机,第一个将渲染您的所有环境,第二个将只渲染您的圆顶。只需使用以下步骤更改每个相机将呈现的内容:

1)第一个相机:将标签设置为 MainCamera ,然后参数清除标记:不要清除剔除蒙版:混合...... (选择除DomeLayer以外的每一层)

2)创建名为 DomeLayer 的新图层

3)创建第二个摄像机作为第一个摄像机的孩子,然后设置参数:清除标志:仅深度剔除面具:DomeLayer 。第二个相机Depth参数也应为-1

4)然后将 Dome 对象放在DomeLayer以及除DomeLayer以外的任何图层上的所有其他对象

以下是示例场景的截图:

第一台相机: enter image description here

第二台相机(第一台相机的孩子):

enter image description here

这样,您可以单独设置两个摄像机的剪裁平面而不会失去性能。

答案 1 :(得分:2)

为skyDome添加新相机并执行以下步骤

  • 确保skyDome的相机没有标签mainCamera。
  • 制作一个新图层skyDome。
  • 将此相机的图层更改为skyDome。
  • 将skyDome网格图层更改为skyDome。
  • 将此相机的清除标志设置为Skybox。
  • 将此摄像机的剔除遮罩仅设置为skyDome图层。
  • 将mainCamera的Clear标志设置为Depth only。
  • 将图层的剔除蒙版设置为skyDome以外的所有内容。

答案 2 :(得分:2)

你可以通过一些着色器技巧和一个摄像头来实现这一目标。

创建一个新的不亮的着色器。

设置要在几何体后渲染的材质的RenderQueue。这将减少透支。 https://docs.unity3d.com/Manual/SL-SubShaderTags.html

尝试

"Queue"="Geometry+1"

禁用深度写入(Zwrite Off) - 这样可以节省性能,并防止你的天幕被剪切掉任何透明度。

启用深度测试(ZTest LEqual) - 这可以防止你的天体遮挡其他几何体。

在顶点着色器中,您可以通过摆弄近/远剪裁平面,在“无限”处创建一个天体的错觉。

Proj Mat [2][2] = -(far+near) / (far - near)
Proj Mat [3][2] = -2*far*near / (far - near)

http://www.terathon.com/gdc07_lengyel.pdf

float4x4 newMat= UNITY_MATRIX_P;
newMat[2][2]= -(1001.0/999.0);
newMat[3][2]= -2*1000.0/999.0;
v.vertex.xyz *= 100;
v.vertex = mul(UNITY_MATRIX_V,v.vertex);
o.vertex = mul(newMat,v.vertex);