Unity笔记:光照系统

Unity基础光源类型(四核心+二特殊)

四种核心光源:

  • 点光源(随距离衰减)
  • 聚光源(随距离衰减)
  • 平行光(这个与位置无关,且不会减弱,一般模拟太阳光)
  • 区域光(类似于面光源,需要烘焙之后才能使用,不是实时光)

关于区域光:要把物体和光调成静态才能Bake。参数中Range是能照多远,不是发光面的大小

两种特殊光源(环境光):

  • 自发光(这个也要bake,且发光和受光物体得是static)
  • 天空盒

光源三要素

  • 光照强度
  • 光照方向
  • 光照颜色

Static物体的用途:在Unity中,将游戏对象设为静态(Static)可以带来一些性能优势。静态游戏对象在运行时不会移动,这意味着Unity可以在编辑器中预先计算有关这些对象的信息,并在运行时重复使用这些计算结果,从而提高性能。静态游戏对象的一些用途包括:

  1. 静态光照:静态游戏对象可以贡献到全局光照计算中,这有助于提高照明效果。
  2. 遮挡剔除:将游戏对象标记为静态可以帮助进行遮挡剔除,提高渲染性能。
  3. 批处理:静态游戏对象可以与其他符合条件的游戏对象合并,以降低运行时的渲染成本。
  4. 导航数据预计算:静态游戏对象可以包括在导航数据的预计算中,有助于提高游戏中的路径规划性能。

光源组件

光照系统的使用离不开光源组件

  • Intensity是光源强度
  • Indirect Multipler是间接光的乘数,值得注意的是如果大于1会导致反射后的光强增大,例如当阴影中的暗表面(例如洞穴内部)需要更亮才能使细节可见时会很有用。若不想要间接光(只发射直射光)就设置为0。

Rendering Mode

  • Opaque - 此项为默认设置,适用于没有透明区域的普通固体对象。
  • Cutout - 用于创建在不透明区域和透明区域之间具有硬边的透明效果。在这种模式下没有半透明区域,纹理为 100% 不透明或不可见(即镂空)。使用透明度来创建材质的形状时(如树叶或者有孔洞和碎布条的布料),非常有用。
  • Transparent - 适用于渲染逼真的透明材质,如透明塑料或玻璃。在此模式下,材质本身将采用透明度值(基于纹理的 Alpha 通道和色调颜色的 Alpha),但与真实透明材质的情况一样,反射和光照高光将保持完全清晰可见。
  • Fade - 允许透明度值完全淡出对象,包括对象可能具有的任何镜面高光或反射。如果要对淡入或淡出的对象进行动画化,此模式将非常有用。它不适合渲染逼真的透明材质,如透明塑料或玻璃,因为反射和高光也会淡出。

光源剪影

“蒙在光源上的一层薄纸”

先在Texture的Inspector中设置

  1. Texture type设置为Cookie
  2. Light type设置对应的剪影光源类型
  3. Alpha Source设置为From Gray Scale(如果剪影图是灰度图的话)

然后去光源的Light组件设置

  1. 把Cookie设为上面配置好的剪影贴图

阴影渲染

渲染流程

  1. 创建阴影贴图(根据光源位置确定深度信息)
  2. 物体坐标系转换(换到光源为中心的坐标系下)
  3. 深度纹理信息比较
  4. 绘制阴影

具体到Unity这里

  • 设置阴影相关开关:在Unity中,可以通过设置Light组件的渲染阴影属性来控制阴影的显示方式,包括不渲染阴影、硬阴影和软阴影等。
  • 物体投射阴影:物体的MeshRenderer组件开启了Cast Shadows后,Unity会将该物体加入到光源的阴影映射纹理的计算中。阴影映射纹理是一张深度图,记录了从光源位置能看到的顶点的位置和深度。
  • 屏幕空间的阴影映射纹理:Unity使用屏幕空间的阴影映射技术,即Screenspace Shadow Map。该技术的原理是生成相机的深度纹理和灯光的阴影映射纹理,然后对于场景中任意一点,以其深度纹理的x、y值和阴影映射纹理的z值作为该点的屏幕空间阴影映射纹理。
  • ShadowCaster Pass:正常的渲染流程会调用LightMode标签为ForwardBase和Additional的Pass,而深度映射纹理是一张深度图,不需要渲染顶点颜色,为节省性能,Unity设计了LightMode为ShadowCaster的Pass专门用于渲染阴影纹理。
  • 物体接收阴影:对于模型的任意顶点,使用该点对应的阴影灰度值乘以光照纹理,得到的就是该点最终要显示的纹理。

