Q100311:在渲染器插件中实现实时渲染

关注

概括

本文介绍了如何在渲染器插件中实现实时渲染,并涵盖以下主题:

  • 属性约定
  • RendererInfo 插件函数
  • 渲染插件功能
  • Python 实用程序
    - LiveRenderAPI
    -
    LiveRenderActions
    - 回调
  • 陷阱
    - 单采样更新
    - 非持久更新

有关LiveRendering 的一般说明,请在Katana用户指南》中的“渲染类型”部分中找到其说明,并参阅“执行渲染”中的“启动和停止实时渲染”子部分以及“控制实时渲染”部分。

有关渲染器插件其他部分的详细说明,以及与 LiveRendering 不直接相关的 RenderAPI 其他功能的文档,可以在Katana开发人员指南 的渲染器插件部分中找到。

更多信息

属性约定

Katana的实时渲染系统由场景图中的属性提供支持。以效率为名,仅将更新渲染器所需的属性发送到渲染插件。有一个属性约定来确定这些属性,如下所示:

实时渲染。 <更新组> <属性名称>

图片__3_.png

<updateGroup> - 这是一个 GroupAttribute,用于将属性分组到单个更新中。

<attributeName> - 这是要监视的顶级属性的名称。在上图中, liveRender.geoXform.xform属性指示实时渲染系统将任何更改发送到顶级xform属性。请注意,这是一个 StringAttribute,其值通常与 updateGroup 匹配这是出于遗留原因,但通常不在内部使用。如果在同一个更新组中指定了多个属性,则当其中任何一个属性发生更改时,它们都会被发送到渲染器。

RendererInfo 插件函数

void fillLiveRenderTerminalOps( OpDefinitionQueue & terminalOps ,
                              const FnAttribute::GroupAttribute& stateArgs )

