3.3 树木的优化
然而,我们又碰到了新的问题。
这个照片取景地是杭州西湖附近的北山路,也是我们游戏中设计的第一条赛带,沿路有数十棵树。一般情况下,我们会使用复杂的3D树木模型来绘制, 但这么做就容易出现过度绘制的问题。尤其是当车速过快,通过时间大概只有 10 秒,因此我们要用更为经济的方法来对这些树木进行渲染。
首先,我们要了解设计的树的类型。我们想要枝繁叶茂的树林,而不是单棵细节丰富的树。
因此,我们尝试使用Billboard(广告牌)应用于树的渲染,用四种贴图来保留光照特征,但是要为 Billboard 生成法线贴图有些复杂,让我们来看看生成过程。
首先,我们需要修改模型树的法线。原始模型的树叶法线是混乱的,我们希望法线能够沿着树状结构分布。
于是我们将传统法线(Traditional Normal)和形状法线(Shape Normal)结合,以获得细节丰富和完整的高多边形法线。
然后,我们将混合的法线信息烘焙到 Billboard 上,以创建 3D 模型,从而计算 Billboard 的动态阴影。下面的四幅图像显示了同一 Billboard 在不同相机视图中的着色结果。
借助Billboard,我们实现了丰富的树木,同时减少了绘制次数以及更低的性能消耗。
虽然我们使用了四种纹理来维持原始模型的形状,但仍然会有信息的丢失。我们想要通过 AI 计算来获得与原始 3D 模型相同的细节。
我们使用了高多边形树和离线渲染器来获得作为作为基准的逼真渲染结果(ground truth)。接着使用可微分渲染(Differentiable rendering)来找到最接近基准结果的贴图。
下方的视频是拟合的结果。左边是基准结果,右边是我们的 AI 计算结果。新方法只需要消耗两张贴图。而且你可以看到,两个结果基本没有差别。
接着,我们使用简单网格来模拟画面远方的树,在正常游戏场景下,显示效果也很好。
下方左图是我们游戏的截图。我们结合少量的树木模型和大量的 Billboard 生成了茂密的丛林。右图是 Overdraw(绘制过度)分析图。深蓝色表示绘制一次,浅蓝色表示绘制两次,可以看到大部分树木区域只绘制了一次。