SIKI_UNITY_灯光与渲染

UNITY_灯光与渲染

课程大纲: 

Custom Skybox

Lights; Color Space

Global Illumination -- realtime/ baked

Light probes

Emissive lighting

Reflection probes

PostProcessing后处理技术

优化

Custom Skybox: 天空盒

有不同种类的天空盒

6 Slided/ Cubemap/ Panoramic/ Procedural;这里着重介绍Cubemap和6 Slided

Cubemap -- 一个立方体小盒子,小盒子的内壁着色

将此图片导入unity,TextureShape设为Cube

创建材质Material,shader选择Skybox/Cubemap,往Cubemap拖入刚才的skybox贴图

在Window->Rendering->LightingSettings->Scene中设置SkyboxMaterial即可

参数说明:

Tint Color:色片:更改天空盒的整体颜色
Exposure:曝光
Rotation:(理解为)旋转偏移量

6 Slided -- 6张贴图分别对应6个方位

环境光的影响

在有天空盒的场景中放入游戏物体(白色),会发现游戏物体的颜色被天空盒影响了。
这是因为游戏物体默认的shader为Standard,其中有受环境光颜色影响的代码

如何修改环境光呢?
  Window->Rendering->LightSettings->Scene中有一个Environment Lighting的选项,其Source现有设置为Skybox
    即表示环境光来源于天空盒
  还可选Gradient渐变/ Color固定颜色,即可手动调整环境光的颜色

天空盒的反射

对于Standard shader的游戏物体而言,有些属性是收到天空盒反射影响的

https://blog.csdn.net/chenggong2dm/article/details/77986194

Albedo--漫反射系数:用来控制表面的基色。一般会给它分配纹理贴图,或是修改颜色

Metallic -- 金属光泽 -- 调整物体材质为非金属化还是金属化。金属化程度大时,会更加偏向显示环境而不是显示albedo(=1时模拟金属)

金属值从0到1(平滑度相同均为0.8时)

Smoothness -- 平滑度 -- 光滑的表面,所有的光线倾向于以可预测和一致的角度反弹。
  取而代之的是,一个完美光滑的表面反射光,像面镜子。
  较不光滑的表面,在更宽的角度范围内反射光(因为光照在微表面的凸起),因此反射具有较少的细节,并且以更漫反射的方式,散布在表面上

将Metallic和Smoothness调到最大,表示非常光滑的金属,呈现出一种全反射的状态,会完全将天空盒反射显示

这里会发现在物体上看到的反射的画面比较模糊,因为与天空盒反射有关,来到Light Settings面板(见上一节的配图)

Environment Reflections属性

Source可设置为Skybox或Custom
  选择Skybox即为当前天空盒,选择Custom后需要选择一个天空盒材质球,即选择该材质球作为天空盒反射源

Resolution即为反射时的分辨率,当前为128,比较模糊,可以调高变清晰

Light 灯光:

Directional Light 平行光

Mode 光照模式:可选RealTime(实时)和Baked(烘焙) 

Realtime 实时渲染https://docs.unity3d.com/Manual/LightMode-Realtime.html
  每帧进行一次实时光照计算
  设置为realtime lights的光照仅对场景内的directlighting做贡献;
  若是使用内置渲染管线并开启Realtime Global Illumination (deprecated),则同样也能贡献于间接光 indirect lighting
优点:可在运行时动态调整光照参数并实时获得修改后的效果,比如移动时的火炬光照
限制:当场景内受该光照影响的游戏物体很多很复杂时会对性能有较大消耗
  默认仅有效于场景内direct lighting光照,阴影为纯黑,没有任何间接光效果,会导致不真实的光照效果

Baked 烘焙https://docs.unity3d.com/Manual/LightMode-Baked.html
  在编辑器模式下进行烘焙,该物体在光影影响下的状态烘焙到一张贴图上,会存储该光影结果到硬盘中。
  在运行时会将该baked lighting data并应用到该物体上(静态)
  会同时烘焙direct lighting和indirect lighting
优点:没有在运行时进行复杂的光照计算,因此节省了shading和阴影渲染的消耗
使用情形:在运行时无改变的物体,比如场景
缺点:在运行时无法调整参数
  无法contribute to specular lighting
  动态的游戏物体无法接受baked lights的光照和阴影

