unity 烘焙 光照贴图 以及一些灯光的相关问题(一)

本文深入探讨Unity中光照贴图(Lightmap)的原理及应用,解析RealtimeGI与BakedGI的区别,详解光照模式(Realtime、Mixed、Baked)对静态与动态物体的影响,以及如何利用Mixed光源实现动态阴影。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在做游戏场景的时候,由于一般场景大部分的物体都是静止不动的(static),如果这些物体使用实时光照的话,会有很大的性能开销,比如物体的阴影。但是由于很多情况下,场景中大部分物体的位置不会在游戏运行的时候改变,对应的阴影也不会改变。光照环境不改变的话(例如不会存在白天黑夜的切换)场景的展现效果也不会改变。因此针对这样的情况,我们会使用光照贴图(Lightmap)的技术,事先烘焙(bake)好效果,节省性能的消耗。

注:文章中有些字段的名称可能在不同的Unity版本中不一样,大家自己拓展了~

首先我们简单的搭建一个场景(如图),方便测试效果。场景里Scene内的物体勾选为static,胶囊体People为动态物体,然后有一个白色的光照。为了防止天空盒的影响,我们将Lighting设置中的环境光全部设置为黑色(Window->Rendering->Lighting Settings)。

 

Unity GI(global illumination 全局光照),有Realtime GI和Baked GI两种(如上图Lighting的设置中)。当我们将场景的物体勾选为静态物体的时候会发现对应的Mesh Renderer中,会自动配置上Lightmap的相关设置(Lighting设置中勾选了Auto Generate ,否则要手动烘焙一下)

选择上RealtimeGI的话会生成对应的Realtime Lightmap,会根据场景的灯光实时更新,选择上BakedGI的话会生成对应的Baked Lightmap,只有在烘焙的时候才会根据设置好的灯光更新(勾选了自动生成的话,每次灯光或静态物体改变都会重新烘焙)

Unity中光源的光照模式(Light组件的Mode属性)有三种,Realtime,Mixed和Baked。在不同的GI情况下,不同模式光源会产生不同的效果,我们可以在上面的测试场景中新增baked光源和mixed光源进行测试:

Realtime GI 和 Baked GI 都不勾选(静态物体无lightmap)

Realtime实时渲染时:静态物体和动态物体都会计算该光源
Mixed无法选择该模式
Baked无法选择该模式

 

只勾选Realtime GI(静态物体有 realtime lightmap)

Realtime

烘焙时:静态物体的realtime lightmap会计算接受到该光源的间接光

实时渲染时:静态和动态物体都会计算该光源

Mixed无法选择该模式
Baked无法选择该模式

我们会发现,场景和灯光都不变的情况下,勾选了Realtime GI,静态物体小方块的几个面比之前变得更白,底部还会出现一些白色的阴影。我们观察生成的realtime lightmap(双击详情)可以发现,图片的左上部分代表了两个正方形各自的六个面左下大面积的部分代表了平面Plane。而那些白色的部分就是realtime光源的间接光信息,平面贴近小方块的地方,光源折射会从平面折射到小方块的面上,也会从小方块的面上折射到平面上,形成间接光(光的折射是GI最重要的一部分bounces)。而远离小方块的地区没有间接光的接受,所以lightmap中显示为黑色。实时渲染的时候会计算lightmap信息和realtime光源信息,所以造成了更白的现象。

只勾选 Baked GI (静态物体有 baked lightmap)

Realtime

烘焙时:静态物体的baked lightmap不会计算该光源

实时渲染时:静态和动态物体都会计算该光源

Mixed

烘焙时:静态物体的baked lightmap会计算接受到该光源的间接光信息

实时渲染时:静态和动态物体都会计算该光源

注:不同的Lighting Mode设置会有不同的效果,文章的后面详细描述(当前为默认的shadowmask模式)

Baked

烘焙时:静态物体的baked lightmap会计算接受到该光源的直接光和间接光信息

实时渲染时:静态和动态物体都不会计算该光源

baked:

我们可以在场景中新增一个光源Baked,颜色选为红色,Mode选为baked,烘焙好后的效果图与光照贴图如下:

