ABOUTCG微资讯将定期为您推送有干货,有价值的CG行业文章!
作者:Simon Tremblay
翻译:ABOUTCG翻译小组
接上一篇
植物
草和花是在Substance Designer 里从3DSMAX里做的高模烘培到简单的贴片模型里。贴片再导回3DSMAX分成不同的块。因为这些块都是贴片模型组成的,所以他们都需要编辑顶点法线才能使它们对光照的反应正常,这对草和叶子尤其重要。我使用了一个3DSMAX的叫Normal thief的脚本来传递一个穹顶的顶点法线来匹配每个块。这些块在导入引擎之前先导入Speedtree,只是利用一下Speedtree的颜色变化和风的功能。这些树只是临时占位。我用了一个Speedtree的范例树,降低了每个LOD的多边形数量来获得更好的性能,再导入虚幻引擎之前还添加了一些随机变化。之后我设置了每个树的"cull distance" 以及每个LOD的"screen size",手动的确定正确的位置和性能表现。这些树之后会被我正在做的自己的树替代,不过现在这是一个可以让场景先快速跑起来的替代方法。下面是在3DSMAX里马上要被烘培的高模的截图:
由于场地里的草是无处不在的,我反复修改了草让它们尽量正确。我花了很长时间反复调整了大小,厚度,草簇的密度,直到在引擎里的效果让我满意为止。
在编辑顶点法线之前,灯光打在这些贴片模型上是错误的。单独看起来可能不是很明显,但是当你开始使用几百个代理放在一起的时候,错误就显而易见了。
装饰物
我使用虚幻引擎的"grass"和 "procedural foliage spawner" 来填充地形。我创建了一个"Landscape Grass Type"的actor,指定了几个静态草的模型。然后,在材质上,我只是将草的材质连进了一个"grass"节点。在节点属性里,我看到了之前制作的"Landscape Grass Type"作为"grass type"。这就允许我使用草那层的混合权重来确定草的密度和位置。
草的density, cull distance, scale和草簇的旋转都可以在"Landscape Grass Type"的actor里设置。
树和草有点太薄了。我首先给每个资产都创建了一个"foliage type"的actor, 每一个都引用一个"procedural foliage spawner"actor。然后创建了16个"Procedural foliage volumes" (每个level一个) 来覆盖整个地区。在 设置"foliage type"的参数上花了很长时间。很多参数都可以影响素材的分布。我现在还在调整这些设置,但是最近我发现使用一个低的 "initial seed density" 加上一个高数值的 "steps"和"seed per step" 会得到一个比较自然的分布效果。这里需要反复大量实验才能得到令人满意的效果。更多关于procedural foliage spawner工具的信息可以在这儿看到:
https://docs.unrealengine.com/latest/INT/Engine/OpenWorldTools/ProceduralFoliage/QuickStart/
灯光
我觉得灯光是经常会被忽略的东西,但是我认为他可能是任何3D场景中最重要的方面。我经常看到好的艺术家上传了一些非常惊人的有潜力的但是被灯光减分的图片。只要灯光不行,再好的模型和贴图都不行。灯光可以轻松的成就或者干掉一个场景。我一开始的时候并没有一个目标概念,但是这是我开始做灯光之后的想法:我并不是想做尽可能真实,相对的我更关心场景整体的"感觉"。从我收集的灵感来源图片中,我知道我想要一个很亮,饱和度很高,有很多对比的场景。我想做一个栩栩如生的,一眼看到就很想去探索的场景。在早期,我想使用全动态光照的原因如下:
1 我最终想实现一个日夜周期交替的场景,这不可能用静态光照实现。
2 我想尽可能的避免使用light maps和它那冗长的制作时间
3 我当时对"体积光传播"的全局照明很感兴趣,想去尝试它。
虚幻4并没有任何产品级别的动态全局光照解决方案,至少发布的版本没有。"Distance field"和 "Light propagation volume" 的GI是最接近的,但是这俩都不是官方支持的,而且很久没更新了。放弃它们之后,我看了LPV GI对户外场景好像挺稳定的,于是决定一试。这必须去编辑一些文件来解锁这些特性,因为这只是试验功能。更多的信息可以在 https://docs.unrealengine.com/latest/INT/Engine/Rendering/LightingAndShadows/LightPropagationVolumes/ 这儿找到。我对结果相当满意。灯光反弹和色溢创建了非常令人印象深刻的结果。只需使用一个post process volume就可以控制很多参数。环境雾是所有户外场景的另一个经常被忽略的重点,但是能让你的场景大不一样。我最终使用了虚幻引擎的 "atmospheric fog"和"exponential height fog"相结合来获得我想要得到的效果。我想要一个比较厚的环境雾来区分前后景,得到一个比较大规模场景的感觉。我也想要避免"虚幻默认的白色雾蒙蒙"的感觉。我发现,默认情况下,一旦你稍微加一点雾,颜色就会很快褪掉,很难保持饱和度。为了缓解这个问题,我给平行光,天光和环境雾都加入了高饱和度的颜色。我使用了一个post process volume提高了整个场景的对比度和饱和度。这就可以让我在保持前后景的情况下依然保持我想要的亮度和饱和度。环境雾还可以帮我遮挡因为性能问题而消去的远处的草和叶子。Post process volumes也是调整灯光的一个很好的方法。我花了很多时间在尝试各种设置上。下图是只有灯光:
细节灯光:
最终白天光照:
夜晚的场景只是我为了好玩而快速整合的。我真的很喜欢《看火人》游戏里的那种"分层"的效果,并且也想尝试下。这还在进行中。我打算最终实现一个真正的昼夜循环。
建议
做这么巨大的场景的一个主要关注点就是性能和优化。因为这只是个人项目,并不需要像商业项目一样放出,我也许不需要花时间来全部优化整个项目,但优化确实也很重要。这是一些需要牢记的注意点:
1 正确的设置LOD和 culling distances是至关重要的
2 植被是非常消耗性能的,尝试保持所有物体的面数尽可能的少。可以考虑关闭一些静态物体的动态阴影。也尽量尝试尽可能减少"空白的透明部分",因为它会造成大量的性能损耗。
3 将场景分成若干levels然后一定要使用level streaming。他可以让你有更好的工作流程和更好的性能。
4 尽量避免远距离的视野,因为这会导致载入巨量的场景信息到内存里但是其实又不太看的清楚。这是我没做好,但是我想做的事。如果我重新来做的话,我一定会确保有一些明显的遮挡物来区分各个区域。
5 计算一个巨大的全分辨率的地形的动态阴影是非常耗资源的。考虑创建一个低面数的代理来投射阴影。(这是我没做,但是很想去做的事)
6 不拘泥于细节。当工作量这么大的时候,你必须接收你不能手动的刷遍地形的每个地方,或者像常规场景一样手动摆放每个素材。你必须把一些控制权交给自动工具,当然,会在一开始的时候很难放手。场景的整体感觉才是最重要的。
能够分享我的流程中的一些内容我很开心。你可以在我的Artstation https://www.artstation.com/artist/simontremblay3d 上继续关注我这个项目,我会持续更新。
,