【Unity】光照解决方案笔记

https://docs.unity.cn/cn/2022.3/Manual/BestPracticeLightingPipelines.html

确定对象显示效果的三阶段

  1. 剔除

    列出了需要渲染的对象,确保这些对象摄像机可见(视锥体剔除)且不被遮挡(遮挡剔除)。

  2. 渲染

    将这些对象绘制到基于像素的缓冲区中(通过正确的光照以及它们的一些属性)。

  3. 后期处理

    在这些缓冲区上执行后期处理操作,生成发送到显示设备的最终输出帧。

光照类型

  • 直接光照

从自发光光源(如灯泡)发出的光照,而不是光从表面反射的结果。

  • 间接光照

由于光从表面反射并通过介质(如大气或半透明物质)传播和散射而形成的结果。

  • 局部光照:

只考虑简单的直接光照构成的视觉效果。

  • 全局光照:

考虑各种复杂的光照因素构造的结果,包括间接光照。

全局光照(GI)

全局光照 (Global Illumination) 是一组特殊照明技术的总称,它考虑了综合且复杂的现实光照模型(如光的反射、折射等),并以此对直接和间接光照进行建模,从而为游戏提供逼真的光照效果

从使用角度来看可以将 GI 简单理解为产生间接光的手段。单纯的兰伯特光照之类的经验光照模型技术并不是 GI。

GI 提供几种方法,如:

  • 烘焙/动态光照贴图(Unity 支持)
  • 烘焙/动态光照探针(Unity 支持)
  • 辐照度体积
  • 光传播体积
  • 基于体素的 GI 和基于距离场的 GI

光照贴图程序(Lightmapper)

这是一个基础系统,它通过发射光线、计算光线反弹并将产生的光线应用到纹理来生成光照贴图和光照探针的数据。

如何点亮你的项目?

https://docs.unity.cn/cn/2022.3/uploads/Main/BestPracticeLightingPipeline15.svg

  1. 选择渲染管线

    • Built-in RP
    • URP
    • HDRP
    • 自定义 SRP
  2. 决定 GI 模式(产生间接光的 GI 系统)

    • 烘焙 GI
    • 实时 GI
    • 烘焙 & 实时 GI
  3. 选择光照模式(GI 光与实时光的混合方式)

    • Baked Indirect
    • Subtractive
    • Shadowmask
    • Distance Shadowmask
  4. 添加场景光照

    • 添加灯光
    • 添加发光表面
    • 添加反射探针
    • 添加光照探针
    • 添加光照探针代理体(LPPVs)

渲染管线

内置渲染管线(Built-in RP)

2018 年之前,Unity 只有一个内置渲染管线(Built-in RP),其提供两种渲染路径。

  • 向前渲染(多通道:每一盏灯光占用一个 Pass)
  • 延迟渲染

高清渲染管线 (HDRP)

提供了先进的渲染和着色功能,为高端游戏平台设计。

  • 混合延迟/前向瓦片/聚类渲染器

通用渲染管线(URP)

内置管线替代品,保持全平台通用且性能提升。

  • 向前渲染(单通道:一个 Pass 中渲染所有灯光)
  • 向前渲染+:Unity 2022.2 新增
  • 延迟渲染:Unity 2021.2 新增

渲染路径

向前渲染路径

按顺序渲染场景中的所有对象和灯光。

当对象被多个光源照亮时,渲染成本会急剧增加。

这种类型的渲染器通常提供各种各样的着色器,并且可以很轻松地处理透明度。

延迟渲染路径

先将所有不透明几何体渲染到缓冲区中,其中存储着有关材质的信息(颜色,镜面反射,光滑度等)。然后在后一个 Pass(也就是名字中的“延迟”)渲染所有像素的灯光信息。

渲染时间将主要取决于影响每个像素的光源数量。但对于透明对象或更复杂的着色器对象,依然需要回退到向前渲染路径中渲染。

当处理包含许多动态光源的场景时(例如具有人工光照的内部空间,或室外与室内光照相结合的项目),通常建议使用延迟渲染。

Unity 中的 GI 系统

在 Unity 的 5.6 之前,Unity 主要使用 Geomerics 公司的 Enlighten 来提供实时 GI 以及烘焙 GI,但在 5.6 之后 Unity 引入了新的 Progressive Lightmapper,如今 Enlighten 将陆续弃用。

Unity GI 发展计划

  • 实时 GI

    • Enlighten 实时 GI(已弃用,仅支持到 Unity 2024)
  • 烘焙 GI

    利用光照贴图程序将光照数据烘焙到光照探针、反射探针、称为光照贴图的纹理中

    • Enlighten 烘焙 GI(已弃用,仅支持到 Unity 2021)
    • 渐进式光照贴图程序(Progressive Lightmapper)

