在材质中逐基元存储自定义数据

使用自定义基元数据工作流,逐基元存储自定义数据,并可通过蓝图访问此类自定义数据的概述。

Choose your operating system:

Windows

macOS

Linux

使用 自定义基元数据 (CPD)工作流时,利用材质将自定义数据存储在可通过蓝图和代码访问的索引数组中,以影响场景基元的修改。其功能与 动态材质实例 类似,可用于在运行时通过标量和向量参数动态控制材质图表的各部分。区别在于,CPD的优势是将数据存储在基元自身而非材质实例上,减少了关卡中类似几何体(如墙壁、地板或其他重复几何体)的绘制调用次数。

使用和工作流

自定义基元数据可通过以下方式用于场景基元:

  1. 设置标量和向量材质参数,控制材质逻辑的各部分。对要动态设置和控制的参数,启用 使用自定义基元数据(Use Custom Primitive Data)

  2. 对于已设置此选项的参数,向其指定可在蓝图或代码中引用的唯一 基元数据索引

  3. 使用蓝图中的 Set Custom Primitive Data 节点设置和控制自定义数据数组中存储值的材质参数。

材质使用

使用 标量(Scalar) 向量参数(Vector Parameter) 表达式控制材质图表的各部分,与驱动 材质实例中材质可控部分 的方式类似。选择参数后,使用 细节(Details) 面板启用该表达式的 使用自定义基元数据(Use Custom Primitive Data)

ParameterComparisons.png

左侧:默认标量和向量参数表达式;右侧:启用自定义基元数据的标量和向量参数。

启用后参数在其给定命名下显示"自定义基元数据",并在数组中显示指定指数。

CPD_NodeDisplay.png

基元数据索引(Primitive Data Index) 值会设置存储此参数的指定索引。此索引用于蓝图和代码中的引用。

在标量(浮点)参数上设置索引时,该索引为使用的索引。在向量参数上进行相同操作时,将在所有输出上设置浮点值,共有四个输出。例如,在向量参数上将基元数据索引设为0,将向索引0、1、2和3指定浮点值;所有RGBA输出各指定一个。

蓝图使用

通过蓝图并使用以下节点访问场景基元,即使用自定义基元数据:

  • Set Custom Primitive Data Float

  • Set Custom Primitive Data Vector

此类节点无需字符串与参数命名匹配。相反,其使用指定 基元数据索引(Primitive Data Index) 逐基元设置和获取数组中的数据。

CPD_BP_Workflow.png

在材质内访问该数组中的自定义数据,与使用材质实例中的材质参数类似。区别在于,在参数节点上的材质中,参数必须为匹配字符串的统一参数,而非匹配数字的索引。

Actor默认值使用

使用 细节(Details) 面板为场景基元设置自定义基元数据的默认值,将数组元素添加至 自定义基元数据(Custom Primitive Data) 数组中。

CDP_Defaults.png

各个编号数组元素都引用具有对应值的自定义基元数据索引。若数组元素不存在索引,则其将被忽略。若要手动调整某些值,但不附加蓝图或不创建材质实例来加以控制,则非常适合使用此方法设置默认值。

范例设置和比较

以下范例展示了使用多个(标量和向量)参数驱动的简单材质,在向量参数中随机选择颜色,并通过图表中的材质逻辑设置场景中网格体的发射率和对象范围。蓝图用于驱动已存储自定义数据的此类参数。

材质范例设置

对于材质设置,已在材质图表中的选定参数上启用 使用自定义基元数据(Use Custom Primitive Data)

点击查看大图。

底色(Base Color) 自发光(Emissive) 强度由两个参数驱动:名为"颜色参数"的向量4参数和名为"自发光功率"的标量参数。

点击查看大图。

此图表的第二部分使用逻辑统一缩放其在关卡中指定的网格体。名为"Scale_XYZ"的标量参数控制指定对象的缩放量:

点击查看大图。

蓝图范例设置

利用参数上的自定义数据(如MID),可在运行时使用蓝图或代码完成更改。下图展示了在此类材质参数中设置并保存值,以设置随机颜色、其发射率及游戏会话开始时的初始缩放。

点击查看大图。

在Event BeginPlay上,在蓝图中使用 Set Custom Primitive Data 节点初始化两个CPD参数的颜色和缩放值。

点击查看大图。

两个Set节点上的 数据索引 使用材质中的相同 基元数据索引 初始化材质参数。

