一、原理总述
首先通过PICO SDK透视开启接口开启透视;然后对传送门模型进行处理,分别在门的两端添加附带有处理Shader的Quad,面向真实世界一侧的Quad添加附带深度测试或者模板测试Shader的材质,面向虚拟世界一侧的Quad添加附带Underlay “开洞” Shader的材质。
为了方便表述,将面向真实世界一侧的Quad附带的Shader表示为Shader[See Virtual],而将面向虚拟世界一侧的Quad附带的Shader表示为Shader[See Reality]。
整体原理示意图如下。
二、实现方式
以上Shader[See Virtual]有两种实现方式,分别是深度测试和模板测试。
1、深度测试
这种实现方式相对于模板测试来说较为繁琐,需要创建一个附带Underlay “开洞” Shader材质的包围盒,这个包围盒可以六个面都采用Quad来做。让包围盒包裹相机和传送门,遮住外围的虚拟场景。
(1)包围盒创建
这个创建的包围盒可以营造有局限的真实世界,即开启透视之后可以在包围盒范围内看到真实世界以及传送门。
(2)Shader[See Virtual]依附物制作
采用只保留深度计算的Shader制作传送门观看虚拟世界一侧效果,这里将此侧Quad表示为Quad[See Virtual]。注意,虚拟世界、Quad[See Virtual]和包围盒的Render Queue需要满足虚拟世界 < Quad[See Virtual] < 包围盒。
(3)穿越传送门
可以在传送门上添加碰撞体,相机下创建一个带有碰撞体及刚体并隐藏网格渲染器的球体,来进行触发检测是否穿越门,注意传送门碰撞体勾选触发检测开关。我们将虚拟世界一侧的Quad表示为Quad[See Reality]。
此处触发检测配合相机和传送门之间坐标关系计算一起实现。当穿越进虚拟世界一侧时,将包围盒隐藏,此时会完全进入虚拟世界,同时可以通过Quad[See Reality]看到真实世界;当再次穿越真实世界一侧时,只需将包围盒显示,此时会进入局限的真实世界,同时可以通过Quad[See Virtual]看到虚拟世界。
2、模板测试
模板测试需要采用Unity的URP渲染管线实现,方便针对Stencil属性进行控制。
(1)Shader[See Virtual]依附物制作
采用模板测试的Shader制作传送门观看虚拟世界一侧效果,这里将此侧Quad表示为Quad[See Virtual]。可以将Quad[See Virtual]材质的Stencil ID属性修改为1,便于后续进行条件比较。
(2)虚拟场景制作
将虚拟场景所有物体作为同一个物体的子物体,然后修改父物体的层级为自定义层级。
(3)修改URP渲染管线数据资产
此处在原来URP渲染管线资产绑定的数据资产基础上复制一份数据资产,在将复制的数据资产赋值给URP渲染管线资产。在复制的数据资产里添加一个渲染特征,此渲染特征选择渲染物体。
在过滤条件处将自定义层级去除,勾选Stencil并将比较值改为1,比较方法改为相等。
进行完以上三步后,只能通过Quad[See Virtual]看到虚拟世界场景。
(4)穿越传送门
可以在传送门上添加碰撞体,相机下创建一个带有碰撞体及刚体并隐藏网格渲染器的球体,来进行触发检测是否穿越门,注意传送门碰撞体勾选触发检测开关。我们将虚拟世界一侧的Quad表示为Quad[See Reality]。
此处触发检测配合相机和传送门之间坐标关系计算一起实现。当穿越进虚拟世界一侧时,将Stencil的比较方法改为Disabled,其他属性不变,此时会完全进入虚拟世界,同时可以通过Quad[See Reality]看到真实世界;当再次穿越真实世界一侧时,只需将Stencil的比较方法改为Equal,其他属性不变,此时会完全进入真实世界,同时可以通过Quad[See Virtual]看到虚拟世界。
三、代码实现
多重传送门代码实现参见:PICO4 传送门效果开发小结之多重传送门代码实现
四、效果演示
效果演示参见:PICO4 MR多重传送门效果演示