导语
高质量的实时布料效果对提高游戏质量以及用户体验具有重要意义实现了一套完全基于GPU和Proxy mesh的布料模拟管线是非常值得研究的。
布料服饰在我们的日常生活中扮演着重要角色,而在游戏中,真实的动态布料效果更是提升沉浸感和视觉体验的关键因素。因此,开发高质量的实时布料仿真技术已成为3A游戏的必选项之一。然而,实时布料模拟在性能、效果、稳定性和可控性等方面面临诸多挑战。以下是针对这些挑战的解决方案和未来发展方向:
一、实时布料模拟的挑战
-
性能:
- 实时布料模拟需要大量的计算资源,尤其是在复杂场景中,如何在保证帧率的同时实现高质量的布料效果是一个重要挑战。
-
效果:
- 布料的真实感和细节表现直接影响游戏的视觉效果。如何在不同的环境和条件下保持布料的自然动态是开发者需要解决的问题。
-
稳定性:
- 在动态环境中,布料的物理行为需要保持稳定,避免出现不自然的抖动或穿模现象,这对物理引擎的设计提出了更高的要求。
-
可控性:
- 开发者需要对布料的行为进行有效控制,以便在不同的游戏场景中实现预期的效果。这包括对布料的风力、重力等外部因素的调节。
二、解决方案
-
学习与物理混合的方案:
- 去年在Tech Future中提出的学习与物理混合的方案,通过结合机器学习和物理模拟,能够在保证效果的同时提升性能。特别是我们的proxy mesh方案,在实际项目中显著改善了运行效率,使得布料模拟更加流畅。
-
基于GPU的布料模拟框架:
- 今年的Tech Future中,我们提出了基于GPU的布料模拟框架。GPU的并行计算能力能够大幅提升布料模拟的性能,使得实时计算成为可能,同时保持高质量的视觉效果。
-
自动生成proxy mesh的工具:
- 为了提高工具的优化和易用性,我们开发了自动生成proxy mesh的工具。这一工具能够简化开发流程,减少手动调整的时间,使得开发者能够更专注于创作和设计。
三、未来发展方向
我们的整体目标是紧随Tech Future项目的开发宗旨,努力实现实时的布料物理解算。未来,我们将继续探索以下方向:
- 进一步优化算法:持续改进布料模拟算法,以提高性能和效果,确保在各种硬件平台上都能流畅运行。
- 增强用户体验:通过改进工具和工作流程,提升开发者的使用体验,使其能够更高效地实现复杂的布料效果。
- 跨平台支持:确保我们的布料模拟技术能够在不同的游戏引擎和平台上无缝集成,满足更广泛的开发需求。
通过这些努力,我们希望能够在游戏中实现更加真实和动态的布料效果,为玩家带来更具沉浸感的游戏体验。
基于Proxy Mesh的布料模拟
在布料模拟的研究中,Proxy Mesh方案为解决传统方法中的性能和效果问题提供了一种创新的思路。以下是对这一方案的详细回顾和分析。
一、传统布料模拟方法的回顾
-
三角形网格表示:
- 在图形学中,布料通常用三角形网格来表示。每个顶点代表布料的一个质点,边则作为弹簧连接这些质点,形成一个弹簧质点系统。
-
基于骨骼的布料模拟:
- 在基于骨骼的方案中,布料被绑定到少量的骨骼上,通过物理模拟骨骼的运动来驱动布料的变化。这种方法的优点在于性能优越,能够显著减少计算量。例如,几千个顶点的布料可以通过几十个骨骼来驱动,速度提升可达几十倍甚至上百倍。
- 然而,这种方法通常需要美术手动调整骨骼与布料之间的绑定关系,以达到理想效果,且更适合低端平台。此外,为了提高可控性,往往需要与美术手工制作的关键帧动画结合使用。
-
基于网格的物理模型:
- 在主流引擎(如Unity和Unreal)中,基于网格的布料模拟方法也得到了广泛应用。弹簧质点系统是最简单的物理模型,通过将三角形网格上的每个顶点视为质点,并将边视为弹簧来连接这些质点。
- 这种方法的约束条件定义了顶点之间的距离,确保它们不会过于接近或远离。尽管高分辨率网格在多次迭代中能够产生良好的视觉效果,但性能受到质点数量和约束条件数量的影响。此外,由于完全基于物理规则,最终结果的可控性较差。
二、Proxy Mesh方案的提出
基于上述传统方法的局限性,我们在上一期的Tech Future中提出了Proxy Mesh方案,旨在在性能和效果之间找到更好的平衡。
-
Proxy Mesh的概念:
- Proxy Mesh是一种简化的网格表示方法,通过使用低分辨率的代理网格来近似高分辨率的布料网格。这种方法能够在保持视觉效果的同时,显著降低计算复杂度。
-
性能优化:
- 通过使用Proxy Mesh,布料模拟的计算量大幅减少。低分辨率的代理网格意味着更少的顶点和约束条件,从而提高了模拟的速度。这使得在实时应用中,布料效果的计算变得更加高效。
-
效果提升:
- 尽管使用了低分辨率的代理网格,Proxy Mesh方案仍然能够通过适当的插值和细节增强技术,保持较高的视觉效果。这种方法允许开发者在性能和效果之间进行灵活的权衡。
-
可控性增强:
- Proxy Mesh方案还提供了更好的可控性。开发者可以通过调整代理网格的参数和物理属性,轻松实现不同的布料效果,而无需过多依赖美术手动调整。
三、总结
Proxy Mesh方案为布料模拟提供了一种有效的解决方案,成功地在性能、效果和可控性之间找到了平衡。通过简化网格表示和优化计算过程,Proxy Mesh不仅提升了实时布料模拟的效率,还保持了良好的视觉效果。未来,我们将继续探索这一方案的应用潜力,并在实际项目中不断优化和完善,以满足日益增长的游戏开发需求。
基于Proxy Mesh的GPU布料模拟
在本次分享的第一部分,我们将重点介绍基于Proxy Mesh的GPU布料模拟技术。随着游戏开发对布料模拟效果和性能的要求不断提高,传统的CPU模拟方法面临着许多挑战。以下是我们在这一领域的探索和实现。
一、现有模拟方案的局限性
目前,主流的布料模拟方案,如Unity和Unreal引擎中的NvCloth和Chaos Cloth,主要依赖于SIMD的CPU并行计算。这种方法虽然在一定程度上提高了性能,但仍然存在以下问题:
-
性能瓶颈:
- 在进行布料模拟时,尤其是在复杂场景中,CPU的性能仍然是一个限制因素。例如,在仅进行两次迭代的情况下,NvCloth在PC上的性能消耗已经达到3.1毫秒。
-
穿插问题:
- 由于性能限制,现有的布料模拟方案无法有效使用连续碰撞检测(CCD)和大规模的包围体层次(BVH)结构来解决穿插问题。这导致在某些情况下,模拟效果不尽如人意。
-
移动端性能挑战:
- 在移动设备上,布料模拟的性能问题更加明显。例如,在高端的8Gen1手机上,1300个顶点的mesh模拟消耗达到3.3毫秒,而200个顶点的Proxy Mesh模拟也接近1毫秒。这表明,单靠CPU求解器在移动端进行布料模拟仍然面临较大的性能挑战。
二、GPU并行计算的解决方案
为了克服上述问题,我们决定采用GPU的并行计算来提升布料模拟的性能。通过将计算任务转移到GPU上,我们可以充分利用其强大的并行处理能力,从而提高模拟效率,并为其他计算任务腾出时间。
-
GPU并行模拟求解器的设计:
- 我们设计并实现了一个基于GPU的并行模拟求解器,旨在加速整个布料模拟的过程。该求解器基于UE5的Chaos Cloth开发,尽量减少对引擎的修改,同时复用原生模拟器的布料参数。
-
兼容性与适配性:
- 在开发过程中,我们确保了对Proxy Mesh模拟等特性的兼容性,并进行了针对移动端的适配开发,以确保在不同平台上都能获得良好的性能表现。
-
增强约束以减少穿插:
- 为了提高模拟效果的鲁棒性,我们尝试添加了几种新的约束。这些约束旨在减少角色在运动过程中的穿插现象,从而提升整体的模拟质量。
三、性能测试与结果
在实施GPU布料模拟方案后,我们进行了多项性能测试,以验证其有效性和优势:
-
PC性能测试:
- 在PC上测试了不同顶点数量(300、1000、3000)的布料模拟,结果显示GPU求解器在性能上有显著提升,能够在更短的时间内完成更多的迭代。
-
移动端性能测试:
- 在移动设备上进行的测试表明,GPU并行计算显著降低了布料模拟的时间消耗,使得在高端手机上也能实现流畅的布料模拟体验。
四、总结与展望
通过基于Proxy Mesh的GPU布料模拟方案,我们成功地提升了布料模拟的性能,解决了传统CPU求解器在复杂场景和移动端的局限性。未来,我们将继续优化这一方案,探索更多的约束和算法,以进一步提高模拟的真实感和鲁棒性。同时,我们也希望能够将这一技术推广到更多的游戏和应用中,为开发者提供更强大的工具支持。
GPU求解器的介绍
在本次分享中,我们将详细介绍我们的GPU求解器,它是基于Unreal Engine 5(UE5)的Chaos Cloth开发的。我们的目标是通过GPU并行计算来提升布料模拟的性能,同时尽量保持与现有Chaos Cloth框架的兼容性。
一、求解器的启用与配置
启用我们的GPU求解器非常简单。开发者只需在SkeletalMeshComponent的Details面板中勾选相应的参数,即可轻松切换到GPU求解器。这种设计使得开发者能够快速上手,并在项目中灵活应用GPU布料模拟。
二、整体模拟框架
我们的模拟框架主要分为两个阶段:BeginPlay和Tick。
-
BeginPlay阶段:
- 在这个阶段,我们收集布料的静态和动态数据,以及与求解器相关的数据。这些数据为后续的模拟过程奠定了基础。
- 在此阶段,我们还添加了自定义数据的创建和初始化,包括GPU Solver和GPU ClothData。这些数据结构将用于后续的计算和模拟。
-
Tick阶段:
- 在每帧的运行中,我们通过添加相应的Pass来进行布料的模拟和数据更新。
- 具体来说,Tick阶段的主要任务是调用simulate函数,执行布料的模拟步骤,并在模拟结束后通过GetSimulationData函数将数据更新到布料和Proxy Mesh对应的渲染缓冲区中。
三、实现框架的细节
我们的实现框架基于Unreal的布料解算流程,主要包括以下几个部分:
-
Create Actor:
- 在BeginPlay阶段,create actor函数负责创建对应的布料和求解器。在这一过程中,我们加入了GPU求解器的初始化部分(红色框部分),为后续的模拟做好准备。
-
Simulation:
- 在每帧的simulation阶段,我们收集了现有流程中可并行的步骤,并添加了对应的GPU Pass来进行模拟计算。这些计算包括顶点的运动、碰撞处理等。
- 此外,我们还计算了更新后的顶点法线,以生成最终的GPU simulation cloth buffer。红色框部分同样表示我们GPU求解器添加的内容。
四、并行计算的优势
通过将可并行的计算步骤转移到GPU上,我们能够显著提高布料模拟的性能。GPU的并行处理能力使得我们可以在每帧中处理更多的顶点和更复杂的物理交互,从而实现更高质量的布料模拟效果。
五、总结
我们的GPU求解器在设计上充分考虑了与现有Chaos Cloth框架的兼容性,尽量复用原有的流程和参数设置。通过在BeginPlay和Tick阶段的优化,我们成功地实现了基于GPU的高效布料模拟,为开发者提供了更强大的工具支持。未来,我们将继续优化这一求解器,探索更多的功能和性能提升方案,以满足日益增长的游戏开发需求。
Evolution阶段的详细介绍
在我们的GPU求解器中,Evolution阶段是布料模拟的核心部分,涉及时间积分、约束求解和碰撞处理等多个关键步骤。为了提升模拟效果和性能,我们还引入了一些在Chaos Cloth中具有特殊作用的小技巧。
一、时间积分与约束求解
在Evolution阶段,我们首先进行时间积分的计算,以确保布料在物理模拟中的动态表现。接下来,我们处理风力等外部因素,这些因素会影响布料的运动和形态。
约束求解是Evolution阶段的另一个重要环节。在布料模拟中,约束通常包括最大距离约束(maxDistance)、绳索约束(tether)、边缘约束(edge)和弯曲约束(bending)等。由于某些共点的约束求解相对不易并行处理,我们采用了图论的方法来组织约束。
具体来说,我们将约束根据连通关系构建成一张图,并使用图着色(graph coloring)的方法对约束进行分块。在求解时,同一块内的约束可以并行处理,而不同块之间则需要串行求解。针对这一问题,我们尝试了三种不同的方案,以适应不同的情况和需求。
二、碰撞处理
在完成约束求解后,我们进行碰撞处理。这一过程确保布料在与其他物体交互时,能够正确响应并避免穿插。碰撞处理是布料模拟中非常重要的一环,尤其是在实时环境中,性能要求较高的情况下。
三、后处理与数据写回
在Evolution阶段的最后,我们进行了一些后处理计算,以确保布料的最终效果符合预期。在数据写回的步骤中,我们针对不同的数据需求,添加了多个Pass,直接在GPU上更新布料和Mesh所需的数据。红色框部分表示我们GPU求解器添加的内容。
性能测试与效果对比
我们主要在8Gen1手机上测试了GPU求解器的性能和效果。以下是一些关键的测试结果和视频展示:
-
GPU与CPU求解器效果对比:
- 左侧为Chaos Cloth默认求解器的效果,右侧为我们的GPU求解器的效果。可以看到,两者在裙子的表现上非常接近,说明我们的GPU求解器在效果上达到了预期。
-
Proxy Mesh的模拟效果:
- 左侧展示了Proxy Mesh的GPU模拟效果,右侧则是使用该Proxy Mesh进行GPU全流程更新的Visual Mesh结果。这一对比展示了我们GPU求解器在实时模拟中的表现。
-
其他示例:
- 我们还展示了绳子和披风的模拟效果,均使用Proxy Mesh的GPU全流程更新。性能数据统计显示,GPU方案在手机上实现了2-3倍的性能优化。
-
不同分辨率的性能测试:
- 我们在3080的PC台式机和8Gen1的手机上进行了性能测试,结果显示我们的GPU求解器在不同分辨率的Mesh上平均有3-5倍的性能提升。
解决穿插问题的新约束
在实时环境中,由于性能的限制,传统的离线方法(如CCD BVH、Impact Zone等)不再适用。因此,我们引入了两种新的约束来减少需要解决的穿插数量。这些约束的引入不仅提高了模拟的稳定性,还有效降低了计算复杂度,使得实时布料模拟更加高效。
总结
通过在Evolution阶段的优化和新约束的引入,我们的GPU求解器在性能和效果上都取得了显著提升。未来,我们将继续探索更多的优化方案,以进一步提高布料模拟的质量和效率。
多层布料约束的介绍
在现代游戏中,多层布料的使用能够显著提升角色的表现力和视觉质量。然而,现有引擎对多层布料效果的支持相对有限。为了解决这一问题,我们提出了Multi Layer约束,这是一种基于位置约束动态(PBD)的简单约束方法,旨在限制不同层次布料之间的穿插。
一、Multi Layer约束的核心思想
Multi Layer约束的基本思路是,当我们有一层蓝色的下层布料和一层红色的上层布料时,我们会为上层布料的每个顶点(pu点)计算其在下层布料mesh上的最近点。通过这一过程,我们能够找到离pu最近的三个三角形(pd0, pd1, pd2)及其对应的重心坐标。
接下来,我们根据这些信息为pu点计算一个限制运动范围的黄色球体。在模拟过程中,我们会限制pu点始终在这个黄色球体内运动,从而有效减少布料之间的穿插现象。
二、约束的实现与效果
在实现过程中,我们使用了每帧受动画影响的mesh顶点位置的信息。以下是加入与不加入Multi Layer约束的效果对比:
- 未加入约束:右侧的布料层之间穿插现象明显。
- 加入约束:左侧的布料层之间穿插现象显著减少。
为了便于调试和配置,我们在编辑器中添加了一些配置参数,允许用户控制Multi Layer约束的生成和求解。此外,我们还提供了可视化工具,帮助用户直观地查看上层顶点的运动限制范围(黄色球体)。
三、编辑器功能的扩展
为了更好地支持多层布料的编辑和调试,我们在编辑器中添加了一种新的brush和mask功能,用于区分和存储不同层的点信息。具体使用步骤如下:
- 创建自定义mask:为两层mesh创建一个mask。
- 定义权重:为两层mesh分别定义不同的权重。
- 使用brush绘制:使用自定义的brush分别对上层和下层进行绘制。
在退出绘制模式后,代码会自动生成相应的约束信息。
角色与布料的碰撞约束
在游戏中,角色的动作可能会导致布料与角色身体之间的穿插。为了解决这一问题,我们引入了另一种PBD约束,旨在限制布料顶点的运动范围。
一、碰撞约束的核心思想
当布料mesh上的点P可能与角色的碰撞体发生穿插时,我们会为点P创建一个与碰撞体相关的平面,并限制点P始终在该平面的法向n的一侧运动。整个游戏运行过程中,我们会根据动画动态调整平面的信息,以确保点P始终保持在法向n的一侧,从而减少穿插现象。
二、约束效果的展示
通过视频展示,我们可以看到在相同风力影响下,未加入约束的布料(左侧)明显穿透了角色的胳膊,而加入约束的布料(右侧)则能够很好地保持与胳膊的碰撞。
同样,我们为这一约束添加了配置参数和可视化工具,方便用户调试和定位问题。我们展示了一个点的约束信息,包括与之约束的碰撞体的平面及对应的法向。
三、编辑器中的新mask功能
我们还添加了一种新的mask,用于选择Physics Asset上哪些碰撞体与mesh上的哪些点产生约束。这种方式不仅方便美术配置,还能减少待求解的约束数量。使用步骤如下:
- 新建mask:创建一个新的mask。
- 选择碰撞体:选择需要生成约束的碰撞体。
- 选择顶点:使用UE默认的brush选择需要生成约束的顶点。
在退出绘制模式后,代码会自动生成约束信息。
总结
通过引入Multi Layer约束和碰撞约束,我们显著提升了布料模拟的效果,减少了布料之间以及布料与角色身体之间的穿插现象。同时,开发的GPU并行模拟求解器在性能上也实现了3-5倍的提升。这些改进不仅增强了角色的表现力,也提升了整体游戏的视觉质量。
在我们的Proxy Mesh自动生成管线中,主要目标是简化和优化从Visual Mesh到Proxy Mesh的转换过程,以提高效率并确保模拟效果。以下是该管线的详细介绍:
1. Proxy Mesh的自动生成
1.1 减面技术
Proxy Mesh的生成核心在于对输入的Visual Mesh进行有效的减面,同时保持其大形状特征。我们采用了Instant Field-Aligned Meshes(IFAM)技术,这种方法相较于传统的减面算法(如基于Quadric Error Metric的渐进边折叠方法)具有更好的面片质量。
- 传统方法的局限性:如QEM和VSA方法虽然能减少面数,但生成的面片大小和形状不一,导致模拟效果差。
- IFAM的优势:通过优化全局平滑的方向场和参数化位置场,IFAM能够生成更均匀的三角形网格,确保每个面尽量接近等边三角形,从而提高模拟效果。
1.2 控制输出点数量
在生成Proxy Mesh时,我们可以根据需要控制输出点的数量。例如,可以生成931、302或213个点的模型。需要注意的是,游戏引擎中支持的最大点数为256,因此在制作Proxy Mesh时必须严格控制点的数量,以确保兼容性。
2. 蒙皮权重的自动计算
在生成Proxy Mesh后,接下来的步骤是计算蒙皮权重,以确保Visual Mesh的每个点能够被正确驱动。我们开发了一套自动化的权重计算方法,能够根据Proxy Mesh的结构和Visual Mesh的形状,快速生成合理的权重分配。
3. Visual Mesh与Proxy Mesh的映射关系
为了实现有效的驱动,我们需要建立Visual Mesh与Proxy Mesh之间的映射关系。这一过程确保了在模拟过程中,Visual Mesh的每个点都能准确地受到Proxy Mesh的影响,从而保持良好的形态。
4. 总结
通过以上的自动生成管线,我们能够显著提高Proxy Mesh的制作效率,减少人工干预,同时确保生成的Proxy Mesh在模拟时能够保持良好的效果。这一管线的实施,不仅优化了工作流程,还为后续的动画和渲染提供了更为可靠的基础。对于感兴趣的技术细节,建议参考相关文献,以深入了解IFAM等技术的实现原理。