求Unity Shader支持实时光照烘焙观看和烘焙后lightmap显示

 烘焙后阴影锯齿明显如下图:

洳果最高级别不能达到好的效果则需要创建自定义LightmapParameters。

(也可通过右键菜单在Project下创建)

2 减小Blur Radius 和增加看锯齿级别设置如下:

3 下图为改善后的效果:

正确的alpha贴图,边缘必须留出足够的“溢出”如下:

发布了0 篇原创文章 · 获赞 7 · 访问量 5万+

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Light-map是一张贴图(texture)存储了從场景(scene)中直接烘焙而来的灯光信息,通过这张贴图我们可以减少draw call,提升我们游戏的性能light-map通常没有阴影(shadow)。全局光照烘焙(Global )實时灯光只会被运用在移动或者需要动态阴影的棘手物体上。场景以来烘焙light-map都是游戏开发过程中一项非常标准化的工作用空间换时间来加快渲染速度。

为了学习本教程我们将学习一下基础知识并使用unity中最原始的物体来烘焙light-map以为示例。之后你就可以在unity中使用相同的技术来烘焙那些非常酷炫的模型了。

  • 包含一个平面(plane)和一个盒子(box)的3D场景

  • 不是必要的但手动解包能得到更高质量的ligth-map)

做唍了上面的准备之后,在Unity中建立一个正确的场景我们会以FBX或者Obj等任意unity支持的3D格式导出3D模型。

  • 复制box并把它们穿插交叠在一起这樣可以看到接触阴影(contact shadow)或周环境光散射(Ambient occlusion)

  • 选中平行光源,标记为static这个光源会为我们的light-map提供光照烘焙信息


  • 接下去我们就可以接触light-map的设置了。

如果想要获取更过关于此处setting的属性信息可以查看,强烈建议上手前先阅读一遍

请参阅下面的图片并按下图所示更改设置。

一定要记住选中所有你想要烘焙的物体一旦所有物体被选中,按下“build”按钮开始进行烘焙

当构建按钮被按下时,进度条将出現在Unity 5窗口的右下角指示烘焙过程已经开始!

一旦处理完成,烘焙lightmap的任务就完成了一个令人惊奇的场景出现了,阴影都被烘焙进去了!

参考资料

 

随机推荐