在Unity中,可以通过编写Shader来自定义阴影的渲染方式,包括设置阴影的类型、强度、分辨率等属性,以及编写Pass来实现阴影的投射和接收。整个流程涉及到光源、深度纹理、阴影映射纹理等概念,并需要对Shader编程有一定的了解。

阴影贴图是基于UV的,在渲染过程中,阴影贴图的值通常会与Albedo值进行乘法运算,以便在渲染时正确地应用阴影效果。

Screenspace Shadow Map

Screenspace Shadow Map的优点在于它可以减少对于传统阴影映射技术中需要渲染多个阴影级联的依赖,从而提高了渲染效率

Screenspace Shadow Map也有一些局限性,例如无法处理透明物体的阴影。

  1. 生成深度纹理:首先,Unity会生成一个深度纹理,记录了从相机视角看到的场景中物体的深度信息。
  2. 生成阴影映射纹理:接着,对于每个像素,Unity会计算其在光源视角下的深度,并将这些深度信息存储在阴影映射纹理中。
  3. 计算屏幕空间阴影:在渲染过程中,Unity会使用深度纹理和阴影映射纹理来计算屏幕空间阴影。对于每个像素,根据其深度值和光源的深度信息,确定该像素是否在阴影中。

其他

阴影距离:距离相机多近物体才会渲染实时阴影

阴影级联:阴影级联(Cascaded Shadow Mapping,CSM)是一种用于解决透视深度图阴影中透视失真问题的技术。它将视锥体分成多个级联,每个级联使用不同分辨率的阴影贴图,以便更好地适应不同距离的物体。这种技术可以提高远处物体的阴影质量,同时减少近处物体的阴影失真,从而提高整体的阴影效果。
阴影级联依旧是在Project Setting的Quality设置

Unity笔记:光照系统_第1张图片
上图是Unity手册里对于透视锯齿问题的示意图

拓展阅读

知乎 - 【Unity】深度图(Depth Texture)的简单介绍

探针

探针是组件,通常会被放置在静态的GameObject上,以便在烘焙光照时捕获场景中的光照数据

探针分类:

  • 光照探针
  • 反射探针

光照贴图存储的是有关光线照射到场景中的表面的光照信息,而光照探针存储的是有关光线穿过场景中的空白空间的信息。

光照探针是在烘焙期间测量(探测)光照的场景位置。在运行时,系统将使用距离动态游戏对象最近的探针的值来估算照射到这些对象的间接光。
注意特殊情况:

Baked主要处理静态对象的直接光和间接光
Realtime主要处理动态对象的直接光和间接光
Mixed处理静态对象和动态对象的直接光和间接光

使用探针要注意如下:

  1. 在场景中使用探针之前,需要进行光照烘焙(Lightmap Baking)
  2. 如果希望动态的GameObject能够实时接收探针捕获的光照信息,需要确保在渲染设置中启用了实时光照计算。
  3. 场景中有Light Probes Group组件(捕获光照信息),挂在谁上面无所谓,即使只有一个GameObject挂载了Light Probes Group组件,其他静态物体也会受到影响。但是一般挂在空物体上以免误删
  4. 不要在编辑Light Probes Group时把光照探针弄到物体里面(编辑模式下Ctrl+D复制光照探针)
  5. 动态物体要与Light Probes Group进行交互,需要将其设置为“重要光照探针”(Important)以确保其在光照计算中得到正确的处理。

反射探针:为了解决室内镜面仍反射室外的信息

一般用Bake而非Realtime,Bake模式需要把环境物体设为静态。反射探针不需要再Lighting里烘焙,在自己的Inspector里Bake就行

你可能感兴趣的:(Unity,unity,笔记)