如何在UE中制作高度逼真和多样化的草?同时将性能消耗降至最低!...
Game艺视界原创文章原创 16380 0
实名

通过了实名认证的内容创造者

发布于 2023-4-28 15:43:51

您需要 登录 才可以下载或查看,没有账号?注册

x

本期笔记内容(转载80lv、作者:Nils Arenz)    介绍
    你好,我叫Nils Arenz,是一名来自德国的初级3D环境艺术家。今年早些时候,我完成了计算机图形和图像处理领域的学习。在我的毕业论文中,我使用英伟达PhysX库开发了一个用于模拟不同雪崩类型的应用程序。我学习的主要领域是C++和OpenGL的编码,但我总是对利用学习期间获得的知识从事数字艺术更感兴趣。我尽可能多地参加大学里的游戏或电影艺术项目,并提高了我对虚幻的认识。毕业后,我不得不做出选择:做一名程序员,还是追随我的梦想,努力成为一名3D环境艺术家。我选择了最后一个,我真的很高兴这个决定!

我的主要兴趣领域是尽可能详细和复杂地设计自然,但要以一种非常有效的方式做到这一点。我在编码 3D 应用程序方面的背景对优化设计有很大帮助,因为我知道所有计算背后的数学。我最近发表的项目是摄影拍摄的地面景观材料、摄影拍摄的树皮材料和一种动态互动的常春藤。在下半年,我将专注于创建动态风动画和交互式植被

    植被创建基础

019ef9397fcfeb89ab389719f5695e64.png

在我看来,这分为五个部分
    首先,视觉质量必须非常高。草叶或其他植被部分不仅仅是一些绿色网状部分。我制作的所有植被照片都是在户外或家中的便携式摄影棚中扫描的,以获得最佳的照明设置
    接下来,您需要一些风动画。当你穿过森林时,看到所有的植被都是静止的。这感觉根本不对
    第三,你需要一些与植被互动的方式。如果你走在常春藤的树枝旁,树枝应该和你的角色有一些互动
    您的植被应尽可能复杂/独特,但同时也应高效。如果你只使用5种不同的草叶来设计草簇,那看起来就不太好了。不同种类的叶子/草叶越多,结果就越好。此外,你优化的越多,就会有更多的人对你的设计就越满意

    建筑草坪
    实现草的最常见方法是在反照率图中并排排列草叶,并使用大平面将其映射到对象。然后,这些平面将以不同的角度相互堆叠。如果你从上面看草,你将看不到你下面的草叶。一个更好的方法是在每片草周围放置一个较小的平面,并将这些叶片作为一个结构放置。这两种方法都有两大缺点:四边形过度渲染和着色器复杂度非常高。减少它们的唯一方法是对每一片草单独建模,以便使用的透明度尽可能低。这也将降低四边形透支。这种方法的缺点是顶点计数高于其他方法,但我从中受益。要使用Unreal Engine Pivot Painter Tool 2.0,需要为风模拟提供更精细的网格。此外,UE4正在使用叶子实例,这使得顶点计数不那么重要

b5ad1aa8d05b47db845edb47f8d9b0ba.png



    使草多样化
    我的工作流程。不像花,你可以剪草,它会保持一个小时的新鲜。当我住在乡下时,我只是去外面收集一大堆草。记住,选择高度多样的不同种类的草很重要。接下来,我把草带回家,放在花瓶里。为了以后获得最好的结果,你还需要挑选出每种草的不同外观的叶片。你可以在下图中看到。记住,选择高度多样的不同种类的草很重要。接下来,我把草带回家,放在花瓶里。为了以后获得最好的结果,你还需要挑选出每种草的不同外观的叶片

对于每种草,我挑选了大约5-10种不同的独特叶片。为了获得最好的性能,我将所有这些都打包在一张反照率图中。总共,我得到了84片不同质地的草。每个对象都被建模,复制多次,然后变换成不同的形状。所以我想出了150多种不同外观的草叶。下一步是创建可以用作树叶刷的草簇。对于这项资产,我制作了82个草刷,为您提供了高度的树叶变化。这些簇由100-200个草叶组成,每个簇的平均顶点约为1200个。笔刷用作对象实例,顶点计数没有那么重要。使用虚幻引擎,你必须在x、y和z轴上添加一个大约为大小的+-20%的自由变换。这一切都提供了一种外观,即草地景观的每个部分看起来都完全不同


