ARCore之路-光估计之Unity3D光源类型

版权声明:David Wang原创ARCore文章,仅供学习研究之用,不得用于任何商业目的,未经授权不得转载! https://blog.csdn.net/yolon3000/article/details/83118971

  光照在3D数字世界中极其重要,当前,光照技术发展日新月异,研究光照的技术文献资料多于牛毛,PBR、GI、DXR、RayCasting、PhotonMapping等等层出不穷,高级光照软硬件都处于飞速发展中。光照技术博大精深,绝非几篇文章能够讲透,也非我们的目标,下面我们介绍的知识点也仅限于示例需要,读者若要了解更详细的光照技术,请查阅相关技术文献。

Cookie

一、Unity3D的光照系统

  Unity3D中的光照系统以光照计算时机分为实时光照(RealTime Lighting)和预计算光照(Precomputed Lighting)两种。实时光照会实时的计算光照,如方向光(Directional Light),点光(Point Light),聚光(Spot Light)都是实时光源。实时光照每帧都会更新,因此,它能处理移动的光源与移动的物体的光照渲染,为了降低光照计算开销,Unity的实时光照只计算直接照明(光线不会反弹)。预计算光照使用烘焙(Baking)技术预先烘焙一个光照贴图(Lightmap),在预计算时会将光对场景中静态物体的影响写入到纹理中,然后将其覆盖在场景的物体之上,以产生光照效果。这些光照贴图可以包括入射到物体表面的直射光(Direct light)以及从场景中的其他物体的表面反射的间接光(indirect light)。使用烘焙技术时,这些光照贴图(Lightmaps)在应用运行时不能改变,因此被称为“静态”的。通过将光照计算移到应用运行前,可以应用大量复杂的光源,并且提升应用的性能。

  Unity3D中按光照来源分可以分为直接光照(Direct light)和间接光照(indirect light)。直接光源指光照直接来自于一个光源(灯、太阳或其他发光体),间接光源是指光来自于另一个物体对光源光线的反射、折射。Unity3D中的直接光照主要来源于各种灯光物体,直接照明可以产生阴影,但光线不会反射、也不会折射,可以穿透半透明材质物体。直接光照包括:聚光灯、点光源、平行光、区域光。间接光照非直接来自于光源,间接光照包括:环境光(Ambient Light),特指来自于天空的漫反射。在Unity3D中可以继承“天空球”的颜色作用环境光颜色,也可以自行指定环境光颜色。反射光(Reflect Light),特指天空漫反射之外的所有环境漫反射。在Unity3D中主要通过光照贴图或灯光探针来模拟。自发光(Emission),在Unity3D中自发光物体本身的亮度仅使用颜色来模拟,自发光物体对于环境的影响则通过光照贴图或灯光探针来模拟。

二、方向光

  方向光(Directional Light),有时也叫平行光,通常用来模拟阳光,Unity3D新建场景后会默认在场景中放置一盏方向光,Unity3D中的方向光不会衰减,它们会影响到场景中所有物体的表面。同时,它们对于图形处理器的性能消耗最低。

