公司安排用Unity的HDRP做一个相对高质量的场景。选择还原公司附近的一个小公园。由于之前没有太多经验。决定参考Unity官方的枫丹白露场景作为技术参考对象。

整个Demo是Unity巴黎工作室制作的,使用照片建模技术还原工作室附近的枫丹白露森林。

Demo地址

unity夜间效果 unity夜晚场景_HDRP

Demo整体分析

整个演示场景包括演示相关的场景如下:

Demo.unity:基础功能场景

Demo_GR.unity:地形场景

Demo_LI_Day.unity:白天光照场景

Demo_LI_Night.unity:夜晚光照场景

Demo_LI_Sunset.unity:夕阳光照场景

Demo_SD_Day.unity:白天声音场景

Demo_SD_Night.unity:夜晚声音场景

Demo_SD_Sunset.unity:夕阳声音场景

Photogrammety_Kit.unity:资产验证场景

Demo中自带一个很方便的查看场景窗口:Discover Fontainebleau

unity夜间效果 unity夜晚场景_HDRP_02


通过这个窗口可以很方便的打开4种模式

  • Open Fontainebleau:同时开启Demo,Demo_GR,Demo_LI_Day,Demo_SD_Day场景,运行后就是一个完整的演示端。
  • Open Day:同时开始Demo_GR,Demo_LI_Day。
  • Open Night:同时开启Demo_GR,Demo_LI_Night。
  • Open Sunset:同时开启Demo_GR,Demo_LI_Sunset。
  • Open Photoprammerty_Kit:开启资产验证场景

这个窗口关了后,也可以通过Help->Discover Fontainebleau再次打开

以下分析主要针对Open Day模式进行分析

渲染细节分析

烘焙光照图

Demo_LI_Day:采用的Baked Indirect,相关参数调的比较小。
Demo_GR:猜测使用的是Baked Indirect,但是这个场景的光照图数据和Demo_LI_Sunset公用一个光照文件。具体如何生成的没有深入分析。
通过Demo_GR中的LightmapData物体上有Level Lightmap Data组件,在演示模式下支持动态切光照图。

光照探针

近地光照探侦组

unity夜间效果 unity夜晚场景_unity_03


半空光照探针组

unity夜间效果 unity夜晚场景_高保真_04


场景光照探针采用两级光照探针组,近地光照探针组,半空光照探针组。

Demo_LI_GR场景中的LightProbes和LightProbes_low分别对应近地光照探针组和天空光照探针组。

演示场景提供了一个自动布置光照探针的工具,包含在PackageManager中的Light Probes Volumes。

这个工具提供一个组件:LightProbesVolumeSettings。这个组件需要BoxCollider和LightProbeGroup组件,设置好后点Create Light Probes in Selected Volume,就可以自动生成光照探针。

 

反射探针

unity夜间效果 unity夜晚场景_unity夜间效果_05


反射探针被包含在Demo场景中。Lighting->ReflectionProbes的子物体都是光照探针。不同的反射探针会有不同的影响范围,猜测会通过碰撞盒来动态切换反射探针。具体影响范围没有分析。

后处理

后处理被分拆到不同的场景中
Demo_GR中包含的Shadows和Fog的后效,Volume挂在PlanarRefectionRenderingSettings物体上。这个主要用来解决水洼反射效果的穿帮问题。
Demo_LI_Day中有两类后效:
POSTPROCESSING->Day物体上的Volume组件,包含White Balance,Exposure,Lift-Gamma-Gain,Color Adjustments四种后效。
SkyAndFogSettings物体上的Volume组件,包含VisualEnvironment,HDRI Sky,Fog,Physically Based Sky组件

阴影

地上云的影子:在Demo_LI_Day场景的Lights->Directional light组件上添加Cookie Cloud Animation组件来形成云层飘过形成的地面阴影效果。
物体阴影:Demo_GR场景中一些高大的树和石头都会直接产生阴影,但是地面的一些灌木就不会产生阴影。地上云的影子是通过Light上添加Cookies
补充阴影:Demo_LI_Day场景中,通过使用ShadowCasters->Realtime_shadowCasters下的子物体产生了额外的阴影效果。猜测应该是只有物体阴影比较单薄,然后又添加了一些假阴影来增强整个环境的阴影氛围。可以观察到添加这些阴影片后,树冠的叶子被人为的压暗了。

场景特效

Demo_LI_Day场景中有烟尘和落叶效果,包含着VFX Root节点下。

地形

unity夜间效果 unity夜晚场景_高保真_06

unity夜间效果 unity夜晚场景_Blend_07

地形使用了8张纹理,没有使用SpeedTree和实例草

镜头耀斑效果

unity夜间效果 unity夜晚场景_unity夜间效果_08

Demo_LI_Day场景中包含两个物体Lights->Directional light是真正产生光照的灯光组件,看向太阳是的光斑效果是通过Sun->LensFlare上的HDRP Lens Flare组件来实现的。Sun物体上有Same Rotation As组件,这个组件保证光斑物体和方向光的朝向能保持一致。

水洼效果

unity夜间效果 unity夜晚场景_unity_09

