【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. uniapp多次触发跳转问题

    问题描述:快速点击跳转页面后会闪退到登陆页面 解决方案:重新封装uniapp跳转api,加防抖锁,To.ts import { NavigateToOptions, RedirectToOptions ...

  2. 探索使用 ViewContainerRef 的 Angular DOM 操控技术

    探索使用 ViewContainerRef 的 Angular DOM 操控技术 https://indepth.dev/posts/1052/exploring-angular-dom-manipu ...

  3. springboot 多数据源(aop方式)

    一.实现思路 在yml中定义多个数据源的配置,然后创建一个类DynamicDataSource去继承AbstractRoutingDataSource类 AbstractRoutingDataSour ...

  4. Mac netstat 查看端口报错 netstat: option requires an argument -- p 解决

    netstat -anvp |grep 10001 查询端口的时候报错提示 意思是缺少协议. 解决方案在Mac上正确使用的方法是:即-f需要加上地址族,-p需要加上协议TCP或者UDP等 a)如果需要 ...

  5. rocketMq4.2.0启动broker报错找不到或无法加载主类 Files\Java\jdk1.8.0_101\lib\dt.jar;C:\Program]

    假如弹出提示框提示'错误: 找不到或无法加载主类 xxxxxx'.打开runbroker.cmd,然后将'%CLASSPATH%'加上英文双引号.保存并重新执行start语句.做如下图处理 但是输出还 ...

  6. Exception:统一异常处理

    异常包括:全局异常.特定异常和自定义异常. 第一步,创建一个异常处理类,并在类上添加 @ControllerAdvice 注解 第二步,在类中添加出现异常时要执行的方法,并在方法上添加对应注解,指定出 ...

  7. 《HelloGitHub》第 105 期

    兴趣是最好的老师,HelloGitHub 让你对编程感兴趣! 简介 HelloGitHub 分享 GitHub 上有趣.入门级的开源项目. github.com/521xueweihan/HelloG ...

  8. Qt编写可视化大屏电子看板系统15-曲线面积图

    一.前言 曲线面积图其实就是在曲线图上增加了颜色填充,单纯的曲线可能就只有线条以及数据点,面积图则需要从坐标轴的左下角和右下角联合曲线形成完整的封闭区域路径,然后对这个路径进行颜色填充,为了更美观的效 ...

  9. Datawhale 2025冬令营第二弹!!😊自己微调模型!

    Datawhale AI冬令营(第一期) 垂类大模型构建 定制垂类大模型 = 优质数据集 + 开源大模型 整理者:博客园-岁月月宝贝!!! 姓名:HeYang 特别鸣谢Datawhale!!!:htt ...

  10. 一篇复杂的研究🤔A Comprehensive Study of 😨Jailbreak Attack versus Defense for Large Language Models

    本认为,这篇文章的亮点在于对攻击和防御技术的多维评估,另外通过比较不同模型(如Vicuna.LLama和GPT-3.5 Turbo)对攻击和防御策略的反应,文章提供了对模型间差异的深入理解. 对现有的 ...