可以发现,动态物体(胶囊体)不受红光影响,lightmap为baked光源的红色,实时渲染的时候计算了realtime的白色光源。此时运行Unity,再修改baked光源颜色,或删除该光源都不会对场景产生影响。

但是此时你会发现场景中静态物体会产生两个阴影,一个realtime的实时阴影,一个baked的烘焙好的阴影,这肯定不是我们要的效果。若隐藏了realtime光源,则动态物体不会产生阴影,这显然也是不对的,游戏中不可能场景中的房子有阴影但是行走的人却没有。那如何使静态物体只有烘焙的阴影,但是动态物体有实时的阴影呢,这就需要下面的混合光源Mixed的帮助了。

mixed:

在bakedGI下,若场景只有realtime光源,则不会有lightmap,动态物体和静态物体的阴影都需要实时计算。若只有baked光源,则静态物体会烘焙好阴影,但是动态物体却不受该光源的影响,无法产生阴影。若你想把静态物体烘焙成lightmap,同时同一个光源又对动态物体产生影响,可以形成动态阴影,那就需要mixed光源的帮助了。

我们隐藏场景中的其他光源,新建一个光源,颜色选为绿色,Mode选为mixed,烘焙好后的效果图与光照贴图如下:

此时运行unity,移动胶囊体,阴影会随着跟着移动。隐藏小方块阴影并不会跟着消失,因为是事先烘焙好的。修改mixed光源的方向的话,动态物体的阴影和光照效果都会随之改变,静态物体的光照效果会改变但是阴影不会。

 

Realtime GI 和 Baked GI 都勾选(静态物体有 realtime lightmap和baked lightmap)

Realtime

烘焙时:静态物体的realtime lightmap会计算接受到该光源的间接光信息,baked lightmap不会计算该光源

实时渲染时:静态和动态物体都会计算该光源

Mixed

烘焙时:静态物体的realtime lightmap不会计算该光源信息,baked lightmap会计算接受到该光源的间接光信息

实时渲染时:静态和动态物体都会计算该光源

Baked

烘焙时:静态物体的realtime lightmap不会计算该光源信息,baked lightmap会计算接受到该光源的直接光和间接光信息

实时渲染时:静态和动态物体都不会计算该光源

若Lighting设置中Environment Lighting的Ambient Mode选择Realtime,运行时改变环境光的属性静态物体和动态物体的光照效果都会发生改变(静态物体的Realtime lightmap改变),而选择Baked,则会把环境光也烘培起来,运行时改变环境光,并不会改变静态物体的光照效果 。

 

搞清楚GI和光源的关系后,我们接下来看看Lighting设置中Mixed Lighting的Lighting Mode的三个设置。首先我们只勾选Baked GI,然后场景中只留之前绿色的mixed光源。

baked Indirect

只烘培静态物体的受到的间接光照,直接光以及阴影进行实时计算。运行时改变灯光,直接光照和阴影就会变,但间接光不变(如果间接光弱,视觉影响不大)。只减少间接光照的实时计算,适合对光照要求较高的场景,内存消耗小,当然性能的消耗也大。 

运行后的效果如下,动态与静态物体的阴影随着mixed光源实时计算,静态物体烘焙的间接光效果不变。

shadowmask

除了烘焙静态物体受到的光照,同时也会把静态物体受直接光照产生的阴影烘培到ShadowMask中,动态物体不受影响。运行时改变灯光,只有静态物体的间接光照和阴影不变。内存中多了一份Shadowmask,减少了静态物体阴影的计算,占用性能小了一点。

注意:开启Shadowmask需要在QualitySettings设置Shadowmask Mode为Shadowmask。

subtractive

烘焙静态物体受到的直接光和间接光的信息(包含阴影,如同baked光源)。运行时改变光照,静态物体直接光、间接光、阴影不受影响,性能消耗最小。 