Mixed Lighthttps://docs.unity3d.com/Manual/LightMode-Mixed.html
  结合了realtime和baked
  运行时改变属性,将会更新realtime lighting部分的效果,但是不会影响之前baked的部分
  具体性能消耗取决于所选择的Lighting Mode。
  但是因为MixedLights结合了一部分realtime和一部分baked,所以baked多了实时光照计算、比realtime多了内存消耗
使用情形:可将realtime的动态阴影效果和baked的光照效果结合
  或者将realtime的direct lighting和baked的indirect lighting结合

Shadow Type:阴影类型

可选Soft Shadows / Hard Shadows / No Shadows

Soft Shadows:比较好看,主要在阴影边缘比较顺滑,但是性能消耗更大

Hard Shadows:阴影边缘有明显锯齿,但是性能消耗小

No Shadows:完全无阴影

Strangth:阴影的强弱

Resolution:阴影分辨率,调的越低阴影越糊;可选Use Quality Settings由系统设置决定

Bias/ Normal Bias/ Near Plane:偏移量,一般不调,当阴影位置出现偏差时通过这个调整

Cookie:赋值一个部分透明的贴图,光照将会根据该贴图有对应图案效果,如舞厅中的灯光
  CookieSize:图案尺寸

Flare:耀斑,比如表现为看向灯光时出现镜头光晕的效果

比如:

 

Culling Mask:该光照对哪一些层有效或无效

Area Light 区域光

单面照亮,baked only;

适用场景:发光板

只有被标记为静态(Lightmap Static)的游戏物体才会受到baked烘焙光照的影响

注意:如果在烘焙过程中弹出光照贴图和Mesh不符合的警告
  原因:光照贴图其实就是一张贴图,它是将模型对应的光照信息贴到模型上,以表示光影,代替实际灯光表现
    这个光照信息是根据Lightmap UVs来对应贴到模型上的
  解决方案:找到模型网格所对应的Import Settings - Model,勾选上Generate Lightmap UVs
    勾选之后,在生成光照贴图时,会自动同时生成对应的LightmapUVs

Color Space 色彩空间

可选 Linear / Gamma

Linear和Gamma的区别:Linear比Gamma亮的更亮,暗的更暗;现在一般都会选择Linear空间,效果更加自然

使用Gamma空间的原因:有一些比较老式的移动平台并不支持Linear空间,只能选用Gamma。

Shadow 阴影

可能造成没有阴影显示的缘由:

1. 灯光是否选择了No Shadow

2. Edit -> Project Settings -> Quality -> Shadows: 
  可选 Disable Shadows/ Hard Shadows only/ Hard and Soft Shadows

Shadow Resolution:可选几档阴影的分辨率

Shadow Projection:

3. 产生阴影的模型的MeshRenderer(控制渲染相关):Cast Shadows是否为On

4. 投射到的阴影的模型的MeshRenderer:Receive Shadows 是否接收别的游戏物体将阴影投射上来
  可选On/ Off/ Two Sided/ Shadows Only

5. 物体的shader相关。比如某个shader是透明的,比如Transparent,则就没有阴影了

Global Illumination 全局光照

扯一点其他的:

在Statistics统计面板中有一个参数 Shadow casters: 需要绘制阴影的数量,该数值很高时很费性能,因为需要进行实时计算

所以在Shadow casters高的时候,可以通过烘焙光照进行优化,运行时不进行计算

全局光照:用来模拟光的互动和反弹等复杂行为的算法。
  由直接光照direct light和间接光照(漫反射)indirect light组成

分为Realtime Global Illumination和Baked Global Illumination,
  未勾选Baked Global Illumination时,场景中被设置为baked或mixed的灯光都会被重写为realtime模式,
  直到Baked Global Illumination开启才生效

勾选Baked Global Illumination后,Mixed和baked光照有效。

对于realtime灯光而言,对所有(无论是否设置为 lighting static)物体都将进行实时光照计算

对于Mixed light而言,direct light实时计算,indirect light将被烘焙至lightmaps和light probes
  (siki解释:对于场景内的静态对象而言,Baked GI会将光照烘焙并生成光照贴图;
    对于非静态对象而言,混合模式的灯光仍会继续运算实时光源)

Unity会将这两个全局光照选项同时开启,但这么做会大大增加资源消耗,因此一般只开启其中一个。
  比如在手机端,受到硬件限制,我们就开启Baked GI;而在PC端,可开启realtime GI或两者都开来获得更佳的显示效果

