定义

首先,让我们来看看在本文中经常遇到的几个重要图形渲染术语的定义。

  • 渲染管线确定场景中对象的显示方式,分为三个主要阶段。

    • 第一步是剔除;它列出了需要渲染的对象,最好是那些对摄像机可见的对象(视锥体剔除)和其他对象不遮挡的对象(遮挡剔除)。
    • 第二个阶段渲染是指将这些对象绘制到基于像素的缓冲区中(通过正确的光照以及它们的一些属性)。
    • 最后,可以在这些缓冲区上执行后期处理操作,例如,应用颜色分级、泛光和景深,从而生成发送到显示设备的最终输出帧。

  • 着色器是在图形处理单元 (GPU) 上运行的程序或程序集合的通用名称。例如,在剔除阶段完成后,顶点着色器用于将可见对象的顶点坐标从“对象空间”转换为称为“裁剪空间”的不同空间;然后 GPU 使用这些新的坐标对场景进行光栅化,也就是将场景的矢量表示转换为实际像素。在稍后阶段,这些像素将由像素(或片元)着色器进行着色;像素颜色通常将取决于各自表面的材质属性以及周围的光照。现代硬件上另一种常见的着色器是计算着色器:计算着色器允许程序员利用 GPU 的大量并行处理能力,用于任何类型的数学运算,如光照剔除、粒子物理或体积模拟。
  • 直接光照指的是从自发光光源(如灯泡)发出的光照,而不是光从表面反射的结果。根据光源的大小及其与接收者的距离,这种光照通常会产生清晰的不同阴影。
    • 请勿将直接光照与方向光照混淆,后者是指是由无限远的光源(例如计算机模拟的太阳)发出的光。方向光的显著特性是能够用平行光线覆盖整个场景,并且不存在距离衰减(或光衰减);也就是说,接收到的光照量不会随着与光源距离的增加而衰减。
    • 在现实中,太阳光也会像任何其他光源一样,光照会按照距离的平方反比定律而衰减。简单来说,当接收者与光源之间的距离增加时,收到光照量会迅速降低。例如,水星上的太阳光照度几乎是地球上的 7 倍,火星上的太阳光照度是地球的近一半,而冥王星仅仅为 0.06%。然而,对于海拔高度范围非常有限的大多数实时应用程序来说,太阳光的衰减微不足道。因此,方向光完全足以模拟大多数 Unity 场景(包括以行星为中心的大型空旷空间)中的太阳光。
  • 间接光照是由于光从表面反射并通过介质(如大气或半透明物质)传播和散射而形成的结果。在这种状况下,遮挡物通常投射出柔和或难以看清的阴影。
  • 全局光照 (GI) 是对直接和间接光照进行建模以提供逼真光照效果的一组技术。GI 有几种方法,如烘焙/动态光照贴图、辐照度体积、光传播体积、烘焙/动态光照探针、基于体素的 GI 和基于距离场的 GI。Unity 支持开箱即用的烘焙/动态光照贴图和光照探针。
  • 光照贴图程序是一个基础系统,它通过发射光线、计算光线反弹并将产生的光线应用到纹理来生成光照贴图和光照探针的数据。因此,不同的光照贴图程序通常会产生不同的光照外观,因为它们可能依赖不同的技术来生成光照数据。

渲染管线

在 2018 年初之前,Unity 中只有一个渲染管线:内置渲染管线 (Built-In Render Pipeline)。此渲染管线提供了可选择的渲染路径:前向渲染路径和延迟渲染路径。

  • 在使用(多通道)前向渲染路径时,场景中的所有对象都是按顺序渲染,根据影响每个对象的光源数量,可能在多个通道中渲染,因此当对象被多个光源照亮时,渲染成本会急剧增加。这种类型的渲染器通常提供各种各样的着色器,并且可以很轻松地处理透明度。
  • 在使用延迟渲染路径时,所有(不透明)几何体首先渲染到缓冲区中,在其中存储有关材质的信息(颜色、镜面反射、光滑度等等)。在后一种通道(也就是“延迟”)中,每个像素按顺序着色:渲染时间将主要取决于影响每个像素的光源数量。对于透明对象以及某些包含复杂着色器的对象,仍然需要额外的前向渲染通道。当处理包含许多动态光源的场景时(例如具有人工光照的内部空间,或室外与室内光照相结合的项目),通常建议使用延迟渲染。

