“Camera Stacking”(相机堆叠)是Unity的通用渲染管道(Universal Render Pipeline, URP)中的一个功能,允许你将多个相机的输出叠加在一起,从而创建一个单一的组合输出。这种技术特别适用于创建如3D模型在2D用户界面上的效果,或者车辆驾驶舱等复杂场景。
相机堆叠的工作原理
相机堆叠由一个基础相机(Base Camera)和一个或多个覆盖相机(Overlay Cameras)组成。堆叠的输出会覆盖基础相机的输出,因此你可以用相机堆叠完成基础相机所能做的所有事情,比如将堆叠渲染到特定的渲染目标,应用后处理效果等。
优化和注意事项
URP在单个相机内部执行多种优化,包括渲染顺序优化以减少过度绘制(overdraw)。但是,当你使用相机堆叠时,你实际上定义了相机的渲染顺序。因此,必须小心不要以导致过度绘制的方式排列相机。有关URP中的过度绘制的更多信息,请参见高级信息。
如何添加相机到相机堆叠
- 在场景中创建一个相机,其默认渲染类型为“基础”,使其成为基础相机。
- 在场景中创建另一个相机,并选择它。
- 在相机检查器中,将相机的渲染类型更改为“覆盖”。
- 再次选择基础相机。在相机检查器中,滚动到“堆叠”部分,点击加号(+)按钮,然后点击覆盖相机的名称。
现在,覆盖相机已经成为基础相机的相机堆叠的一部分。Unity将在基础相机的输出之上渲染覆盖相机的输出。
你也可以通过脚本将相机添加到相机堆叠中,通过直接操作基础相机的UniversalAdditionalCameraData组件的cameraStack属性来实现,如下所示:
csharpvar cameraData = camera.GetUniversalAdditionalCameraData();
cameraData.cameraStack.Add(myOverlayCamera);
如何从相机堆叠中移除相机
创建一个至少包含一个覆盖相机的相机堆叠,然后你可以通过以下步骤从堆叠中移除相机:
- 选择基础相机。
- 在相机检查器中,滚动到“堆叠”部分。
- 找到你想要移除的覆盖相机,然后点击它从堆叠中移除。
或者,你也可以通过脚本从相机堆叠中移除相机,如下所示:
csharpvar cameraData = camera.GetUniversalAdditionalCameraData();
cameraData.cameraStack.Remove(myOverlayCamera);
更改相机堆栈中的相机顺序
- 创建相机堆栈:首先,您需要创建一个包含多个叠加相机的相机堆栈。有关如何添加相机到堆栈的说明,请参见“将相机添加到相机堆栈”部分。
- 选择基础相机:在相机堆栈中,选择您想要作为基础相机(Base Camera)的那个。
- 调整顺序:在相机检查器(Camera Inspector)中,滚动到“堆栈”(Stack)部分。您会看到旁边有手柄的叠加相机名称。使用这些手柄可以重新排序叠加相机的列表。
- 渲染顺序:基础相机渲染相机堆栈的基础层,而堆栈中的叠加相机则按照它们在列表中的顺序(从顶部到底部)渲染在基础相机的上方。
- 脚本中重新排序:您还可以通过直接操纵基础相机的“通用附加相机数据”(Universal Additional Camera Data)组件的cameraStack属性,在脚本中重新排序相机堆栈。
将同一个叠加相机添加到多个堆栈
- 创建相机堆栈:首先,创建一个包含至少一个叠加相机的相机堆栈。有关如何添加相机的说明,请参见“将相机添加到相机堆栈”部分。
- 创建新的基础相机:在场景中创建一个新的相机。其默认渲染类型为“基础”,使其成为基础相机。
- 选择新相机:选择您刚刚创建的新基础相机。
- 添加到堆栈:在相机检查器中,滚动到“堆栈”部分,点击加号(+)按钮,然后点击您想要在两个相机堆栈中使用的叠加相机的名称。
- 脚本中添加相机:您还可以通过直接操纵基础相机的“通用附加相机数据”组件的cameraStack属性,在脚本中将相机添加到相机堆栈中。例如:
csharpvar cameraData = camera.GetUniversalAdditionalCameraData();
cameraData.cameraStack.Add(myOverlayCamera);
这样,您就可以控制相机在堆栈中的渲染顺序,并将相同的叠加相机添加到多个堆栈中,以实现不同的渲染效果。