性能解析:在UE4中创建真实的草
1介绍
大家好!我是Nils Arenz. 书接上文,在上一篇文章中,我给大家分享了,如何在UE4中创建逼真的植被。这也是我作为一名植物艺术家职业生涯的开始。由于我拥有计算机图形学理学学士学位的教育背景下,我想尽可能地发挥它的价值。因此,我花费了数小时来分析,不同植被解决方案的性能对比。
2关于
在这篇文章中,我想谈谈最常用的植被“草”。在Unreal中用浓密的草填充整个地面是一项复杂的任务,我想分享我在过去半年中,研究和设计植被时获得的小经验,并构建下一代游戏中使用浓密草的想法。
本文的目标是为下一代应用程序,创建植被相关的技术做准备,因此,在深入讨论Shader细分之前,我想给大家同步一些关于着色器相关的问题,以及,当下的技术状态,以便更容易理解本文。为了尽可能缩短这个篇幅,我把重点放在了最重要的部分上,这样你就不必阅读太多的页面了。请记住,所有测试都是在Unreal Engine 4中完成的,我也很确定,在其他引擎上也有一些相似的问题。
在谈到这个话题之前,最后一件事是:关于我制作的植被资产,将作为赞助内容的一部分,在UE市场上提供免费下载。这个资产工程文件,使用了我将要介绍的这一篇技术,别忘了试一试。(文章末端有链接)
3主流解决方案
对于草地的解决方案,最传统的方法仍然是将处理好的albedo贴图,贴到模型片上,并将该模型片相互穿插堆叠,在此基础上创建出一个三维的草丛。这样做的优点是顶点是,模型面数非常低,如下图:
这种方案的最大的问题是大量Alpha通道的消耗。而你要想获得相对密集的效果,还得增加插片模型的数量,而且,每个模型片又相互穿插堆叠,可以想象,我们的shader就必须花费大量的计算。
这些计算可以分为两个问题:
[*]实际计算过程过于复杂
[*]遮罩外出现性能浪费
四边形透支
四边形透支,是个像素限制的问题,这就意味着像素越多(分辨率方面),这个问题就越明显。通常来讲,GPU使用四边形(2×2的像素块)而不是单个像素进行计算。如果你有很薄的物体(比如草),你会浪费很多被丢弃的像素。这就是为什么小的模型对象,会花费你很多GPU计算量。如下图,显示的红色越多,性能越差。
相对复杂的Shader
在Unreal和其他类似的CG应用程序中,透明度非常昂贵的。这就是为什么你应该把它保持在尽可能低的水平。在UE4中,如果涉及草或其他植被,则Shader的复杂性是瓶颈之一。如下图,这种形象化很容易理解,红色表示差,空白表示非常差。这个颜色相当于是GPU必须为每个像素计算的每个Shader指令的总和。以GeForceGTX1070为例,拥有1920个CUDA处理器,核心频率1506~1683MHz,每个时钟周期就可以执行一行着色器代码。因此,着色器代码越长(Shard的复杂性),渲染过程越长。
4测试方法
为了减少着Shader的计算量,我决定尝试对每片草单独建模。就顶点数量而言,这点不是很重要,请不要低估了当下GPU和Object-Instancing(实例对象)。此外,我们还为您提供了使用Pivot Painter 2.0工具,用来模拟真实的风动画,并提供了更精确和高质量的建模。对于我的资产,我使用了每片草1到8的多元计算。
5性能解析
在本文的这一部分中,我将展示这两种方法,并通过分解渲染过程,来解释它们之间的差异。对于测试,我构建了两个外观精确的草丛:一个使用传统的插片的方法,另一个使用“真实的网格模型”。草丛是通过使用“Landscape”这个节点,在地面材质上生成的草丛。通过图片可能看起来不完全相同,但这是由clusters的程序生成的,但是,密度是相同的,所以,我们比较的每张图片的时候,你可以看到相同数量的草丛。
以下是两种方法的技术细节:
每款游戏的生态环境都是完全不同的,这就是为什么我要做分解,并向大家展示它们之间的性能差异。对于每个细分,我将根据配置文件,输出百分比着色时间的对比图。为了节省您的时间,我将所有信息简化如下:
这意味着:使用我的方法可以使DrawCall增加47%,但总体性能提升81%。
下面是关于RenderPass及其他相关内容的小说明。
[*]Drawcalls:GPU为每帧必须执行多少Drawcalls。
[*]Overall:包括所有渲染过程的总渲染时间。
[*]Prepass:在Prepass中,UE根据实例到摄影机的距离对Instances进行排序,相当于DBuffer
[*]Basepass:运行着色器(材质)以创建GBuffer。
[*]Shadow:所有阴影相关过程的组合(阴影深度、灯光、灯光合成等)
Cull Distance
不同密度
不同视图角度
阴影和非阴影
一些引擎开发人员不使用阴影作为草地的一部分。这就是为什么我还想添加一个阴影的测试。因为,地面树叶上的阴影很重,它们太过出戏。但是,在没有地面阴影的同一场景中,单个模型草丛的性能提升也将近190%了
6实际游戏场景
在游戏中,除了渲染草地,还有更多的事情要做。最后一个测试是一个完全构建的环境,有粒子效果,动画,大景观,岩石,树木,以及其他结构和蓝图也在后台中运行。另一个想法是,在场景中设置一个相对多的模型数量,我们使用中等密度的数值,覆整个地面。在下面的GIF中,你可以看到这个场景。请忽略这个场景的创意。
结果可能看起来非常戏剧化,但请留意,场景中只有一个有草的Landscape。
7直观分析
由于我在上一篇文章(开头的链接)中已经谈到了视觉优势,对我来说,看到地面每一片草叶都是3d模型,这让人非常高兴,我们看不到这些植被是那种插片的模型。其他植物在实际效果中,看起来会比插片模型要好。对我来说,下一个重要的事情是动画。如果你看一片有风的草地,你会看到每一片草叶都在单独移动。正如我之前说过的的那样,建模可以使用pivot painter tool 2.0来获得逼真的风效果。在下面的 GIF 中,您可以看到我用我的资产制作的一些游戏场景。
优点:
模型端对LOD的优化,可以很好的控制
更容易创建结构更复杂的自然植物
更好的视觉质量
缺点:
移动端不友好(模型顶点数量过多)
创建资产过程时间比较长
并非适合所有类型的植被
7结论
在评估了所有这些不同场景后,我开始质疑自己的方案:仅仅是为了更少的着色器计算,而增加顶点数吗?但是,在我看来绝对值得。当然,你必须以正确的顺序制作这些,并为创作过程,我们需要计划更多的时间,但视觉效果和性能方面孰轻孰重,就需要我们对这方面深思熟虑了。总的来说,我们通过简单的提高密度之后,可以看到的草会越多,那么,通过剔除优化草植被的重要性就越大。自然环境非常复杂,充满了各种不同的植物,使用更高的顶点数的植物会更加逼真和高效,是我未来几年一直期待的事情。
8提示&技巧
在拆分了性能的影响之后,我想就如何在资产创建过程,进行一些提示。这一切都始于对植被的扫描,以及你应该选择哪些确切的植物部分。需要我们注意的是尽可能少地使用不透明蒙版!当你选择要使用扫描的植物时,你必须知道,是否可以有效地对这部分进行UV处理。
在下面的图片中,您可以看到哪些草叶是对的,哪些是应该尽量避免的。
下一个重要的事情是,我们需要一个超级准确植物UV!让每个像素都是充分利用的。如果你做得好,你可以节省很多性能开支。
在不透明度贴图上不使用mipmapping 也能够提高整体性能。使用活动的mipmapping,alpha蒙版也会根据您的位置进行下采样。采样的结果将在空白之间进行线性插值计算,并且那些空白的地方将消失,但渲染仍然会计算完全透明的区域。
避免Shader出现问题的另一个观点
为了完全避免Shader的问题,我建议完全使用纯mesh的解决方案。但这只适用于最简单的草叶。这种方法的整体性能非常好,因为你有一个低性能消耗的Shader再加适当的顶点作为整体的视觉平衡。这种方法的缺点是相对的缺乏真实感。在下面的图片中你可以看到我的结果。这让你可以在一个fps超过140的大场景中,将草的筛选距离提高到15000。
页:
[1]