2018 年 1 月,Unity 推出了可编程渲染管线 (SRP),允许通过 C# 脚本来自定义渲染循环。这实际上是游戏引擎领域的一次小革命:用户终于无需使用像 C++ 这样的低级编程语言便可以个性化设置对象剔除、绘制和帧后期处理。

Unity 当前提供两个预先构建的 SRP:

  • 高清渲染管线 (HDRP) 是一种混合延迟/前向瓦片/聚类渲染器。它提供了先进的渲染和着色功能,是专为要求逼真视觉的 PC 和高端游戏主机项目而设计。

瓦片是帧的一个小型二维方形像素部分,而聚类则是摄像机视锥体中的一个三维体积。瓦片和聚类渲染技术都依赖于影响每个瓦片和聚类的光源的列表,然后可以用相应的已知光源列表在一个通道中计算其光照。不透明对象很可能使用瓦片系统进行着色,而透明对象则依赖于聚类系统。该渲染器的主要优点是,与内置渲染管线(延迟)相比,光照处理速度更快,带宽消耗也大大减少,因为内置渲染管线依赖于更慢的多通道光照积累。

  • 通用渲染管线 (URP) 是一种快速的单通道前向渲染器;它主要设计用于不支持计算着色器技术的低端设备,例如较早的智能手机、平板电脑和 XR 设备。但是,URP 还可为中端设备(如游戏主机和 PC)提供更高质量的图形性能,有时其性能成本低于内置渲染管线。URP 根据每个对象来剔除光线,并允许在单个通道中计算光照,与内置渲染管线相比,这会降低绘制调用次数。最后,URP 还提供 2D 渲染器,并规划了延迟渲染器。

全局光照系统

如果要在场景中添加间接光照,必须使用 Unity 的两个全局光照系统之一,或者使用您自己的烘焙解决方案生成这种光照。在 Unity 的 Window > Rendering > Lighting 下提供的这两个系统是:

1.实时全局光照:这个系统完全依赖于第三方光照中间件 Enlighten。在 Unity 中的预计算期间,Enlighten 经历两个漫长的阶段:聚类和光线传输。第一个阶段是将场景简化为一组称为聚类的面片,第二个阶段是计算这些聚类之间的可见性。在运行时,这些预计算的数据用于以交互方式生成间接光照。Enlighten 的强大功能依赖于实时编辑光照的能力,因为预计算的数据依赖于聚类间的关系。然而,与其他传统的光照贴图技术一样,编辑场景中的静态几何体将触发新的预计算。目前正在从 Unity 中移除 Enlighten,并在研究一种新的解决方案。 * HDRP 对于 Unity 2019.3 及更高版本中的新项目不支持实时全局光照。尽管如此,在 Unity 2019.3 之前创建的项目仍可以升级到 2019.3 或 2019 LTS。 * URP 从未支持使用 Enlighten 提供实时全局光照。 * 内置渲染管线将支持使用 Enlighten 提供实时全局光照,直到 Unity 2020 LTS(2020 年底或 2021 年初)为止。这意味着该版本的重大错误修复将继续到 2022 年底或 2023 年初。

总而言之,如果您要在 Unity 2019.3 或更高版本中创建新项目,则在使用 URP 或 HDRP 的情况下将不可使用 Enlighten。如果选择内置渲染管线,则 Enlighten 将保持可用状态,直到 2020 年底或 2021 年初。

2.烘焙全局光照:光照被烘焙成称为光照贴图的纹理以及光照探针。烘焙 GI 系统可以使用下列其中一个光照贴图程序: * 渐进光照贴图程序 (Progressive Lightmapper) * Enlighten

渐进光照贴图程序可以优先计算摄像机视野内对象的光照,并大大加快光照的迭代速度,而代价是增加整个场景的整体烘焙时间。渐进光照贴图程序使用 CPU 根据路径追踪来计算间接光照。一种新的 GPU 渐进光照贴图程序目前处于预览版,将极大降低场景的烘焙时间。