虽然可以在节点图中设置上述属性约定,但使用 RendererInfo 插件中的fillLiveRenderTerminalOps()函数在实时渲染启动时自动设置属性通常更有用。该函数传递一个名为TerminalOps的参数,该参数是一个std::deque ,不包含或多个包含 op 类型(作为std::string )和 op 参数(作为GroupAttributestd::pair对象。

例如。下面的代码监视/root/world/lgt下面的灯光位置的xform属性的变化

 FnAttribute::GroupBuilder opArgs;
opArgs. set ( "type" , FnAttribute::StringAttribute( "light" ));
opArgs. set ( "location" , FnAttribute::StringAttribute( "/root/world/lgt" ));
opArgs. set ( "attributeNames" , FnAttribute::StringAttribute( "xform" ));
terminalOps.push_back( std ::make_pair( "LiveRenderFilter" , opArgs.build()));

Katana附带的几个Geolib3 Ops在这里很有用:

实时渲染过滤器

用于指示应监视哪些属性以进行实时渲染。多个属性可以由单个 LiveRenderFilter 进行监控,并且如果其中任何一个属性发生更改,则所有属性都将作为单个 GroupAttribute 发送。这是设置上述liveRender属性约定的标准方法。

操作参数

- attributeNames (StringAttribute) - 应监视属性名称的更改,并在更改时将其作为单个更新发送到渲染插件。

- location (StringAttribute) - 定义此操作应用的第一个位置的 CEL 表达式。然后它将应用于所有子位置。

-exclusions (StringAttribute) -(可选)排除的位置类型列表,其中不应运行此操作

- typeAlias (StringAttribute) - (可选)将发送到渲染插件的“type”属性的名称。如果未设置,将使用位置类型。

- type (StringAttribute) - (可选)如果设置,操作将仅在该类型的位置运行。

-collectUpstream (IntAttribute) -(可选)如果非零,则每个父位置处的每个受监视属性的值也将包含在实时渲染更新中

实时属性

该操作存储操作期间查看器操纵器生成的值(而不是等待操作完成和参数最终确定)。此操作是实时渲染模块专门寻找的特殊情况。

操作参数

此操作的参数由实时渲染系统自动设置,不应手动设置。

本地化Xform

将某个位置的 xforms 从其所有祖先的 xforms 展平为一个名为 xform.matrix 的世界空间矩阵。

操作参数

- exceptCel (StringAttribute) - 描述操作不应应用的场景图位置的 CEL 表达式。

- addMaterialHash (IntAttribute) - (可选)旧版本实时渲染的遗留行为。如果非零,“material”属性的哈希值将存储为“materialHash”。

- outputAttrName (StringAttribute) -(可选)用于存储新的本地 xform 属性的名称。默认为“xform”,覆盖现有属性。

本地化LiveAttributeXform

在查看器中进行操作期间,位置的实际 xform 属性不会更改(直到提笔为止)。相反,LiveAttribute op 用于将临时 xform 存储在 liveAttributes.xform 下。该操作的工作方式类似于 localizeXform,但了解此 liveAttribute 约定,因此如果 liveAttributes.xform 存在,则将使用 liveAttributes.xform 而不是 xform。这允许在操作过程中更新位置 xform。当然,这个操作必须在 LiveAttribute 操作之后应用。

操作参数

- addMaterialHash (IntAttribute) - (可选)旧版本实时渲染的遗留行为。如果非零,“material”属性的哈希值将存储为“materialHash”。

LocalizeLightListLiveRenderFilter

该操作是标准 LiveRenderFilter 操作的特化,专门用于灯光列表。它的行为与 LiveRenderFilter 操作类似,只是它将在每个位置创建有关 lightList 属性的附加信息。此信息包括灯光的路径、当前位置是否启用灯光链接以及是否在父位置启用灯光链接。此信息将作为“lightLink”更新发送到渲染插件。

操作参数

- attributeNames (StringAttribute) - 应监视属性名称的更改,并在更改时将其作为单个更新发送到渲染插件。

- location (StringAttribute) - 定义此操作应用的第一个位置的 CEL 表达式。然后它将应用于所有子位置。

-exclusions (StringAttribute) -(可选)排除的位置类型列表,其中不应运行此操作

- typeAlias (StringAttribute) - (可选)将发送到渲染插件的“type”属性的名称。如果未设置,将使用位置类型。

- type (StringAttribute) - (可选)如果设置,操作将仅在该类型的位置运行。

-collectUpstream (IntAttribute) -(可选)如果非零,则每个父位置处的每个受监视属性的值也将包含在实时渲染更新中

坐标系统实时渲染过滤器

这是标准 LiveRenderFilter 操作的另一个特化。它与坐标系一起使用。它的行为与 LiveRenderFilter 操作相同,只是它会首先检查当前位置是否在 /root/world/ 的 globals.coordinatesystems 属性中列出,并且只有在为真时才继续执行。

操作参数

- attributeNames (StringAttribute) - 应监视属性名称的更改,并在更改时将其作为单个更新发送到渲染插件。

- location (StringAttribute) - 定义此操作应用的第一个位置的 CEL 表达式。然后它将应用于所有子位置。

-exclusions (StringAttribute) -(可选)排除的位置类型列表,其中不应运行此操作

- typeAlias (StringAttribute) - (可选)将发送到渲染插件的“type”属性的名称。如果未设置,将使用位置类型。

- type (StringAttribute) - (可选)如果设置,操作将仅在该类型的位置运行。

-collectUpstream (IntAttribute) -(可选)如果非零,则每个父位置处的每个受监视属性的值也将包含在实时渲染更新中

渲染器插件功能

int startLiveEditing()
 int stopLiveEditing()

Katana调用这两个函数来通知您实时渲染何时处于活动状态以及应该更新位置

int processControlCommand( const std::string & command )

此函数是从Katana UI 到渲染插件的通信方法。 UI 可以通过 python LiveRenderAPI.SendCommand()函数以字符串形式发送命令,您可以在渲染插件中处理该命令以达到您想要的任何目的。

 int queueDataUpdates(FnAttribute::GroupAttribute updateAttribute)

当监控的属性发生变化时,它的新值将通过此函数传递给渲染插件。传递的属性将包含三个子属性:

  • type - 更新类型(这是上面属性约定部分列出的<updateGroup>
  • location - 此更新的场景图位置。
  • 属性- 已更改属性的值。请注意,如果该位置已被删除,这将包含一个名为deleted的属性

请注意,此函数是在专用线程中调用的,该线程专门用于接收实时渲染更新。

 bool hasPendingDataUpdates()

此函数告诉 renderboot 进程是否有应应用的已在queueDataUpdates()中排队的实时渲染更新。

 int applyPendingDataUpdates() 

该函数在主渲染线程中调用,并且应该获取任何排队的实时更新并实际应用它们。仅当hasPendingDataUpdates()返回 true 时才会调用它。

Python 实用程序

Katana的 UI 有几个实用程序可以帮助改善实时渲染体验,如下所示:

实时渲染API

此 API 允许您使用LiveRenderAPI.SendCommand()LiveRenderAPI.SendData()函数向正在运行的实时渲染发送自定义命令(字符串)或实时更新。它还具有各种函数来查询和修改实时渲染子系统正在使用的终端操作列表。这些终端操作用于确定位置何时更改,而不是导致当前场景图(由节点生成)发生更改。这实际上是一种更改在调用RendererInfo::fillLiveRenderTerminalOps()期间传递的操作的方法。

实时渲染动作

通过使用plugin_apis/python/BaseLiveRenderAction.py 中的类,可以使用您自己的自定义菜单项来扩展“渲染”>“实时渲染”菜单。只需从 BaseLiverRenderAction 类派生(该类本身从QtGui.QAction派生)并重写成员函数即可。然后,您的类可以使用Katana的任何 python API(包括 LiveRenderAPI),从而允许它向渲染插件发送自定义命令或更新。 LiveRenderActions 的实例应放置在 $KATANA_RESOURCES/UIPlugins 目录中,以确保它们仅在 UI 会话期间尝试加载。

回调

在向渲染插件发送实时更新或实时渲染命令之前, Katana将分别触发名为 onLiveRenderUpdate 或 onLiveRenderCommand 的回调。这些回调将传递将要传递给渲染插件的命令或更新属性。这主要用于监视目的,允许您检查传递给渲染插件的数据,但也可以通过引发异常来阻止发送消息。然而,这将在Katana的消息日志中触发错误消息。

陷阱

单次采样更新

当渲染开始时,geolib 会生成多采样属性以允许运动模糊等。但是在Katana UI 中,通常仅使用单个样本检索属性,并且实时渲染更新来自Katana UI。这意味着实时更新期间发送的属性通常只有一个时间样本。

非持久更新

当渲染开始时,用于生成场景的操作树由Katana写入磁盘并由渲染进程读取,渲染进程使用自己的 Geolib3 运行时。渲染插件可以访问 SceneGraphIterator 来查询场景图及其属性。然而这一幕却是一成不变的。当从Katana传递实时渲染更新时,它无法更新 Geolib3 运行时。这意味着 SceneGraphIterators 将始终返回原始场景,即使渲染插件已收到实时更新。因此,要求实时更新属性包含渲染插件所需的所有信息,因为您无法安全地使用 SceneGraphIterator 来获取其他信息。

    我们很遗憾听到

    请告诉我们