zoukankan      html  css  js  c++  java
  • Unity HDRP 多摄像机分层渲染

    新版 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摄像机与主摄像机实现数据同步:

            //设置UI摄像机与主摄像机保持同步
            var uiCamera = Camera.GetComponent<UniversalAdditionalCameraData>().cameraStack[0];
            uiCamera.orthographic = Camera.orthographic;
            uiCamera.fieldOfView = CameraFOV;
            uiCamera.orthographicSize = OrthographicSize;
            uiCamera.nearClipPlane = NearClipPlane;
            uiCamera.farClipPlane = FarClipPlane;
            //...
  • 相关阅读:
    阿里云 MaxCompute 2019-12 月刊
    【原】react+redux实战
    【原】http缓存与cdn相关技术
    【原】redux异步操作学习笔记
    【原】javascript最佳实践
    【原】react做tab切换的几种方式
    【原】web移动端常用知识点笔记
    【原】移动端界面的适配
    【原】js检测移动端横竖屏
    【原】javascript数组操作
  • 原文地址:https://www.cnblogs.com/koshio0219/p/14263078.html
Copyright © 2011-2022 走看看