因为 Enlighten 和渐进光照贴图程序使用不同的方法产生烘焙光照,因此在比较这两者时,不应该期望得到完全匹配的光照效果。

静态与动态对比

无论使用哪种全局光照系统,在烘焙/预计算光照过程中,Unity 只会考虑标记为“Contribute GI”的对象。动态(即非静态)对象必须依赖于放置在整个场景中的光照探针来获得间接光照。

由于光照的烘焙/预计算是一个相对缓慢的过程,所以只有具有不同光照变化(例如凹度和自我阴影)的大型和复杂资源才应被标记为“Contribute GI”。获得均匀光照的较小和凸面网格不应进行这样的标记,因此它们应该从光照探针获得间接光照;光照探针中存储了更简单的光照近似值。较大的动态对象可以依赖 LPPV,以便获得更好的本地化间接光照。要最大程度减少烘焙时间并同时保持足够的光照质量,最重要的就是限制场景中标记为“Contribute GI”的对象数量。可在本教程中详细了解这个优化过程和探针光照的重要性

警告

Unity 允许烘焙和实时 GI 系统同时有效,因此可以访问所有光照功能。但是,务必注意,同时启用这两个系统会大大增加运行时的烘焙时间和内存使用量,因为这些系统不依赖相同的数据集。此外,在运行时对间接光照的交互式更新将给 CPU 带来更大的压力,而且在视觉上比较烘焙和实时 GI 系统提供的间接光照时,应该会看到差异,因为它们依赖不同的技术来模拟间接光照,并且通常以明显不同的分辨率运行。

同时使用这两个 GI 系统应仅限于高端平台和/或以可预测的成本对场景进行严格控制的项目。这种方法只应由非常了解所有光照设置的专家用户使用,因为同时管理这两个系统会增加很大的复杂性。所以,对大多数项目来说,选择两个 GI 系统的其中一个通常是更安全的策略。很少推荐同时使用这两个系统!

光照模式

Light 组件的 Mode 属性是一种常常让人混淆的属性。

Light Inspector 中提供了三种光照模式:

1.烘焙:从这些光源产生的直接和间接光照被烘焙成光照贴图,这可能是一个耗时的过程。处理这些光源不需要运行时成本,但是将所产生的光照贴图应用到场景中确实需要很小的成本。 2.实时:来自这些光源的直接光照和阴影是实时的,因此不会被烘焙成光照贴图。它们的运行成本可能很高,具体取决于场景的复杂性、阴影投射光源的数量、重叠光源的数量等。此外,如果启用实时全局光照,则会在运行时更新间接光照,从而产生性能成本。 3.混合:这种混合模式提供烘焙和实时功能(如烘焙间接光照和实时直接光照)的混合。场景中所有混合光源的行为及其性能影响取决于该场景的光照模式。

必须注意的是,只有启用了烘焙全局光照系统时,光源的模式才有意义。如果不使用任何 GI 系统或只使用实时 GI 系统,那么所有烘焙光源和混合光源的行为就好像它们的 Mode 属性设置为 Realtime 一样。

光照模式

如前面的图表中所示,场景中的所有混合光源具有特定的烘焙和实时功能,具体取决于您在 Lighting 窗口中选择的光照模式 (Lighting Mode)。

有三种模式可供选择:

1.Subtractive 2.Baked Indirect 3.Shadowmask

Shadowmask 光照模式有两个质量设置:

1.Shadowmask 2.Distance Shadowmask