由于较低的着色器复杂度和较低的四边形透支,与其他草叶相比,即使顶点计数较高,性能也更高。目前,LOD由虚幻引擎生成。我正在研究一个新的实现,它通过减少每个草叶的高度间隔来降低顶点计数。为了测试性能,我制作了一个简单的场景,并在其中放置了30k个树叶实例。我有GeForce 1070 GTX,帧在80到120之间。在下面的视频中,可以很好地看到性能
[micxp_wxonkey]wxv_2687473510843252738[/micxp_wxonkey][micxp_wxonkey]wxv_2687477008993452032[/micxp_wxonkey]
    动画
    草的动画是此资源的关键功能。在虚幻引擎中,草和树叶运动最常用的动画是“简单草风节点”。它的主要功能是弯曲整个集群。缺点是,彼此相邻的草叶具有几乎相同的动画,它们以相同的强度向相同的方向弯曲。尽管如此,我还是使用了这个特性来创建一个卷风效果。

我对这个外观不满意,所以我做了一些研究,发现了Pivot Painter Tool 2.0。经过几周的反复尝试,我终于掌握了管道的创建和对所有参数的控制。“轴绘制工具”(Pivot Painter Tool)将风动画放置在簇的每一片草上。所有计算都在着色器中完成。每个对象的这些变换是基于其轴心点进行的。顶点计数越高,动画就越平滑。如果仅使用具有4个顶点的平面,动画将弯曲锁定到轴点的整个平面。现在,所有对象的移动完全不同,但由参数以相同的方式定义。Unreal已经实现了所有重要参数,如风力、风向、弯曲强度、随机风向变化等

另一个重要的步骤是分别对所有的草叶进行顶点绘制。如果侧叶比草的茎移动得更多,动画看起来会更好。这种方法的缺点是,每个簇都需要一个单独的材质实例,因为需要告诉材质轴点在哪里以及轴指向的方向


由于需要唯一的材质实例,因此也可以单独指定所有风参数。高草丛比矮短的草更容易受到风的影响。此外,可以将材质集合中的参数暴露,以便可以更改场景中所有对象的风向和其他值。使用此方法,您可以在应用程序中构建某种风力引擎。只需点击几下,您现在就可以改变风向、风力、风噪以及整个植被系统的更多参数,这将使您的植被看起来超级生动。

下篇  

制作游戏资产的最重要部分是让它们尽可能高效。因此,您必须花费数小时来分析不同植被设计方法的剖面图


接下来我想谈谈最常用的植物,草,但你可以将所有解释应用于任何一种植物。在 Unreal 中用茂密的草地填充整个地面是一项复杂的任务,我想分享我在过去半年中获得的知识,同时分析和设计植被,并提出在下一代视频游戏中拥有茂密草地的想法。

本文针对为下一代应用程序创建植被的技术背景,因此在深入探讨着色器故障之前,我想解释一些重要的着色器问题和当前的技术水平,以便更容易理解本文。为了尽可能地缩小规模,我专注于最重要的部分,请记住,所有测试都是在 Unreal Engine 4 中完成的,我很确定其他引擎也会处理一些相同的问题,但如果没有适当的测试,就没有正确的说法
[micxp_wxonkey]wxv_2687763591407697921[/micxp_wxonkey]    目前的技术水平    游戏创建草地最常用的方法仍然是在反照率贴图中将草叶并排打包,将它们映射到一个平面上,然后将这个平面堆叠在彼此内部以创建一个3维外观的草丛。这样做的好处是顶点数非常少。在下图中,您可以看到它的工作流程

这种实现的问题是大量使用透明度。对于密集填充的地面,您可以想象着色器必须进行大量计算。这些计算分为两个问题:
  • 实际的绘制过程(渲染卡片的哪一部分)
  • 阴影(什么草叶遮蔽了什么卡片/地面的一部分)
现在谈谈我将在下一部分中经常使用的几个术语。

    Quad Overdraw    Quad overdraw是一个像素限制问题,这意味着你拥有的像素越多(分辨率方面)这个问题就越重要。对于许多操作,GPU 使用四边形(2×2 像素块)而不是单个像素进行计算。如果你有细小的物体(比如草),你会浪费很多被丢弃的像素。这就是为什么小物体会花费大量 GPU 时间,但草很小,如果我们寻找自然的外观,那是我们必须走的路。可视化效果看起来越红/白越差
    着色器复杂度    在 Unreal 和其他类似的 CG 应用程序中,透明度非常昂贵。这就是为什么您应该始终将其保持在尽可能低的水平。在UE4中,如果涉及草地或其他植被,着色器的复杂性是瓶颈之一。可视化很容易理解。空白越多,pre-pass 和 basepass 的性能就越差。颜色表示 GPU 必须为每次绘制的每个像素计算的着色器指令总和。现代 GPU 大约有 2000 个着色器单元,每个时钟节拍可以执行一行着色器代码(取决于 GPU 大约 1500MHz)。因此着色器代码越长(着色器复杂性),渲染过程越长

有关所有基于 GPU 的问题的详细解释,请观看此视频P3





