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

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

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。若要在使用编辑器时设置初始值,在蓝图中使用材质指定到的网格体构造脚本即可进行操作。

Select Skin
Light
Dark

Welcome to the new Unreal Engine 4 Documentation site!

We're working on lots of new features including a feedback system so you can tell us how we are doing. It's not quite ready for use in the wild yet, so head over to the Documentation Feedback forum to tell us about this page or call out any issues you are encountering in the meantime.

We'll be sure to let you know when the new system is up and running.

Post Feedback