渲染管线和光照解决方案相关推荐

  1. (二十)unity shader之——————基于物理的渲染技术(PBS):下篇(PBS技术拓展:全局光照、伽马校正、HDR)

    前面两篇文章我们介绍了PBS实现的数学和理论基础,和standard shader的原理和实现,还有一些其他的渲染相关的unity技术.其中有些概念和技术没有讲的很详细,现在对这些重要的概念进行更深入 ...

  2. 老人关于OGRE引擎的总体介绍

    [Ogre总揽],转至http://edu.gamfe.com/tutor/d/16715.html Ogre是一个庞大而纷杂的对象和模块集合,如果初学者希望直接从对象列表中得到什么信息的话,可能会感 ...

  3. 使用Profiler进行性能分析

    1.应用程序性能分析 帧率:单位FPS,是衡量游戏性能的标准. 渲染:绘制一帧到屏幕被称为渲染一帧. 每帧花费时间=1000/[渴望的帧率] 1.1 三种方式 在目标平台上的播放器中对应用程序进行性能 ...

  4. unity移动游戏优化指南

    目录 简介 性能分析 CPU Usage Profiler 模块 内存 自适应性能 编程和代码架构 项目配置 资源 图形和GPU优化 用户界面 音频 动画 物理 工作流程和协作 简介 优化 iOS 和 ...

  5. 虚幻5降临!再谈谈它的“黑科技”

    这是[游戏开发那些事]第49篇原创 2020年5月13日,知名游戏引擎公司Epic发布了一条令无数影视从业者.游戏从业者甚至玩家都激动不已的视频 --<初探虚幻引擎5>,视频通过逼真的场景 ...

  6. 史诗级画面刷爆全球,尼奥重返矩阵,为崔妮蒂而战!《黑客帝国4》重磅来袭!...

    转自:新智元 [导读]你想体验真实的黑客帝国吗?近日,由Epic Games发行的黑客帝国觉醒:虚幻引擎5体验版上线了.演示Demo中,尼奥和崔妮蒂的数字化身真假难辨,汽车追逐战超出现有游戏画面一个量 ...

  7. GPU Gems1 - 3 Dawn Demo中的皮肤渲染(Skin in the Dawn Demo)

    该篇文章参照浅墨的这篇文章:https://zhuanlan.zhihu.com/p/35974789 Dawn是由NVIDIA创建的,用来介绍GeForce FX产品线的演示程序,它说明如何使用可编 ...

  8. 少拿游戏来骗我,虚幻引擎5上的《黑客帝国》全新体验,画面帅到爆

    整理 | 禾木木 出品 | CSDN云计算(ID:CSDNcloud) 近日,由 Epic Games 发行的虚幻引擎 5 体验上线了. 以华纳兄弟公司电影<黑客帝国>为背景,由拉娜 · ...

  9. 深大计算机图形学大作业之虚拟场景建模

    目录 前言 要求 场景概览 机器人层级模型 为立方体部件贴纹理 关键帧动画 关键帧动画循环 体素建模 场景布局 添加光影特效 延迟渲染管线 立方体贴图 环境映射 Phong光照 阴影映射 体积光 de ...

最新文章

  1. [APB VNext 笔记] UI
  2. 【Python】Jupyter Notebook这款「骚气满满」的小工具,简直太爱了!
  3. Codeforces Round #587 C. White Sheet(思维+计算几何)
  4. Hibernate关于父类子类的映射
  5. SAP产品增强技术回顾
  6. java 毕向东 内部类_java基础内部类(毕向东老师)
  7. Elastic全球用户大会Elastic{ON}首次落地北京
  8. Linux 6安装kde桌面,CentOS 5/6 安装 GNOME 或 KDE 桌面
  9. 【JAVA 第三章 流程控制语句】课后习题 随机整数最大值和最小值
  10. ASP静态HTML(局部)生成类
  11. 一封写给2009年自己的信
  12. 编码:unicode、utf-8以及emoji
  13. 比较万能的匹配邮箱的正则表达式
  14. 客户流失预测——相关论文学习笔记
  15. python实现非常有趣的数学问题
  16. 关于“击败”团队目标的思考
  17. collectionView的每一组的组头部和尾部的设置
  18. NVIDIA GPU常用命令及设置汇总
  19. PAAS容器安全防护
  20. vue 实现第三方QQ登录

热门文章

  1. 【Unity Shader】Unity中阴影映射标准制作流程
  2. 计算机毕业设计Java小区生活服务平台的设计与实现(源码+系统+mysql数据库+Lw文档)
  3. shell脚本--存储清理空文件夹
  4. WIN10 系统日志_1016错误--权限设置并未向在应用程序容器 不可用 SID
  5. anaconda 安装 PuLP
  6. windows服务器搭建原神私服教程(附客户端+服务端+环境配置)
  7. _torn_ado框架
  8. echarts实训1:用echatrs实现人口普查
  9. JavaScript 中级(三)
  10. MOF (Meta Object Facility) 规范