不要同时使用 Enlighten 实时 GI 和烘焙 GI,这将对性能产生影响,且两者获取到的间接光也存在视觉差异。

如何让物体获取间接光

  • 静态物体

    标记为“Contribute GI”的物体将被识别为静态物体,只有静态物体可以接受烘焙/预计算的 GI 光照。

  • 动态物体

    动态物体只能通过光照探针获得间接光的支持。

由于光照的烘焙是一个相当缓慢的过程,所以只推荐自身具有不同光照变化(如存在凹洞或接受自身阴影)的大型复杂物体才推荐标记“Contribute GI”;对于自身受光均匀的小型凸面网格应该作为动态物体从光照探针中获取间接光。

  • 大型不可烘焙物体(如大型粒子系统或蒙皮网格)

    可以使用 LPPV(Light Probe Proxy Volume)来获取更好的本地化间接光照。

要最大程度减少烘焙时间并同时保持足够的光照质量,最重要的就是限制场景中标记为“Contribute GI”的对象数量。

照明优化教程:

https://learn.unity.com/project/lighting-optimization-with-precomputed-realtime-gi

光照模式

Light 组件和 Lighting Settings Asset 中都有一个光照模式的设置,但两者是不同的概念。

灯光光照模式

  • 烘焙

    为 GI 提供光照信息,从这些光源产生的直接和间接光照将被光照贴图程序处理。
  • 实时

    实时计算的光照效果,受性能影响无法产生间接光,且光照没有 GI 的效果真实。
  • 混合

    提供实时光照的同时也为烘焙光照(GI)提供烘焙信息,并能将两种光照进行混合,混合方式取决于场景光照模式。

场景光照模式

指定场景中实时光照和烘焙光照(GI)的混合方式,配合灯光的混合模式使用。

前置说明

  • 阴影贴图:实时阴影实现方案
  • 阴影距离:显示阴影的最大范围。若非注明,则所有阴影都受此影响

具体方案

  • Subtractive

    最早的混合光照模式。将大部分光照和阴影都采取烘焙实现,仅提供主方向光的实时灯光。

    光照效果比较简陋,但在低端硬件上非常有用。

    接收光照 静态物体 动态物体
    直接光照 光照贴图 实时
    间接光照 光照贴图 光照探针
    静态物体阴影 光照贴图 光照探针
    动态物体阴影 阴影贴图(仅主方向光) 阴影贴图(仅主方向光)
    • 主方向光:强度最高的方向光
  • BakedIndirect

    仅烘焙间接光,直接光和阴影都采用实时计算。

    光照效果逼真,但有一定的性能问题。

    接收光照 静态物体 动态物体
    直接光照 实时 实时
    间接光照 光照贴图 光照探针
    静态物体阴影 阴影贴图 阴影贴图
    动态物体阴影 阴影贴图 阴影贴图
  • Shadowmask

    升级版 BakedIndirect,针对静态物体阴影进行了优化,可同时采取烘焙和实时两种方案,且可以超出阴影距离限制。

    光照效果更逼真,且在性能上有一定优化。

    接收光照 静态物体 动态物体
    直接光照 实时 实时
    间接光照 光照贴图 光照探针
    静态物体阴影 阴影贴图 | 阴影遮罩 阴影贴图 | 光照探针
    动态物体阴影 阴影贴图 阴影贴图
    • 阴影遮罩:一种额外的光照贴图,用于确定目标像素是否在阴影中。

    针对静态物体阴影方案有两种模式:

    • DistanceShadowmask:阴影距离内采用阴影贴图实现,超出则采用烘焙实现。
    • Shadowmask:全距离的都采用烘焙实现。

后处理间接光

GI 烘焙间接光的时间很长不利于快速原型开发,此时可以利用“屏幕空间环境光遮蔽”功能来模拟间接光效果。

