最近仔细研究了Unity3D中的灯光以及渲染,有了全新的认识,在这里整理记录下来。博主所使用的是Unity3D 2017.3.1f1这个版本。
一、Unity3D中的灯光
-
Directional Light:平行光,用来模拟太阳发射的光。
-
Point Light:点光源,用于模拟场景中的灯和其他本地光源。
-
Spot Light:聚光灯,通常用于人造光源,如手电筒,汽车前灯和探照灯。
-
Area Light:区域光,只能用于烘焙中。
-
Reflection Group:反射探针,用于准确反射周围环境。
-
Light Probe Group:灯光探针组,用于记录场景中光照信息,实时影响物体。
-
Environment Lighting:环境光。场景的整体外观和亮度的主要依靠于环境光,环境光是从各个方面来影响对象的。
-
Emissive Materials:自发光材质,类似于区域光,只能使用在静态物体中,并且只能照明静态物。
二、Unity3D中虚拟环境的组成
Unity3D中虚拟环境由天空盒、环境光、环境反射以及场景中的光源共同构成。我们按照下面的步骤,可以将场景还原到最原始的状态:
1、关闭场景中的所有灯光。
2、进入Window->Lighting->Setting->Scene窗口。
3、设置Environment->Skybox Material参数为None,取消天空盒。
4、设置Environment->Environment Lighting->Ambient Color为黑色,将环境光设置为黑色。这里需要注意的是,当我们将天空盒取消后,环境光的来源将会变为颜色,如果我们设置了天空盒,并将环境光的来源设置为天空盒(Environment -> Environment Lighting -> Source -> Skybox),Ambient Color参数将会变为Intensity Multiplier(环境光强度),如果我们将强度调为0,会发现场景明显变暗。
5、设置Environment->Environment Reflections->Intensity Multiplier为0,将环境反射强度设置为0。环境反射也受来源的影响,当天空盒为空时,反射来源也为空,这时我们调这个参数其实是看不到效果的。如果我们设置一个天空盒,将环境光关闭,打开场景中的光源,我们在调节这个参数,会发现场景中的模型,接受不到光照的地方将会显示纯黑色。
按照上面的步骤做完,我们将会得到一个纯黑的场景,什么也看不到,如果我们反向操作,场景又会慢慢亮起来,这也就证明了Unity3D中虚拟环境由天空盒、环境光、环境反射以及场景中的光源共同构成这一结论。
三、Unity3D中打光与渲染必备知识
1、Unity3D中的光分为直接光照和间接光照,间接光照就是反射光。
2、Unity3D中光的渲染模式有三种:
① Realtime:实时渲染。每帧都会计算光照,实时光照是不会反射的,所以它的光影显得单调。
② Mixed:混合渲染。提供烘焙和实时功能的混合模式,例如对灯光的间接照明进行烘焙,同时对直接照明进行实时计算。
③ Baked:烘焙渲染。过烘培光照贴图的方式获得很好的光照效果,无法实时的改变光照。
3、Unity3D中的阴影类型:
① No Shadows:没有阴影。无性能损耗。
② Hard Shadows:硬阴影。阴影边缘清晰,效果一般,性能损耗一般。
③ Soft Shadow:软阴影。阴影边缘柔和,有过渡效果,效果最好,性能损耗最严重。
4、Unity3D中分全局设置和局部设置。例如我们对场景中某一盏灯光的参数进行修改,只会影响这一盏灯,如果对全局参数进行修改,将会影响所有的灯光效果。
5、Unity3D中的物体分为动态物体和静态物体。烘焙技术、自发光材质、预先全局光照技术等只对静态物体生效。
四、效果优化常用全局参数介绍
1、颜色空间(Color Space)
参数设置位置:Edit -> Project Setting -> Player -> Player Settings -> Other Settings -> Rendering -> Color Space
两种模式:Gamma和Linear。Linear效果更好,同时也对性能消耗比较大。下面是两种模式在不同光照强度下效果对比图:
2、最终聚集(Final Gather)
参数设置位置:Window -> Lighting -> Setting -> Scene -> Lightmapping Settings -> Final Gather
作用:一种模拟全局照明的计算技术。反向搜集物体表面特定点的受光照强度来模拟现实照明效果,来使场景更贴近于自然。由于该计算技术计算量很大,建议在场景最后出效果时勾选,并进行烘焙,平时不要开启。
五、没有阴影的原因
1、光源没有开阴影。
2、全局设置中关闭了阴影。(Edit -> Project Setting -> Quality -> QualitySettings -> Shadows -> Shadows)
3、模型。Mesh Renderer组件中的Cast Shadows属性为关。
4、Shader问题,Shader本身不接受阴影。
六、灯光常用参数介绍
Type:灯光类型
Color:灯光颜色
Mode:渲染模式
Realtime:实时
Mixed:混合
Baked:烘焙
Intensity:灯光强度
Indirect Multiplier:间接照明强度
Shadow Type:阴影类型。No Shadows(无阴影)、Hard Shadows(硬阴影)、Soft Shadows(软阴影)
Baked Shadow Angle:这个设置用来改变间接光的亮度。间接光是指从一个物体反射到另一个物体的光线。Indirect Multiplier定义了GI系统计算的反射光亮度。Indirect Multiplier小于1时,光线每次反射后会变暗。大于1时光线每次反射后会变 亮。 这个功能可以用来调亮阴影中的表面(比如洞穴内部)以清晰地观察细节。或者在使用Realtime Global Illumination时,想让某个real-time光源只有直接光时,可以将Indirect Multiplier设置为0。
Realtime Shadows:实时阴影
Strength:阴影浓度,即阴影的黑暗程度。
Resolution:阴影分辨率,即质量。
Bias:通过滚动条控制阴影被推离光线的距离,范围为0到2,默认值为0.5。用来避免人工物体自阴影的错误。
Normal Bias:通过滚动条控制投射阴影的表面相对于周围正常表面的下沉效果,范围为0到3,默认值为0.4。用来避免人工物体自阴影的错误。
Near Plane:通过滚动条控制渲染阴影时的最近裁切面。范围为0.1到10,默认值时0.2。这个值会从0.1 units和光线的Range的1%中取最小值。
Cookie:为投射的阴影指定一个纹理(替换真实的灰色阴影)。比如制造剪影,或者照明图案。
Cookie Size:阴影纹理尺寸
Draw Halo:绘制光晕
Flare:光斑
Render Mode:渲染优先级。这会影响光照的保真度和渲染性能。
Auto:渲染方式在运行时根据周围光照的亮度和当前Quality Settings来决定。
Important:光照总是按照逐像素的质量渲染。一般只对最醒目的视觉效果使用Important模式,比如玩家车辆的车灯。
Not Important:光照总是以更快的顶点/角色光照模式渲染。
Culling Mask:光照剔除
各种灯光的参数都大致一致,我这里就不一一介绍了,就以平行光为例介绍。
七、Lighting窗口参数介绍
Unity3D 中渲染效果肯定是离不开 Lighting 窗口的参数设置的。Lighting 窗口的参数看着很多,其实只要理解了,也没多少。而且Realtime、Mixed、Baked这三种渲染模式是分别与 Lighting 窗口中的 Realtime Lighting、Mixed Lighting、Lightmapping Settings 三大块一一对应的,只要理解了这个,整个 Lighting 窗口的参数就好理解很多了。
1、Environment(环境设置)
Skybox Material:天空盒
Sun Source:当使用程序天空盒时,使用它来指定带有方向光的游戏对象,如果设置为none,场景中最亮的方向光则被指定为太阳光。
Environment Lighting:环境光
Source:来源
Skybox:天空盒
Gradient:梯度
Color:颜色
Intensity Multipl:环境光强度
Ambient Mode:环境渲染模式
Realtime:实时渲染
Baked:烘焙
Environment Reflections:环境反射
Source:来源
Resolution:反射成像的分辨率
Compression:压缩
Intensity Multipl:反射强度
Bounces:弹跳;反射
2、Realtime Lighting(实时灯光)
Realtime Global Illumination:实时全局光照
3、Mixed Lighting(混合灯光)
Baked Global Illumination:烘焙全局光照
Lighting Mode:只在光源模式为 Mixed 时生效。
Baked Indirect:只烘焙间接光。使用此模式,光影效果最好,并且静态物体和动态物体的光影可以混合,但是很消耗性能。该模式受Shadow Distance(QualitySettings -> Shadows -> Shadowmask Mode ->Shadow Distance)参数的影响,当视野距离超过这个值时,不显示影 子。
Shadowmask:效果比Subtractive效果要好,缺点就是动态物体无法接受静态物体已经烘焙好的阴影。如果我们想动态物体能够和烘焙好的光影 信息进行混合,我们可以将模式改为Distance Shadowmask,这样就可以实现在一定视野范围内进行混合,但是相对来说会损耗性能。Distance Shadowmask模式受Shadow Distance(QualitySettings -> Shadows -> Shadowmask Mode ->Shadow Distance)参数的影响,这个距离 指的是视野距离,即物体距离相机的距离。Distance Shadowmask模式是在质量设置里面进行设置的(QualitySettings -> Shadows -> Shadowmask Mode -> Distance Shadowmask)。
Subtractive:效果最差,性能最好。只允许有一个主光源,当动态物体,被两个光源照射时,只会产生一个阴影,静态物体依然会有两个阴影。
4.Lightmapping Settings
Lightmapper:光线映射器。
Indirect Resolution:间接光质量。
Lightmap Resolution:光照贴图质量。
Lightmap Padding:光照贴图间距。防止光照信息贴错位置。
Lightmap Size:光照贴图尺寸。
Compress Lightmaps:是否压缩。
Ambient Occlusion:环境剔除。可以优化墙角等地方光影效果。环境光遮蔽是一种光照模型,它会计算像素亮度与场景中附近物体之间的关 系。它将确定何时阻止特定像素接收附近的几何光的环境光,这样使其亮度便会降低。当两个均匀明亮的物体相互靠近时,它会产生基本的 变光效果。
MaxDistance:设置一个值控制射线的射程,以确定对象是否被遮挡。
Indirect Contribution:控制间接光在lightmap的强度。
DirectContribution:控制直接光在lightmap的强度。
Final Gather:最终聚焦。
RayCount:每个最终聚焦的点发出的射线的数目。默认是256。
Denoising:是否在最后的聚焦输出应用去噪过滤。
Directional Mode:是否生成光照方向贴图来辅助计算。
IndirectIntensity:间接光强度。
Albedo Boost:反照率增强。可以用来处理曝光现象。将模型材质的Albedo贴图颜色调暗,将反照率加大。
Lightmap Parameters:光照贴图参数。质量设置。