在Mixed Lighting中有一个Lighting Mode的选项;(注意是mixed光照,realtime、baked光照不影响)
  可选Subtractive/ Shadowmask(默认)/ Baked Indirect

Subtractive: 最低配、开销最小的混合光照模式,阴影效果也是最差的
  Mixed lights provide baked direct and indirect lighting for static objects.
  Dynamic objects receive realtime direct lighting and cast shadows on static objects using the main directional light in the scene -- 仅支持一个主光源,若有另外的光源照射,也只会出现主光源照射的阴影

当前设置下,动态物体仅受一盏主光源的照射产生阴影,不受其他混合光照产生阴影
  例子:动态物体A受到主光源(无所谓什么模式)和点光源照射:
    点光源为realtime,无所谓是否勾选BakedGl:两个阴影
    点光源为mixed,未勾选BakedGI:两个阴影
    点光源为mixed,勾选BakedGI:一个阴影

Shadowmask:其实是两种模式:Shadowmask 和 Shadowmask distance
  Mixed Lights provide realtime direct lighting.
  Indirect lighting gets baked into lightmaps and light probes.
  Shadowmasks and light probes occulusion get generated for baked shadows.

Shadowmask模式下,动态物体可同时受到烘焙阴影与实时阴影

例子:Subtractive中的案例,点光源为mixed,勾选BakedGI,选择subtractive时为一个阴影,改为shadowmask后变为两个阴影

但是还有个问题,举一个例子,有一个静态墙和一个动态物体,当动态物体移动到被墙挡住的空间内,会发现动态物体不受静态墙的阴影的影响(动态物体没有因为静态墙的阴影而变暗)
  :这是因为静态墙的阴影是烘焙出来的,当然不会实时计算了

Distance Shadowmask:当镜头离物体某个距离之内时,会实时计算所有阴影,超出这个距离后会使用烘焙贴图
  上例的问题可以使用distance shadowmask解决

在Edit -> Project Settings -> Quality Settings中 -> Shadow -> Shadowmask Mode 可选
  Shadowmask 或 Distance Shadowmask

会发现选择distance shadowmask后,statistics面板上shadow casters的数量增大很多,因为这些阴影为实时计算的

√ 如何优化减少shadow casters呢?可以调节shadow caster的Shadow Distance属性
  表示当物体与摄像机距离在ShadowDistance预设值范围内时,阴影会进行实时计算;
  当超出范围时,阴影会使用之前烘焙好的贴图进行展示(动态物体的阴影也会消失)

√ 还可以动态进行开关,比如当动态物体到达某一区域内时,动态修改shadowmask mode属性

Baked Indirect:最高配的光照模式,最耗性能的模式,阴影效果也最好
  Mixed Lights provide realtime direct lighting while indirect lighting gets baked into lightmaps

只有间接光照会被烘焙到光照贴图上,所有直接光照都是实时计算的

同样Distance Shadowmask选项也是有效的(该选项对阴影有效,并不是仅对Shadowmask有效)
  将视角拉到shadow distance之外会发现,不论静态物体还是动态物体的阴影都消失了

烘焙光照 Lightmap settings

Directional Mode 可选 Directional和Non-Directional
  选择Directional时可见BakedLightmaps里面有BakedDirectionality烘焙贴图
  选择Non-Directional时BakedLightmaps里面是没有BakedDirectionality的

BakedDirectionality贴图的作用是记录光照方向信息
  比如有的shader中有NormalMap法线贴图,法线贴图的计算是根据主光源的位置计算灯光方向来决定显示细节
  而贴图的RGB正好可以存储三维向量信息

LightMapper:Global Illumination的解决方案
  可选Enlighten(不推荐)、Progressive CPU 和 Progressive GPU(Preview)
  Enlighten/ProgressiveCPU都是通过CPU来进行烘焙的,和GPU的性能就无关了

Lightmap Resolution:光照贴图的分辨率

Indirect Resolution:间接光照的烘焙贴图分辨率

Lightmap Padding:光照贴图中uv信息的间距。场景中游戏物体uv的间距过小而该设置值过大时,会导致将别的错误的光照贴图贴到游戏物体上。如果烘焙后发现一些地方的烘焙很奇怪像是贴错的时候,可以更改该数值进行尝试。一般2是合理的

 

 

 

 

 

 

 

 

 

原文地址:https://www.cnblogs.com/FudgeBear/p/13276869.html