Cookie

  从上图可以看到,方向光不会反射,如右边墙体的颜色不会反射到立方体表面上。在Inspector窗口中,可以看到方向光有如下属性:

  • Type(种类):在此项中对光源类型进行设置。
  • Mode(烘焙模式):有Realtime(实时烘焙),Baked(仅对静态物体烘焙),Mixed(对静态非静态物体都进行烘焙)。
  • Color(颜色):选择灯光的颜色,包含RGBA四种属性。
  • Intensity(强度):光照的强度。
  • Indirect Multiplier:在计算该灯光所产生的间接光照时的强度倍乘。
  • Shadow Type(阴影种类):包含三个选项,分别是No Shadow(无阴影),Hard Shadow(低质量阴影),Soft Shadow(高质量阴影)。Hard Shadow和No Shadow对性能消耗的比较小。选择阴影之后,会出现新的属性设置。
    • Baked Shadow Angle:烘焙阴影的角度。
    • Realtime Shadows Strength:实时阴影强度。
    • Strength代表阴影的强度,数值在[0,1]之间,1时阴影最明显,0时无阴影。
    • Resolution代表阴影的分辨率设置。
    • Bias:投射阴影的偏移量,通常适当增加这个值来修正一些阴影的渲染错误(Shadow acne)。
    • Normal Bias:法向偏移量,通常适当减少这个值来修正一些阴影的渲染错误(不同于Bias的使用场合)
    • Near Plane:近平面,因为这个影响离屏幕最近的物体阴影的投射,对于与摄影机距离小于这个距离的场景物体不产生阴影。
  • Cookie Size:Cookie贴图,通过设置具有Alpha通道的图片,使阴影出现相对应的遮罩图案投影。
  • Draw Halo:光晕,钩选后灯光周围会出现一圈光晕。
  • Flare:耀斑,Flare模拟摄像机对准光源时出现的镜头耀斑。
  • Render Mode:渲染模式,在Unity3D中,在Projects设置中可以设置Pixel Light Count,即逐像素光源数,也就是在项目中,Pixel Light Count个光源会按照逐像素进行处理,然后最多4个逐顶点光源,剩下的就是SH光进行处理。设置成Important,如果设置成Important的光源数少于Pixel Light Count数,光源会按照逐像素进行处理。
  • Culling Mask:这个用来照亮选择性的部分场景。

三、点光

  点光(Point Light)也是一种常见光,如电灯。点光源模拟一个小灯泡向四周发射光线的效果,点光源在其照亮范围内随距离增加而亮度衰减,由于它们向各个方向发射光线,因而在图形处理器上的性能消耗较为平均。

Cookie

  点光的很多属性与方向光一致。

  • Type(类型):设置光照类型。可以选择Spot(聚光灯)、Directional(方向光)、Point(点光源)或者Area(区域光)。每种类型提供一个特定的光照效果。
  • Range(范围):点光的照亮半径,在这个半径外,物体将不被点光照亮,在半径内,光照强度随距离增大而减少。Range参数规定光线从Point light光源中心向外发射的最远距离。
  • Mode(烘焙模式):你可以设置它为Realtime、Baked或者Mixed(实时、烘焙或混合)。
  • Color(颜色):发射的光的颜色。
  • Intensity(强度):参数规定光线的亮度值。
  • Indirect Multiplier:在计算该灯光所产生的间接光照时的强度倍乘。
  • Shadow Type:阴影属性和阴影类型。可以将它设置为No Shadows(无阴影)、Hard Shadows(硬阴影)和Soft Shadows(软阴影)中的一个。点光源阴影计算非常消耗GPU性能。当选择Hard Shadows(硬阴影)或者Soft Shadows(软阴影)时,会看到由Sphere和Point light点光源产生的阴影效果。调整Strength强度值,阴影也会随之减弱或者加强。Resolution分辨率参数设定阴影的精细程度。Bias和Normal Bias参数,他们用于设置光照空间的像素位置与阴影贴图值进行对比时的偏移量。
  • Cookie:一个可选参数,用于表示被用作掩码的alpha通道纹理,决定光线在不同的位置的不同亮度。由于这是一个点光源,被使用的纹理贴图一定会是立方体贴图。
  • DrawHalo:该属性只用于在光源周围渲染出光晕效果。
  • Flare:该选项规定了在光源位置处对要渲染的光晕的引用。当你在调试3D场景以及可能遇到的瓶颈时,Flare和Draw Halo选项会很有用。
  • RenderMode:渲染模式选项定义了渲染器在渲染场景时光照的重要程度。程度越重,渲染将会越加强烈。Render Mode模式可设置为Auto(自动)、Important(重要)或者Non-Important(不重要)这三种,请参照方向光。
  • Culling Mask:用来选中或者剔除受点光源影响的物体群组。