CDP_BPNodes_To_Material.png

在Event Tick上,Set节点引用CPD参数的基元数据索引,并基于Delay节点各tick设置的随机时间,设置新的颜色和自发光强度。XYZ的随机浮点值(在材质的向量参数表达式中转换为RGB值)范围将设置颜色。同时使用浮点值的界定范围设置自发光强度。

点击查看大图。

设置和使用Event Tick时需谨慎。出于本次演示目的,建议采用快速测试和调试,但运行时不适合持续使用。

范例结果

此例结果为一种采用受蓝图控制CPD参数的材质,其使用材质参数设置网格体的颜色、发射率和缩放。

本页对比了CPD的设置和使用,与 动态材质实例 类似。现在先对各操作所需材质和蓝图设置进行比较,便于理解:

材质设置仅需使用CPD的参数启用 使用自定义基元数据(Use Custom Primitive Data) ,并设置之后会在蓝图中引用的 基元数据索引 。对于MID,参数命名即是之后蓝图中所需全部内容。

Example_Parameters.png

Example_ParametersCPD.png

MID材质参数

自定义基元材质参数

现在来对比所需蓝图设置:

  • 动态材质实例工作流:

    点击查看大图。

    欲了解实例化材质的更多信息,参阅 实例化材质

  • 自定义基元数据工作流:

    点击查看大图。

除了需在蓝图中进行部分额外操作,该工作流较为类似。MID工作流需要 Create Dynamic Material Instance 节点和部分 Set Parameter Value 节点,此类节点将引用所需参数的匹配字符串 参数命名 (位于材质中)。

若运行时在关卡中对比这两种设置,视觉上是相同的。但由于CPD使用网格体绘制重构,因此拥有节省性能的优势。将在下章中详细介绍。

左侧:自定义基元数据工作流;右侧:动态材质实例工作流。

性能

对于使用自定义数据设置材质的关卡,CPD工作流可显著减少对该关卡中类似几何体的绘制调用。使用可自动动态实例化场景基元的 网格体绘制 重构,以减少绘制调用数。

要查看动态实例化在关卡中的效果,打开控制台(`)并输入命令 **stat scenerendering**。此命令可显示当前场景视图的一般渲染统计数据,建议从此入手,查找渲染过程中的一般低性能区域,以及场景中网格体绘制调用和光源数量的计数器。

CPD_StatSceneRendering.png

默认关卡场景渲染统计数据

在关卡视口中,点击 G 键切换游戏视图模式,或选择在编辑器中运行(PIE)或模拟,获得更准确的结果。若不使用此类选项,可将其他绘制调用应用于纯编辑器几何体,如定向光源的图标。

此范例场景将以地板网格体、背景天空球体网格体、以及在材质中使用自定义数据的复制网格体开始。

CPD_StatSceneRenderin2a.png

场景渲染统计数据会显示当前视图中注册的绘制调用数;共计14次。

CPD_StatSceneRenderin2.png

由于引擎会自动将绘制调用与网格体绘制规则动态结合,因此建议禁用动态实例化,观察其当前在此场景中的表现。可用以下命令禁用:

r.MeshDrawCommand.DynamicInstancing 0

注意:仅使用少许基元增加了 网格体绘制调用 的数量:

CPD_StatSceneRenderin3.png

要体现出更显著的差异,先多复制一些使用CPD的网格体;此例中有25个不同大小的球体。

CPD_StatSceneRenderin4.png

  • 禁用动态实例化后,有 94个网格体绘制调用 。由于MID并非像CPD那样实例化,因此可提供类似结果。

    CPD_StatSceneRenderin4a.png

  • 重新启用动态实例化,将显示 46个网格体绘制调用

    CPD_StatSceneRenderin4b.png

在材质中存储自定义数据并在关卡中使用类似几何体时,即可发现绘制调用的数量差异,即便使用如动态材质实例等其他方法也是如此。

其他说明

  • 浮点限制32

    • 在未来的版本中,我们会设法将此项目设置便为可配置设置。

  • 支持自定义基元数据参数的用户定义默认值和覆盖值

    • 目前,在材质中设置自定义基元数据参数时,默认值固定为0。若要在使用编辑器时设置初始值,在蓝图中使用材质指定到的网格体构造脚本即可进行操作。

欢迎帮助改进虚幻引擎文档!请告诉我们该如何更好地为您服务。
填写问卷调查
取消