新版 Unity引入了全新的 HDRP(High Definition Render Pipeline)渲染管线,开发者从此可以更加愉快的添加各类屏幕后预设效果。官方文档位置如下:
https://docs.unity3d.com/Packages/com.unity.render-pipelines.high-definition@8.2/manual/index.html
例如,添加一个全局的Bloom效果只需要在菜单中选择一个预设组件即可,比以前方便太多。
不过实际使用过程中还是遇到了一个问题:
虽然Volume组件中可以选择全局(Global)或者局部(Local)的渲染方式,但Local方式并不能按层来进行后处理,而是需要在每一个待渲染的预制体上都挂载一个触发器(Trigger)来进行识别,
然而大部分实际的开发情况是,只需要将不进行后处理的预制体筛选出来单独放在一层渲染即可,其余正常进行后处理的场景物体不做任何特殊处理。
那么有没有办法按层而不是仅仅只能按物体来区分渲染呢?
查阅了官方文档和网上资料后,发现了一种十分简单的实现方式——用两个摄像机分别渲染。
基本思路为:
对两个摄像机的Culling Mask属性中各自需要渲染的层进行区分,并使其中一个摄像机打开后处理的开关,另一个摄像机不打开。
以UI层为例,实际上有一些场景中的3D UI并不需要任何的屏幕后效果;如果开全局Bloom,UI的设计效果会受到很大影响,但如果用Local模式,策划就需要每个关卡添加触发器结果可能当场吐血。
为了避免如上惨剧发生,可以建立一个单独渲染场景UI的摄像机与主摄像机进行区分,并将UI摄像机Transform复位后挂载到主摄像机的子节点下。
主摄像机A设置如下:
UI 摄像机B设置如下:
Stack为摄像机的渲染栈,栈渲染即不用一个摄像机来渲染所有内容,而使用多个相互堆叠的摄像机来实现层级式帧渲染的方式。
并且在摄像机的渲染栈中可以很方便的取得其他关联摄像机的信息,只需要引入如下命名空间即可:
using UnityEngine.Rendering.Universal;
例如我们可以很方便的对UI摄像机与主摄像机实现数据同步:
代码语言:javascript复制 //设置UI摄像机与主摄像机保持同步
var uiCamera = Camera.GetComponent<UniversalAdditionalCameraData>().cameraStack[0];
uiCamera.orthographic = Camera.orthographic;
uiCamera.fieldOfView = CameraFOV;
uiCamera.orthographicSize = OrthographicSize;
uiCamera.nearClipPlane = NearClipPlane;
uiCamera.farClipPlane = FarClipPlane;
//...