四、聚光

  聚光灯(Spot Light)是指从一个光源处朝着一个特定区域发射光线。它们只会照亮这个特定区域内的物体,这个区域被限定为一个三维锥形的区域。基本上,它们的工作原理类似于手电筒灯。因此,它们非常适用于手电筒、汽车前照灯或者灯柱。对于图形处理器来说,它们也是资源消耗最大的光源类型。聚光灯仅沿着一个圆锥体方向发出光线的效果,聚光灯在其照亮范围内随距离增加而亮度衰减。

Cookie

  聚光灯属性基本与点光相同,但多了一个Spot Angle,这个参数用来控制聚光灯的张角,这个角度规定了聚光灯灯能影响的角度范围,超出这个角度的物体不受该聚光灯的影响。

五、区域光

  区域光(Area Light)是Unity为了实现某些特殊效果而引入的光源类型,区域光是在矩形区域平面的一面向所有方向发射的一种光源,这个矩形通过Width和Height两个属性参数来进行限定。区域光只能用于光照贴图烘焙,这也就意味着在运行期间它们不会对物体产生影响。区域光模拟一个较大的发光表面对周围环境的照明效果,通常区域光的灯光亮度衰减很快,阴影非常柔和。
  区域光投射光线的面向方向为平面的法线方向,与光的正Z轴方向是一致的。光线是从整个矩形表面发射出去的。所以,与点光源或者平行光源相比,受区域光影响的物体阴影则显得更加柔和。区域光的光线计算非常消耗处理器资源,所以它们不能在运行期间使用,而只能用于光照贴图烘焙。

Cookie

六、光照探头

  灯照探头(Light Probes)包括反射探头(Reflection Probe)和光照探头组(Light Probe Group)。灯照探头能比较有效的提高间接光照的质量,但对性能的消耗极大,仅在需要时使用并且数量不可过多。

  光照烘焙对于动态物体(Dynamic Object),也就是没有被设置成Lightmap Static的物体来说都是不起作用的,如果希望动态物体也能被正确的照明,则需要创建Light Probe Group。Light Probe可以被认为是在场景中的一个小“光源”,而多个Light Probe组成的网络,就是Light Probe Group。这些小光源通过烘焙得到场景中该点的亮度信息,然后整个网络用这个信息来照明动态物体。同一时间内只会有最靠近动态物体的那些Probes会起作用,而且Light Probe离运动物体越近,其照明效果越强。我们可以根据场景光照环境特征来设置合适的Light Probe Group。为场景添加Light Probe Group可以很好的将动态物体与静态场景融合,尤其是在光照环境复杂的室内场景中,更需要添加Light Probe Group。

  反射探头(Reflection Probe)与光照探头类似,只是它用来采样周围环境信息,作用类似与Cubemap。Unity3D中并没并真实的Raytrace反射,而是通过反射贴图来模拟所有的反射效果。如果我们在场景中放置一个非常强反射的小球,我们就能看到这个小球上实际反射的是我们的Skybox,完全不会反射场景物体。这样一来不仅影响到场景中反光物体的反射正确性,同时也会影响整体场景的光照准确性。我们可以为场景添加Reflection Probe来矫正不正确的反射贴图。Reflection Probe可以看做是一个带有6个摄影机的点,它会渲染该点的6个方向(前后左右上下),将渲染结果拼成一个Cubemap,并应用给一个特定方框范围内的所有物体作为反射贴图。对于比较复杂的环境,比如有多个区域的大房间,我们可以放置多个Reflection Probe并手动设置其影响范围。

  Reflection Probe默认不会计算动态物体,仅计算烘焙物体,可以修改属性让其将动态物体也包括在内,同时还可以修改属性为Every Frame使其每帧更新以准确反射动态物体的运动过程,还可以增加Lighting Setting中的Reflection Bounces提高反射次数(这样就不会出现强反射物体在另一个反射物体中是黑色的情况了)。

Cookie

猜你喜欢

转载自blog.csdn.net/yolon3000/article/details/83118971
今日推荐