Nils Arenz 在UE4 中 继续他的植被研究, 并谈到为下一代视频游戏创建茂密的草,同时将性能损失降至最低。本文中描述的技术可以在 1 月份免费测试,因为 Nils 的 交互式开放世界植物 将成为本月 UE 赞助的内容之一。
在这里阅读最后一篇文章:
它是关于什么的?
在这篇文章中,我想谈谈最常用的一种植被,草,但您可以将所有解释应用于任何一种植物。在虚幻中用茂密的草填满整个地面是一项复杂的任务,我想分享我在过去半年中在分析和设计植被时获得的知识,并提出在下一代视频游戏中拥有茂密草的想法。
本文针对为下一代应用程序创建植被的技术背景,因此在深入探讨着色器故障之前,我想解释一些重要的着色器问题和当前的技术状态,以便更容易地理解本文。为了让这个尽可能小,我专注于最重要的部分,所以你不必通读很多页。请记住,所有测试都是在虚幻引擎 4 中完成的,我很确定其他引擎也会处理一些相同的问题,但是没有适当的测试,就没有适当的声明。
最先进的
为视频游戏创建草的最常用方法仍然是在反照率图中将草叶并排放置,将它们映射到一个平面上并将该平面相互堆叠以创建一个 3 维的草丛。这样做的好处是顶点数非常少。在下图中,您可以看到该工作流程。
这种实现的问题是大量使用透明度。对于密密麻麻的地面,您可以想象着色器必须进行大量计算。这些计算分为两个问题:
-
实际绘制过程(渲染卡片的哪一部分)
-
阴影(什么草叶正在遮挡什么卡片/地面的一部分)
现在来谈谈我将在下一部分中大量使用的几个术语。
四重透支
四边形过度绘制是一个像素边界问题,这意味着您拥有的像素越多(分辨率方面),这个问题就越重要。对于许多操作,GPU 使用 Quad(一个 2×2 像素块)而不是单个像素进行计算。如果您有薄的物体(如草),您将浪费大量丢弃的像素。这就是为什么小物体会花费你大量的 GPU 时间,但草只是很小,如果我们寻找自然的外观,这就是我们必须走的路。可视化越红/白,性能越差。
着色器复杂度
在 Unreal 和其他类似的 CG 应用程序中,透明度非常昂贵。这就是为什么你应该始终保持尽可能低的原因。在 UE4 中,如果是关于草或其他植被,着色器的复杂性是瓶颈之一。可视化很容易理解。空白区域越多,pre- 和 basepass 的性能就越差。颜色表示 GPU 必须为每次绘制的每个像素计算的着色器指令的总和。现代 GPU 大约有 2000 个着色器单元,每个时钟周期可以执行一行着色器代码(取决于大约 1500MHz 的 GPU)。所以着色器代码(着色器复杂度)越长,渲染通过的时间就越长。
有关所有基于 GPU 的问题的详细解释,请查看此视频:
测试方法
为了减少基于着色器的计算,我决定尝试单独对每一片草叶进行建模。就顶点数而言,这听起来很沉重,但不要低估现代 GPU 和对象实例化。它还让您有机会使用 Pivot Painter 2.0 Tool 来制作逼真的风动画,并拥有更准确和基于质量的建模过程。对于我的资产,我使用了每片草叶 1 到 8 个的多边形数。
有关创建过程的其他一些提示位于文章末尾。
性能细分
在本文的这一部分,我想展示这两种方法并分解渲染通道以解释它们之间的差异。对于测试,我构建了两个外观精确的集群:一个使用平面技术,另一个使用“真实网格”实现。草是使用景观类型草节点放置的,该节点在地面材质上生成草丛。图片可能看起来不完全相同,但这是由集群的程序放置引起的。密度是相同的,所以你会在我将比较的每张图片中看到相同数量的集群。我尝试以相同的方式优化两种设计的网格,也就是说我尽可能准确地绘制了平面。这里是两种方法的技术细节:
每个游戏,每个生态类型都完全不同,这就是为什么我想分解最重要的因素并向您展示性能差异。对于这些故障中的每一个,我将显示图片并根据配置文件输出以百分比形式比较着色器时间。为了通过以毫秒为单位阅读数百个着色器时间来节省您的时间,我将其简化如下:
这意味着:使用我的方法会增加 47% 的绘制调用,但也会使整体性能提升 81%。
这是关于渲染通道及其包含的内容的一个小解释。
-
Drawcalls:GPU 必须为每帧执行多少次绘制调用。
-
总体:总渲染时间,包括所有渲染过程。
-
Prepass:在 prepass 中,UE 根据实例与相机的距离对实例进行排序。(DBuffer)
-
Basepass:运行着色器(材质)以创建 GBuffer。
-
阴影:所有与阴影相关的通道的组合(ShadowDepths、Lights、LightComposition 等)
剔除距离
密度
不同的视锥
着色与未着色
一些引擎/开发者不为草使用阴影。这就是为什么我还想包括一个无阴影草丛的测试。因为地面树叶上的阴影很重,所以它们被跳过了很多。但即使没有地面阴影,在同一场景中,单个建模集群的性能也快了 190%。这是由 GPU 必须执行的计算数量导致的 pre- 和 basepass 引起的。
游戏场景
在游戏中,除了渲染草之外,还有更多的事情要做。最后一个测试基于一个完全构建的环境,其中包含粒子效果、动画、大景观、岩石、树木、其他结构和在后台运行的蓝图。另一个想法是在场景中有一个非常重的顶点数。作为草地,使用中等密度的覆盖。在下面的 GIF 中,您可以看到场景。请不要在这个场景中评判我的创造力。
该测试的结果也反对使用植被广告牌。
结果可能看起来非常引人注目,但请记住,场景中只有一个带草的景观。
视觉分解
由于我在上一篇文章(开头的链接)中已经谈到了视觉优势,所以我只解释最重要的部分。对我来说,看着地面,看到每一片草叶都是非常令人满意的自行建模,您看不到这些植被广告牌。其他植物在实际 3D 模型中看起来会比广告牌更好。对我来说下一个重要的事情是动画。如果你看一片有风的草地,你会看到每一片草叶都在单独移动。正如我所解释的那样,建模使您有机会使用枢轴画家工具来获得逼真的风效果。在下面的 GIF 中,您可以看到我用我的资产制作的一些游戏就绪场景。
优点缺点
优点:
-
更好的性能
-
对 LOD 创建的良好控制
-
更容易创建更复杂的自然植物结构
-
更好的视觉质量
缺点:
-
控制台和移动设备只能可视化有限数量的顶点
-
耗时的创建过程
-
并非每种类型的植被(蕨类植物、树叶)
结论
在评估了所有这些不同的分解场景后,我质疑自己:为了更少的着色器计算而交易顶点数?在我看来绝对值得。当然,你必须以正确的顺序平衡一切,并为创作过程计划更多的时间,但视觉质量和性能方面的好处将是考虑这一点的一个很好的理由。总的来说,我可以说你看到的草越多(通过剔除或只是更高的密度),优化草和其他植被的重要性就越大。自然环境非常复杂,充满了各种不同的植物。使用更高的顶点数使植物更加逼真和高效,是我未来几年真正期待的事情。
提示与技巧
在解释了性能的影响之后,我想就如何在资产创建过程中进行一些提示。这一切都始于对植被的扫描以及您应该选择哪些确切的植物部分。记住在您的脑海中尽可能少地使用不透明蒙版!当您选择要扫描的植物时,您必须知道您是否可以有效地对这部分进行紫外线处理。所以总是提前考虑。在下面的图片中,您可以看到哪些草叶是好的,哪些是应该避免的。
下一个重要的事情是紫外线植物超级准确!让每个像素都计数。如果你做得好,你可以节省着色器的复杂性和四边形过度绘制。
在不透明度贴图上不使用 mipmapping 将提高整体性能。使用活动的 mipmapping,alpha 蒙版会根据您的位置(如 LOD 但用于纹理)进行下采样。下采样将在空白之间进行线性插值并增加着色器计算,并且一些空白将消失但渲染仍将绘制完全透明的网格。
避免着色器问题的另一个想法
为了完全避免着色器问题,我建议完全使用纯网格技术。但这仅适用于最简单的草叶。这种方法的整体性能非常好,因为您具有较低的顶点数和较低的着色器计算。这种方法的缺点是缺乏现实主义。在下面的图片中,您可以看到我得到的结果。这使您可以在超过 140 fps 的大景观上放置距离高达 15000 的草。
请登录之后再进行评论