通过Decal实现了简单的水洼反射效果,具体可以看Demo_GR场景中的DECALS下的子物体。同时还利用了一个后效来改善Decal的穿帮效果。

通过Demo_LI_Day场景中的Wind_Default物体上的Basic Wind Data,HDRP Global Settings里面的Basic Wind以及树和灌木上的定制Shader,实现了后处理的树木被风吹动的效果。

unity夜间效果 unity夜晚场景_unity夜间效果_10

场景中远景

unity夜间效果 unity夜晚场景_HDRP_11

Demo_GR场景中使用了三个环形模型来营造了场景中的中远景的森林效果。具体都放到Background物体下面。

环境物体设置

整个演示的环境物体都在Demo_GR中的Props物体下面。下面简单分析下不同物体在设置上的区别

  • Tree_03_01

    场景中的大树,物体上包含LOD Group,LOD Group Override,Light Probe Proxy Volume三个组件。实现了树的LOD效果和光照探针代理效果。
    包含以下8个子物体

物体

作用

是否产生阴影

是否贡献GI

光照探针

着色器

静态标记

额外组件

Branches02

树冠枝杈



Blend Probes

Branches_Wind,采用Pine(Diffusion Profile Settings)



Thorn02

松针



使用父物体的光照代理

Branches_Wind,采用Pine(Diffusion Profile Settings)



Trunk02_LOD0

树冠的L0D0级



使用父物体的光照代理

Trunk_Wind

只开启Contribute GI

Polybrush Mesh

Trunk02_LOD1~4

树冠的L0D1~4级



使用父物体的光照代理

Trunk_Wind



Collider

树的碰撞器

  • Rock_06_Prefab

    场景中的石头,物体上包含LOD Group组件。实现了石头的LOD效果
    包含6个子物体,都是LOD的子级

物体

作用

是否产生阴影

是否贡献GI

光照探针

着色器

静态标记

额外组件

Rock06_LOD0

石头的L0D0级


贡献,接受Lightmaps的GI


LayeredLit

全部开启

Polybrush Mesh

Rock06_LOD1~5

石头的L0D1~4级




LayeredLit

开启 Batching,Navigation,Occludee,Off Mesh Link Generation,Reflection Probe

Lightmapped LOD

  • Pine_01

大树旁伴生的小松树,无子物体

物体

作用

是否产生阴影

是否贡献GI

光照探针

着色器

静态标记

额外组件

Pine_01

小松树


贡献,接受LightProbes的GI

Blend Probes

Branches_Wind

关闭Batching标记,其他全部开启

  • Pine_Cone_Prefab

    松果,物体上有LOD Group,Rigibody,On Awake Event Rigibody Action4个额外的组件,提供LOD和碰撞触发事件的功能。
    包含5个子物体,都是LOD的子级

物体

作用

是否产生阴影

是否贡献GI

光照探针

着色器

静态标记

额外组件

Pine_Cone_LOD0

松果的LOD0级



Blend Probes

Lit

只开启Occludee

Capsule Collider

Pine_Cone_LOD1

松果的LOD1级



Blend Probes

Lit

只开启Occludee

Pine_Cone_LOD2~4

松果的LOD2~4级



Blend Probes

Lit,去掉了Mask和法线贴图

只开启Occludee

  • Vegetation_1

    覆盖地面的草丛,包含LOD Group组件。
    包含3个子物体,都是LOD的子级

物体

作用

是否产生阴影

是否贡献GI

光照探针

着色器

静态标记

额外组件

Vegetation_01_LOD0

草的LOD0级



Blend Probes

Branches_Wind,采用Leaves(Diffusion Profile Settings)

开启Batching,Navigation, Occludee, Off Mesh Link Generation ,Reflection Probe

Vegetation_01_LOD1~2

草的LOD1~2级



Blend Probes

Branches_Wind,采用Leaves(Diffusion Profile Settings)

开启Batching, Occludee

  • Bush_01_04_Prefab

    地面的草丛,包含LOD Group组件。
    包含2个子物体,都是LOD的子级

物体

作用

是否产生阴影

是否贡献GI

光照探针

着色器

静态标记

额外组件

Bush_01_04_LOD0

草的LOD0级



Blend Probes

Branches_Wind,采用Leaves(Diffusion Profile Settings)

开启Reflection Probe

Bush_01_04_LOD1

草的LOD1级



Blend Probes

Branches_Wind,采用Leaves(Diffusion Profile Settings)

开启Reflection Probe

  • Bush_03_Prefab

    地面的草丛,包含LOD Group组件。
    包含2个子物体,都是LOD的子级

物体

作用

是否产生阴影

是否贡献GI

光照探针

着色器

静态标记

额外组件

Bush_01_04_LOD0

草的LOD0级



Blend Probes

两个材质球,Branches_Wind,采用Pine(Diffusion Profile Settings) 另一个着色器是Trunk_Wind


Bush_01_04_LOD1

草的LOD1级



Blend Probes

两个材质球,Branches_Wind,采用Pine(Diffusion Profile Settings) 另一个着色器是Trunk_Wind