每个游戏,每个生态型都完全不同,这就是为什么我想分解最重要的因素并向您展示性能差异。对于这些故障中的每一个,我将显示图片并根据配置文件输出以百分比形式比较着色器时间。为了通过以毫秒为单位,阅读数百次着色器时间来节省您的时间,我简化如下:

这意味着:使用我的方法可以使绘制调用增加 47%,而且整体性能提高 81%。
这是关于渲染通道及其包含的内容的一个小解释。
  • Drawcalls:GPU 必须为每一帧执行多少次 drawcalls。
  • Overall:总渲染时间,包括所有渲染通道。
  • Prepass:在prepass中,UE根据实例到相机的距离对实例进行排序。(数据库缓冲区)
  • Basepass:运行着色器(材质)以创建 GBuffers。
  • 阴影:所有与阴影相关的通道(ShadowDepths、Lights、LightComposition 等)的组合

剔除距离
密度

不同的视角

    阴影与无阴影
    一些引擎/开发者不对草使用阴影。这就是为什么我还想包括一个没有阴影的草丛的测试。因为在地面树叶上传递的阴影非常重,所以它们被很多人跳过了。但即使没有地面阴影,单一建模集群在同一场景中的性能也提高了约 190%。这是由 pre-pass 和 basepass 造成的,因为 GPU 必须进行大量计算。

    游戏场景
    在游戏中,除了渲染草地之外,还有更多的事情要做。最后一个测试是基于一个完全构建的环境,其中有粒子效果、动画、大景观、岩石、树木、其他结构和蓝图在后台运行。另一个想法是让场景中的顶点数非常多。作为草地,使用中密覆盖。在下面的 GIF 中,您可以看到场景。请不要在这个场景中判断我的创造力。

该测试的结果也反对植被面片的使用
结果可能看起来非常引人注目,但请记住,场景中只有带草的景观。

    视觉分解
   对我来说,看着地面,看到每一片草叶都是非常令人满意的自己建模,你看不到这些植被面片。其他植物在实际 3D 模型中看起来会比仅仅在面片中看起来更好。对我来说下一个重要的事情是动画。如果你看着多风的草地,你会看到每一片草叶都在单独移动。正如我所解释的那样建模让您有机会使用枢轴绘画工具来获得逼真的风效果。在下面的 GIF 中,您可以看到我用我的资产制作的一些游戏场景

优点缺点
优点:
  • 更好的性能
  • 对 LOD 创建的良好控制
  • 更容易创建更复杂、更自然的植物结构
  • 更好的视觉质量

缺点:
  • 控制台和移动设备只能可视化有限数量的顶点
  • 耗时的创作过程
  • 不可能适用于所有类型的植被(蕨类植物、树叶)

    结论
    在评估了所有这些不同的故障场景后,我问自己:用顶点数换取更少的着色器计算?在我看来绝对值得。当然,您必须按正确顺序平衡所有内容,并为创作过程安排更多时间,但视觉质量和性能方面的优势将是考虑这一点的充分理由。总的来说,我可以说你看到的草越多(通过剔除或只是更高的密度),优化草和其他植被就越重要。自然环境非常复杂,到处都是各种各样的植物。在接下来的几年里,我非常期待使用更高的顶点数来让植物更逼真、更高效。

    提示与技巧
    在解释了性能的影响之后,我想就如何在资产创建过程中继续做一些提示。这一切都始于扫描植被以及您应该选择哪些确切的植物部分。 记住尽可能少地使用不透明蒙版的想法!当您选择要扫描的植物时,您必须知道是否可以有效地对该部分进行紫外线照射。所以总是提前考虑。在下图中,您可以看到哪些草叶是好的,哪些应该避免。

下一个重要的事情是 UV 植物超级准确!让每个像素都很重要。如果你做得好,你可以节省着色器的复杂性和四边形透支

在不透明度贴图上不使用 mipmap 将提高整体性能。使用主动 mipmapping,alpha 蒙版会根据您的位置进行下采样(类似于LOD,但用于纹理)。下采样将在白色空间之间进行线性插值并增加着色器计算,一些白色空间将消失但渲染仍将绘制完全透明的网格

避免着色器问题的另一个想法
为了完全避免着色器问题,我建议完全使用纯网格技术。但这只适用于最简单的草叶。这种方法的整体性能非常好,因为顶点数少且着色器计算量少。这种方法的缺点是缺乏现实主义。在下面的图片中,您可以看到我的结果。这允许您在超过 140 fps 的大景观上放置剔除距离高达 15000 的草。

作者商城地址
https://www.unrealengine.com/marketplace/en-US/profile/Proje ... iveDate&sortDir=DESC&start=0
文章源地址

https://80.lv/articles/preparing-realistic-grass-in-ue4/
https://80.lv/articles/creating-next-gen-grass-in-ue4/

好!本期笔记分享就到这里,我们下期见!

微信公众号:Game艺视界
使用道具 <
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表