【Unity】光照解决方案笔记
【Unity】光照解决方案笔记
https://docs.unity.cn/cn/2022.3/Manual/BestPracticeLightingPipelines.html
确定对象显示效果的三阶段
剔除
列出了需要渲染的对象,确保这些对象摄像机可见(视锥体剔除)且不被遮挡(遮挡剔除)。
渲染
将这些对象绘制到基于像素的缓冲区中(通过正确的光照以及它们的一些属性)。
后期处理
在这些缓冲区上执行后期处理操作,生成发送到显示设备的最终输出帧。
光照类型
- 直接光照
从自发光光源(如灯泡)发出的光照,而不是光从表面反射的结果。
- 间接光照
由于光从表面反射并通过介质(如大气或半透明物质)传播和散射而形成的结果。
- 局部光照:
只考虑简单的直接光照构成的视觉效果。
- 全局光照:
考虑各种复杂的光照因素构造的结果,包括间接光照。
全局光照(GI)
全局光照 (Global Illumination) 是一组特殊照明技术的总称,它考虑了综合且复杂的现实光照模型(如光的反射、折射等),并以此对直接和间接光照进行建模,从而为游戏提供逼真的光照效果。
从使用角度来看可以将 GI 简单理解为产生间接光的手段。单纯的兰伯特光照之类的经验光照模型技术并不是 GI。
GI 提供几种方法,如:
- 烘焙/动态光照贴图(Unity 支持)
- 烘焙/动态光照探针(Unity 支持)
- 辐照度体积
- 光传播体积
- 基于体素的 GI 和基于距离场的 GI
光照贴图程序(Lightmapper)
这是一个基础系统,它通过发射光线、计算光线反弹并将产生的光线应用到纹理来生成光照贴图和光照探针的数据。
如何点亮你的项目?
https://docs.unity.cn/cn/2022.3/uploads/Main/BestPracticeLightingPipeline15.svg
选择渲染管线
- Built-in RP
- URP
- HDRP
- 自定义 SRP
决定 GI 模式(产生间接光的 GI 系统)
- 烘焙 GI
- 实时 GI
- 烘焙 & 实时 GI
选择光照模式(GI 光与实时光的混合方式)
- Baked Indirect
- Subtractive
- Shadowmask
- Distance Shadowmask
添加场景光照
- 添加灯光
- 添加发光表面
- 添加反射探针
- 添加光照探针
- 添加光照探针代理体(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 将陆续弃用。
实时 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】光照解决方案笔记的更多相关文章
- 台北Unity开发者研讨会 笔记
本文转自:http://ndark.wordpress.com/2013/05/12/20130511-台北unity开发者研讨会-笔记/ (墙外) 说明 本文单纯只是笔记,若有笔误敬请见谅. 相关参 ...
- Unity光照图UV显示
美术的同学觉得 Unity 光照图烘焙的不够美丽,需要在 ps 里修一修,但是不知道每个物体对应的光照图在哪个区域,UV 是如何分布的,于是要求写一个工具显示,于是有了下面这个: 打开场景自动读取当前 ...
- Unity光照与渲染设置学习笔记
学习了一下unity中有关光照和渲染的一些设置,现在才明白之前遇到的一些问题只是没有正确设置而已. unity不同版本的光照设置会有一些差异,而且可以调节的参数非常多,这里只记录一些重要的参数和使用方 ...
- 【Unity Shader学习笔记】Unity光照基础-高光反射
1.原理 1.1.Phong模型 计算高光反射需要表面法线.视角方向.光源方向.反射方向等. 在这四个矢量中,我们实际上只需要知道其中3个矢量即可,而第4个矢量(反射方向r)可以通过其他信息计算得到: ...
- 【Unity Shader学习笔记】Unity光照基础-半兰伯特光照
在光照无法达到的区域,模型的外观通常是全黑的,没有任何明暗变化,这会使模型的背光区域看起来就像一个平面. 使用半兰伯特光照可以解决这个问题. 逐顶点光照技术也被称为兰伯特光照模型.因为它符合兰伯特定律 ...
- 【Unity Shader学习笔记】Unity光照基础-漫反射光照
本代码只适用于平行光. 1.逐顶点漫反射光照 1.1漫反射光照原理 1.2代码实现 在Properties语义块中声明一个漫反射颜色属性 Properties { //漫反射参数,用于调整漫反射效果 ...
- unity 实时间接光照 解决方案
https://www.youtube.com/watch?v=D7LjsabD4V4 这个很强 他runtime bake lightprobe 之后走assetbundle加载 Place Pro ...
- Unity Shader学习笔记-1
本篇文章是对Unity Shader入门精要的学习笔记,插图大部分来自冯乐乐女神的github 如果有什么说的不正确的请批评指正 目录 渲染流水线 流程图 Shader作用 屏幕映射 三角形遍历 两大 ...
- Unity光照
广义地说,Unity有2种光源.1.动态光源 2.Backed Lighting 1.动态光源 就是实时计算的.只要摆光源就可以了 2.Backed Lighting 提前处理好光照贴图.贴在物体上 ...
- 【Unity Shader学习笔记】Unity基础纹理-法线贴图
1 高度纹理 使用一张纹理改变物体表面法线,为模型提供更多细节. 有两种主要方法: 1.高度映射:使用一张高度纹理(height map)来模拟表面位移(displacement).得到一个修改后的法 ...
随机推荐
- 【相邻不同型贪心】LeetCode767 重构字符串
题解 通常直接思考最佳策略是十分困难的,我们不妨思考每一种情况需要如何处理: 整个字符串只有一种字符 若字符串长度为 \(1\),那么字符串本身即为答案: 若字符串长度大于等于 \(2\),那么不存在 ...
- liquibase maven
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://mave ...
- Thrift中enum的一些探究
http://anruence.com/2018/06/27/enum-thrift/ 问题 在用注解定义的Thrift enum 中,如果客户端端和服务端的enum定义不同,比如调换了enum中的枚 ...
- Qt编写地图综合应用20-多浏览器内核
一.前言 本人写Qt程序这么多年,比较喜欢支持多个Qt版本,尤其是钟情于支持任意Qt版本+任意系统+任意编译器,这句话说起来简单其实实现起来就不容易了,首先你得有个很多版本的测试环境,起码十几个Qt环 ...
- 深度解析Mamba与状态空间模型:一图带你轻松入门
1.概述 Transformer架构无疑是大型语言模型(LLMs)成功背后的核心动力.从开源的Mistral到封闭的ChatGPT,几乎所有主流的LLM都在使用这一架构.然而,随着技术的不断进步,研究 ...
- Linux开机LOGO更换以及附带问题
应用层更换Linux机器开机启动LOGO 平台开机Logo默认是编译进内核的,更换起来很不方便,通过改写内核源码,可以实现应用层直接更换内核Logo. 1.uboot相关修改 网上教程一般会这么改 & ...
- 我的c语言笔记
1. 进制转换 二进制.八进制和十六进制向十进制转换都非常容易,就是"按权相加".如:1010.1101 = 1×23 + 0×22 + 1×21 + 0×20 + 1×2-1 + ...
- 双指针习题:Binary Deque
14.Binary Deque 题面翻译 Binary Deque - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 有多组数据. 每组数据给出 \(n\) 个数,每个数为 \(0\) ...
- Hadoop 概述(三)
HDFS shell API HDFS作为大数据的文件系统,可以放置数据文件,列举几个常用的shell脚本命令,用法和linux中的基本类似,不过这个是hadoop里的一套,所以我们要用hadoop ...
- Dicom C-move 请求QR服务
个人理解 Dicom C-get 就是在没有设置任何验证情况下请求QR服务,而C-move是有验证的情况下请求QR服务.一般都是C-move,因为机器都需要验证. Dicom C-move 原理:自己 ...