说好的放弃呢,还是搞了几天搞了一个大概。为啥会继续这部分呢?思考哈:灯光-->灯光渲染-->灯光优化-->Draw Call & FPS & Shadow casters & Batches & Verts --> 游戏优化;按照这条路线思考下来;Unity的优化也是一个值得学习和研究的地方。所以还是打算把Unity(基于Unity 2018.2.5f1)的GI(Global Illumination)部分学习一个大概,不求特别了解,但是得掌握个7788哈。GI = 直接光照+间接光照+环境光+反射光。按照惯例来一个~~
“官方吐槽”
Lighting概述:照明窗口(菜单: Window > Lighting > Settings)是Unity Global Illumination(GI)功能的主要控制面板。虽然Unity中的GI在默认设置下效果很好,但是光照窗口的属性允许你调整GI进程的很多方面来定制你的场景或者根据你的需要优化质量、速度和存储空间。
照明窗口的控件分为三个选项卡:
- Scene:设置适用于整个场景,而不是单个的游戏对象。这些设置控制灯光效果和优化选项。
- Global Maps:显示GI lighting过程生成的所有lightmap资产文件。
- Object Maps:显示了当前选中游戏对象的GI lightmap纹理(包括阴影遮罩)预览。
注意:在窗口显示最下面有一个Auto Generate(自动渲染)的框,如果勾选,Unity将在编辑场景时更新lightmap数据。如果您想在不清除GI缓存的情况下清除场景中烤好的数据,请使用Generate Lighting按钮。
“Scene区域”
“Environment”
Environment1.Skybox Material:天空盒材质;Skybox是一种材质,在场景中出现在一切事物背后的用来模拟天空或遥远天边的背景。
2.Sun Source:太阳源;在使用Skybox的过程中,使用一个带有directional Light组件的Gameobject来指定“太阳”的方向(或在场景中大型而远距离的光源)。如果设置为None(默认值),则假定场景中最亮的directional light代表太阳。
3.Environment Lighting(这些设置会影响来自远处环境的光线,可以理解为漫反射)
- Source:漫射环境光(也称为环境光)是存在于场景周围的光并且不来自于特定的光源(也就是说没有特定的发光源)。使用这个参数定义漫反射光颜色,默认是Skybox(也就是反射Skybox的颜色)。
Color:为场景中的所有环境光使用平面颜色。
Gradient:渐变;为来自天空、地平线和地面的环境光选择单独的颜色,并在它们之间平滑地混合。
Skybox :此选项使用skybox的颜色(如果skybox材质指定的话)来确定来自不同角度的环境光。 - Intensity Multiplier:增强强度;设置场景中漫反射环境光的亮度,定义为0到8之间的值。默认值是1。
- Ambient Mode:设置应用于场景中环境光的全局照明模式。只有当现场的实时照明和烘烤照明都启用时,这个属性才可用。
Realtime:实时计算和更新场景中的环境光。
Baked:预先计算和设置场景中的环境光,然后在运行。
4.Environment Reflections(环境反射:这些设置控制涉及到反射探针烘烤的全局设置,以及影响全局反射的设置。)
- Source :指定使用skybox或cube map(立方体映射)进行反射效果。默认值是Skybox。
Skybox:选择此选项以使用skybox进行反射。如果选择Skybox,则会出现一个名为Resolution的附加选项。设置skybox的分辨率以进行反射。
Custom:选择cube map来进行反射。选择此选项可使用多维数据集映射进行反射。如果选择Custom,则会出现一个名为Cube map的附加选项。设置skybox的cube map以进行反射。 - Compression:用这个定义反射纹理是否被压缩。默认设置是Auto。
Auto:如果压缩格式合适,则对反射纹理进行压缩。
Uncompressed:反射纹理存储在未压缩的内存中。
Compressed:纹理压缩。 - Intensity Multiplier:反射源(在反射源属性中指定的天空盒或立方体图)在反射物中可见的程度。
- Bounces:当一个对象的反射被另一个对象反射时,反射“反弹”发生。反射是通过反射探头在场景中捕捉到的。使用此属性设置反射探测在对象之间来回反射的次数。如果设置为1,那么Unity只考虑初始反射(来自反射源属性中指定的skybox或多维数据集映射)。
“Realtime Lighting”
Realtime Lighting1.Realtime Global Illumination:实时渲染模式;一旦勾选,Unity会实时计算和更新光照。
“Mixed Lighting”
Mixed Lighting1.Baked Global Illumination:烘焙渲染模式;一旦勾选,Unity会预先计算灯光,在运行时烘焙场景中的灯光。
2.Lighting Mode:灯光模式决定了在场景中混合灯光和阴影与游戏对象的工作方式。
注意:当你改变灯光模式时,你也需要重新烘焙场景。
3.Realtime Shadow Color:定义用于实时渲染阴影的颜色。设置仅在灯光模式设置为Subtractive时可用。
“Lightmapping Settings”
Lightmapping SettingsLightmapping设置特定于Lightmapper后端。与其他设置不同,它们不共享,并且有自己的参数。
1.Lightmapper:烘焙灯光的解决方案(烘焙主要依赖CPU)。
2.Indirect Resolution:间接光烘焙精度;
3.Lightmap Resolution:烘焙的精度;烘焙多少像素点到灯光贴图上。
4.Lightmap padding:UV间距(当烘焙后感觉光照效果不对,可以对此进行调节来确保烘焙的结果更加真实)
5.Lightmap Size:光照贴图的大小
6.Compress Lightmaps:是否压缩光照贴图
7.Ambient Occlusion:环境光遮蔽
- Max Distance:设置值的大小来确定阴影的范围
- Indirect Contribution:
- Direct Contribution:
8.Final Gather:最终聚集的信息(为了模拟一些物体的颜色反射到其他物体上,使得场景更加真实,细节更加细腻)(比较消耗性能)
勾选后两个相应的参数:
- Ray Count:数值越大场景越细腻。
9.Directional Mode:灯光方向贴图;如果不选择,Global Maps这不会产生相关贴图
如图上的几个贴图分别是:
- Intensity:存储灯光颜色信息(RGBA)
- Directionality:灯光方向贴图信息
一个灯光颜色贴图不足以渲染显示场景中各个物体应该显示的情况(凹凸情况等);还需要方向信息,但是将全部的信息放入到一个贴图,实在是太大了;所以选择使用两张贴图存放不同的信息。 -
Shadowmask:当选择Distance Shadowmask模式时,会产生这样一张贴图;主要记录相关阴影信息。
Shadowmask
10.Indirect Intensity:间接光的强度
11.Albedo Boost:提高反射率(防止曝光过高)
“Other Settings”
Other Settings关于fog, Halos,Flares和Cookies的设置
1.Fog:雾;启用或禁用场景中的雾。注意Deferred rendering path下Fog不可用。对于延迟渲染,后期处理雾效应效果可能比较合适。
当勾选了Fog,则会出现三个参数:
- Color:给场景中的雾 选择颜色。
- Mode:定义雾化密度随相机距离的不同变化方式。
- Linear:雾密度随距离线性增加。
-- Start:设置距离相机的距离,在那里雾开始。
-- End:设置与摄像机的距离,使雾 完全遮蔽场景游戏对象。
Exponential:雾密度随距离成指数增长
-- Density:用这个来控制雾的密度。随着密度的增加,雾 显得更浓。
Exponential Squared:雾密度随距离(指数和平方)增加得更快。
-- Density:用这个来控制雾的密度。随着密度的增加,雾 显得更浓。
2.Halo Texture:光晕纹理;设置你想要使用的纹理来围绕灯光绘制光圈。
3.Halo Strength:光晕强度;定义灯光周围光环的可见性,范围从0到1。
4.Flare Fade Speed:“耀斑退却速度;定义镜头闪光的时间(以秒为单位),在最初出现后从视图中淡出。默认设置为3”。
5.Flare Strength:耀斑强度;从0到1的值定义从灯光发出的透镜闪光的可见性。
6.Spot Cookie:设置你想用于聚光灯的Cookie texture。
“Debug settings”
帮助你调试场景的设置
1.Light Probe Visualization:可视化光探针;使用这个过滤器来过滤场景视图中显示的光线探头。默认值仅供选择使用。
选项如下:
- Only Probes Used By Selection:选择只使用探测;只有影响当前选择的光探针才能在场景视图中显示出来。
All Probes No Cells:所有的光探测都在场景视图中显示出来。
All Probes With Cells:在场景视图中显示所有的光探针,并显示用于插值光探针数据的四面体。
None:在场景视图中不显示光探测。 - Display Weights:显示重量;当勾选时,Unity从用于主动选择的光探针到用于插值的四面体上的位置画一条线。这是一种调试探测插值和位置问题的方法。
- Display Occlusion :当被勾选时,如果混合模式是距离阴影遮罩或阴影遮罩,Unity会显示光探测的遮挡数据。
“Global maps tab区域”
使用Global maps选项卡查看照明系统使用的实际纹理。这些包括强度光地图,阴影遮罩和方向性地图。这只适用于烘焙照明或混合照明使用;预览是空白的实时照明。
Global maps tab
“Object maps tab区域”
使用Object maps选项卡查看当前选中的* *GameObject的烘焙纹理预览,包括阴影遮罩。
Object maps tab
属性大概就是这些,可能中间有些错误(到时候发现再改);痛苦并快乐的过程~~~~~~
“个人吐槽”
针对GI的各方面的东东,做了一个Demo测试哈!!!有8个Scene,每个场景讲述不同的知识点。
1.Scene 01-Skybox
常用的两种创建Skybox的方式(后面两个不知道是啥,实在是没精力去看了):
- 使用6 Sided渲染方式,分别添加6张不同方向的Texture。
- 使用Cubemap渲染方式,仅仅只需要一张cubemap的Texture。
注意:skybox的切换实际上就更换skybox的材质(Lighting-Skybox Material);在前面的Environment中看到过。
Skybox Material
注意:GameObject的Material上的两个属性与Skybox的反射联系
Material - Metallic:金属性,当调节到1时,gameobject表面具有金属感。
-
Smoothness:光滑度,当调节到1时,gameobject表面比较光滑。
这里为什么突然说到关于material的两个属性呢?因为当Lighting Setting设置好以后,如果相关gameobject的这两个属性设置为1,则该gameobject就会反射周围的场景。
效果图
2.Scene 02-Light Split
场景中的灯光分解;对于新建场景的光照效果并不是某一种灯光造成的,实际上是由多个光照效果互相影响形成的。
仔细看AB两块区域的光照效果;按理说,都是接受了Directional Light,为啥显示的效果不同呢?
依次去掉这三个参数,将其设置为None或者Other;就会发现场景中AB区域慢慢变成一样的了。
效果图
说明:场景中的灯光实际上由上面标记的三个参数以及场景中的Directional Light组合造成的灯光效果。
GI = 直接光照+间接光照+环境光+反射光
3.Scene 03-Light Type
主要讲解下灯光的几种基本的类型(这个在2.Light里面有记录介绍)
Directional Light:平行光,类似于太阳光(光照强度不会随着距离衰弱)
Spot:点光源(区域直射)
Point:点光源
Area:区域光
除开平行光的其他三种光源在场景中的渲染
关于在PlayerSettings下面光照渲染的两种模式Gamma和 Linear
PlayerSettings
一般情况下都选择Linear,因为其渲染比Gamma好(前提:显卡支持;)。Area Light只对勾选Static的GameObject起作用;
注意:在烘焙过程中报错或烘焙完以后明显感觉到灯光有差异;查看相关模型的Generate Lightmap UVs 属性,对其进行勾选。(这样才能保证Unity将烘焙后的贴图信息正确的贴到相关模型上面)。
Unity官方关于二者的对比(Linear相比Gamma还是渲染的更加贴近于现实。)
对比
知识点说明:当一个灯光照射一个游戏模型时,没有产生阴影,可以从几方面入手查看
-
灯光是否支持阴影:
-
Quality设置下阴影是否开启
-
模型是否执行阴影
- 材质问题:有些shader具有透明效果,不会产生阴影
4.Scene 04-Light Mixed
两个光照技术:实时光照&烘焙光照
上面两个效果一般只会开启一个,节约性能。
烘焙光照:为了节省性能开销提前将场景的灯光信息烘焙成一张贴图,在运行时只需要将贴图贴到场景中static物体上即可。
全局光照:直接光照+间接光照(一次以上的照射,两次以上的反射)
混合模式光照下的三种模式
Subtractive模式:将静态物体烘焙成贴图,相关光照贴图信息存储在Global maps里面(可以查看);场景中动态gameobject只能受到一个主光源的影响。(如果有其他Realtime光源,动态gameobject并不会产生实时阴影)该模式效率高,但是效果相当差,并且没有高光效果。
如图:添加的Point光源并没有使得右边的Cube产生新的阴影
效果图
Shadowmask模式:相比如Subtractive模式,可以存储多种光源,可以让动态gameobject接受多个光源,产生多个影子。
场景例子:如果在烘焙好的场景中,某一个物体A需要从一个静态gameobject B的影子下面通过,正常情况下,A的表面光照效果应该会受到B的影子的影响变黑,但是在Shadowmask模式下却不变;一般处理的方式有两种:
- 灯光探照灯技术
- 选择Shadowmask的另外一个模式
在Quality中切换当前Shadowmask的另外一个模式:
Distance Shadowmask(相比Shadowmask更加消耗性能,效率更低)
Quality
Shadow distance:表示距离摄像机40的范围内(场景中),灯光将是实时渲染的;超出这个范围,将使用烘焙好的贴图效果。
在这种模式下,可以实现上述案例效果。
对比切换模式前后 Shadow casters的值可以看到:当切换Distance Shadowmask模式,动态A闯过静态B的影子时相当于进行了实时灯光渲染。
效果图
一般情况会做一个触发检测,在一定范围内选择Distance Shadowmask模式,出这个范围切换到Shadowmask模式:
Code
Baked Indirect模式
只烘焙间接光,其他都是实时渲染;更加真实,也更加消耗性能。
Scene 05-Light Probe Group
灯光探针是将周围的灯光信息记录下来后,在运行时实时的将信息渲染到周围的物体上。
Light Probe Group:灯光探针组
创建Light Probe Group会看到在Scene中有8个小球;每个小球就是一个灯光探针;实时监测小球所在点的灯光颜色信息。
可以对小球进行复制 ,在一个场景中设置多个小球,进行丰富的灯光阴影设置。
效果图
Scene 06-Reflection Probe
Reflection Probe:反射探针
可以理解为将一定范围的static物体反射到gameobject上
如下图:当Gameobject的属性Reflection Probes设置为Off时则不受反射探针的影响。
效果图
Scene 07-Light Material Self
自发光材质是将材质的Emission属性勾选,然后调节光照颜色和强度,赋予给相关的gameobject即可。
效果图
Scene 08-Post-Processing Profile
Post Processing Stack 屏幕后期处理
主要介绍一些属性:
- Fog:雾
- Antialiasing:抗锯齿;为了消除远处物体具有锯齿边的情况对其进行模糊效果。
- Ambient Occlusion:环境光遮蔽;(这里是实时的;在lightmapping里面是烘焙好的)
- Screen Space Reflection:屏幕的空间反射;需要反射材质,会实时反射场景中的一些东西。
- Depth Of Field:景深(类似于相机调焦)
- Motion Blur:运动模糊效果
- Eye Adaptation:眼部适应
- Bloom:游戏环境高光的地方会更加亮,产生泛光的效果(理解为增强版本光晕效果)。
- Color Grading:颜色修正(校准);游戏环境整体颜色改变。
- User Lut:(Look Up Texture)使用贴图
- Chromatic Aberration:色差变换;一般配合Vignette使用
- Grain:噪点
- Vignette:镜头光晕效果
这个场景主要是介绍Post-Processing插件的一些效果;以前这是Unity的一个特效包;每一个特效一个脚本,现在内嵌到Unity里面去了,这个后处理对于游戏的画风比较重要。
这里还记录两个东西:
1.Camera下的几种渲染路径
Legacy Vertex Lit:顶点光照;模型细节无法渲染出来;不支持实时阴影。效率高,效果差,适合旧机器。
Forward:正向渲染,支持像素级别的渲染;只支持一个平行光的实时阴影;游戏物体受到的灯光渲染越多,渲染速度越慢。支持MSAA(抗锯齿)
Deferred:延迟渲染;效果最好;同时支持多个灯光的实时阴影。
2.批处理Batches
Draw Call是绘制图形的命令;由CPU传给GPU;
针对游戏的优化实际上是优化Draw Call的次数(减少其次数);
而Batches就是对Draw Call的一种优化方式
从上面批处理的概念引申出关于游戏优化的几个基本参数
4个重要的参数:
FPS:游戏帧率(游戏运行稳定在60以上)
Batches:批处理
Verts:Camera能够渲染到的顶点数(数量越少越好,这个值是实时渲染得到的)
Shadow casters:实时渲染的阴影数(数量越少越好,这个值是实时渲染得到的)
网友评论