<think>好的,我现在要解决用户的问题:在Unity烘焙光照贴图时如何保留高光信息。首先,我需要回忆Unity光照烘焙机制。根据用户提供的引用内容,烘焙主要是将静态物体的光照信息存储到Lightmap中,减少实时计算的开销。但高光通常属于直接光照的反射部分,而烘焙后的间接光照可能不包含这些信息。 用户提到的引用[2]指出,使用MixedLight模式可以在保留直接光的同时烘焙间接光。这可能是个关键点,因为高光效果通常依赖于直接光源的反射。如果光源是Baked或Realtime模式,可能无法正确保留高光。Mixed模式可能允许直接光在实时渲染中继续作用,从而保留高光。 接下来,我需要考虑材质的影响。标准着色器如Standard Shader可能有不同的处理方式。引用[3]提到保留法线和光探头,这可能涉及到材质中法线贴图的使用,而高光需要正确的法线信息。因此,确保材质使用适合的着色器,并启用高光相关参数,如光滑度和金属度,可能有助于保留高光效果。 另外,引用[4]说明烘焙后静态物体不再参与实时光照计算,但动态物体仍可使用光探头。或许可以将需要高光的物体设为动态,结合光探头来模拟间接光,同时保留实时的直接光计算高光。不过用户的问题是关于烘焙的静态物体,所以可能需要其他方法。 可能Unity的默认烘焙流程不保存高光到Lightmap,因为高光属于镜面反射,而烘焙通常处理漫反射间接光。因此,需要其他方法,比如在材质中使用自定义着色器,将高光计算分离出来,使其在实时渲染中处理,而漫反射部分使用光照贴图。 可能需要用户编写Shader,结合光照贴图的漫反射部分,同时实时计算直接光源的高光。这样在烘焙时,间接光被烘焙,而直接光的高光仍由实时光源处理。同时,确保光源设置为Mixed模式,这样直接光部分仍然有效。 总结步骤可能包括:调整光源模式为Mixed,使用合适的Shader,可能自定义着色器处理高光,确保材质的高光参数正确,以及可能的后期处理或反射探头增强效果。需要验证这些步骤是否可行,并参考Unity文档或社区资源确认最佳实践。</think>在Unity烘焙光照贴图时保留高光信息,需结合光照模式设置、材质属性和Shader调整。以下是具体方法: --- ### 1. **光源模式设置** - **使用`Mixed`光照模式**: 将场景中的光源设置为`Mixed`模式(非`Baked`或`Realtime`)。`Mixed`模式允许保留直接光的实时高光计算,同时烘焙间接光照贴图中[^2]。 ```csharp // 在Unity编辑器中设置光源模式为Mixed Light -> Mode -> Mixed ``` --- ### 2. **材质与Shader调整** - **使用支持高光的Shader**: 选择支持镜面反射的Shader(如`Standard Shader`或自定义Shader),确保材质的高光参数(如`Smoothness`、`Metallic`)已正确配置。 ```csharp Material -> Shader -> Standard Material -> Smoothness = 0.8 Material -> Metallic = 0.5 ``` - **分离高光计算**: 在自定义Shader中,将高光计算与光照贴图分离。通过`Lightmap`处理漫反射,而实时计算直接光源的高光。例如: ```glsl // 在Shader中混合光照贴图与实时高光 float3 lightmap = tex2D(_Lightmap, uv).rgb; float3 specular = _LightColor0.rgb * pow(max(dot(normal, viewDir), 0), _Gloss); finalColor = (lightmap * _Color.rgb) + specular; ``` --- ### 3. **烘焙设置优化** - **启用`Baked Specular`(部分版本支持)**: 在`Lighting Window -> Lightmapping Settings`中,勾选`Baked Specular`选项(需Unity版本支持),将高光信息烘焙光照贴图[^4]。 - **调整光照贴图分辨率**: 提高`Lightmap Resolution`(如`40-80 texels/unit`),确保高光细节能被烘焙保存。 --- ### 4. **动态物体与光探头结合** - **动态物体保留实时高光**: 若静态物体无法保留高光,可将需要高光的物体设为`Dynamic`,结合`Light Probes`传递烘焙的间接光,同时实时计算直接光高光[^3]。 --- ### 5. **后期处理增强** - **屏幕空间反射(SSR)**: 通过后处理技术(如`HDRP`的`Screen Space Reflection`)增强高光效果,弥补烘焙光照的不足。 --- ### 验证步骤 1. 设置光源为`Mixed`模式,烘焙场景。 2. 检查静态物体是否在实时渲染下显示高光。 3. 若未生效,检查Shader是否支持实时高光计算,或改用支持`Baked Specular`的Unity版本。 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值