【Unity】光照解决方案笔记的更多相关文章

  1. 台北Unity开发者研讨会 笔记

    本文转自:http://ndark.wordpress.com/2013/05/12/20130511-台北unity开发者研讨会-笔记/ (墙外) 说明 本文单纯只是笔记,若有笔误敬请见谅. 相关参 ...

  2. Unity光照图UV显示

    美术的同学觉得 Unity 光照图烘焙的不够美丽,需要在 ps 里修一修,但是不知道每个物体对应的光照图在哪个区域,UV 是如何分布的,于是要求写一个工具显示,于是有了下面这个: 打开场景自动读取当前 ...

  3. Unity光照与渲染设置学习笔记

    学习了一下unity中有关光照和渲染的一些设置,现在才明白之前遇到的一些问题只是没有正确设置而已. unity不同版本的光照设置会有一些差异,而且可以调节的参数非常多,这里只记录一些重要的参数和使用方 ...

  4. 【Unity Shader学习笔记】Unity光照基础-高光反射

    1.原理 1.1.Phong模型 计算高光反射需要表面法线.视角方向.光源方向.反射方向等. 在这四个矢量中,我们实际上只需要知道其中3个矢量即可,而第4个矢量(反射方向r)可以通过其他信息计算得到: ...

  5. 【Unity Shader学习笔记】Unity光照基础-半兰伯特光照

    在光照无法达到的区域,模型的外观通常是全黑的,没有任何明暗变化,这会使模型的背光区域看起来就像一个平面. 使用半兰伯特光照可以解决这个问题. 逐顶点光照技术也被称为兰伯特光照模型.因为它符合兰伯特定律 ...

  6. 【Unity Shader学习笔记】Unity光照基础-漫反射光照

    本代码只适用于平行光. 1.逐顶点漫反射光照 1.1漫反射光照原理 1.2代码实现 在Properties语义块中声明一个漫反射颜色属性 Properties { //漫反射参数,用于调整漫反射效果 ...

  7. unity 实时间接光照 解决方案

    https://www.youtube.com/watch?v=D7LjsabD4V4 这个很强 他runtime bake lightprobe 之后走assetbundle加载 Place Pro ...

  8. Unity Shader学习笔记-1

    本篇文章是对Unity Shader入门精要的学习笔记,插图大部分来自冯乐乐女神的github 如果有什么说的不正确的请批评指正 目录 渲染流水线 流程图 Shader作用 屏幕映射 三角形遍历 两大 ...

  9. Unity光照

    广义地说,Unity有2种光源.1.动态光源  2.Backed Lighting 1.动态光源 就是实时计算的.只要摆光源就可以了 2.Backed Lighting 提前处理好光照贴图.贴在物体上 ...

  10. 【Unity Shader学习笔记】Unity基础纹理-法线贴图

    1 高度纹理 使用一张纹理改变物体表面法线,为模型提供更多细节. 有两种主要方法: 1.高度映射:使用一张高度纹理(height map)来模拟表面位移(displacement).得到一个修改后的法 ...

随机推荐

  1. vscode代码注释插件koroFileHeader配置(自用)

    前言 一直以来写注释都是让人头疼的问题,力求保持注释风格统一也很麻烦,偶然间发现的这款vscode中的注释插件koroFileHeader,配置好后可以大大提高写注释的效率与积极性♪(∇*) 安装插件 ...

  2. kubeadm安装 k8s集群证书过期更新

    kubeadm安装 k8s集群证书过期更新 kubeadm版本 v1.18.8 #查看证书 #mast节点,查看所有证书 kubeadm alpha certs check-expiration #若 ...

  3. JVM 语言的探索发现

    又在 WIKI 上溜达了一下 https://en.wikipedia.org/wiki/List_of_JVM_languages,有一些新的发现: ColdFusion Markup Langua ...

  4. 解决WSL2无法启动提示“找不到元素”

    最近一段时间没有看 docker desktop,忽然想起来打开看看,结果死活启动不了.以前卸载之后,重新安装就好了,同样的方法尝试了很多次还是不太行,重启也不行... 后来想想是不是 wsl 出了问 ...

  5. Postgresql使用触发器实现同步插入两张表

    在有一个陈旧的系统的情况下,如果升级API可以优先使用微服务的形式,将数据库进行独立拆分,将原来的数据库原原本本地固定在旧系统中,然后在独立的微服务中运行与部署新系统. 如果原有的数据需要在更换结构的 ...

  6. JavaWeb HttpSession

    /** * 使用session共享数据 */ public class SessionDemo1 extends HttpServlet { @Override protected void doPo ...

  7. java-信息安全(二十)国密算法 SM1,SM2,SM3,SM4

    一.概述 国密即国家密码局认定的国产密码算法.主要有SM1,SM2,SM3,SM4.密钥长度和分组长度均为128位.目前主要使用公开的SM2.SM3.SM4三类算法,分别是非对称算法.哈希算法和对称算 ...

  8. Qt开发经验小技巧251-255

    今天在一个头文件中,发现 #ifdef Q_OS_WIN #ifdef Q_CC_MSVC 之类的都失效了,搞得差点怀疑人生了.经历过之前类似的教训后,排查原来是没有提前引入 qglobal.h 头文 ...

  9. Qt5离线安装包无法下载问题解决办法

    1.前言 Qt5离线安装包目前在国内已经被墙了,无法下载,只能下载在线安装包: 直接访问会显示Download from your IP address is not allowed: 本文就提出两种 ...

  10. 微信小游戏直播在Android端的跨进程渲染推流实践

    本文由微信开发团队工程师"virwu"分享. 1.引言 近期,微信小游戏支持了视频号一键开播,将微信升级到最新版本,打开腾讯系小游戏(如跳一跳.欢乐斗地主等),在右上角菜单就可以看 ...