创建支持服务单
关注

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

摘要

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

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

有关LiveRendering一般说明 ,请在“ 渲染类型”的“Katana在线帮助”部分中找到对它的说明,以及“执行渲染”的“ 启动和停止实时渲染”子部分以及“ 控制实时渲染 ”部分。

可以在Katana在线帮助的“ 渲染器插件”部分中找到有关渲染器插件的其他部分的详细说明,以及RenderAPI的其他与LiveRendering无直接关系的功能的文档。

更多信息

属性公约

Katana的实时渲染系统由场景图中的属性提供支持。在效率名称中,只有更新渲染器所需的属性才会发送到渲染插件。有一个属性约定来确定它们是哪些属性,如下所示:

liveRender。 <updateGroup> <的attributeName>

<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)的std :: pair对象,以及op参数(作为GroupAttribute)。

例如,下面的代码监视 / 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

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

OpArgs

- attributeNames (StringAttribute) - 应该监视属性的名称以进行更改,并在每次更改时将其作为单个更新发送到呈现插件。

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

- exclusions (StringAttribute) - (可选)排除的位置类型列表,此op不应运行。

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

- type (StringAttribute) - (可选)如果设置,则op将仅在此类型的位置运行。

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

LiveAttribute

此操作存储操作期间查看器操纵器生成的值(而不是等待操作完成并且参数已完成)。此op是一个特殊情况,由Live Rendering模块专门查找。

OpArgs

此op的args由Live Render系统自动设置,不应手动设置。

LocalizeXform

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

OpArgs

- excludeCel (StringAttribute) - 描述op不应该应用于的场景图位置的CEL表达式。

- addMaterialHash (IntAttribute) - (可选)旧版本实时渲染的旧版行为。如果非零,则'material'属性的散列值将存储为'materialHash'。

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

LocalizeLiveAttributeXform

在观察者操作期间,该位置的实际xform属性不会改变(直到竖起)。相反,LiveAttribute op用于在liveAttributes.xform下存储临时xform。这个操作类似于localizeXform,但是知道这个liveAttribute约定,所以如果liveAttributes.xform将被使用而不是xform(如果它存在)。这允许在操作期间更新位置xform。当然,必须在LiveAttribute操作之后应用此操作。

OpArgs

- addMaterialHash (IntAttribute) - (可选)旧版本实时渲染的旧版行为。如果非零,则'material'属性的散列值将存储为'materialHash'。

LocalizeLightListLiveRenderFilter

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

OpArgs

- attributeNames (StringAttribute) - 应该监视属性的名称以进行更改,并在每次更改时将其作为单个更新发送到呈现插件。

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

- exclusions (StringAttribute) - (可选)排除的位置类型列表,此op不应运行。

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

- type (StringAttribute) - (可选)如果设置,则op将仅在此类型的位置运行。

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

CoordinateSystemLiveRenderFilter

这是标准LiveRenderFilter op的另一个专业化。它适用于坐标系。它的行为与LiveRenderFilter操作相同,不同之处在于它首先检查当前位置是否在/ root / world /的globals.coordinatesystems属性中列出,如果为真,则仅继续执行。

OpArgs

- attributeNames (StringAttribute) - 应该监视属性的名称以进行更改,并在每次更改时将其作为单个更新发送到呈现插件。

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

- exclusions (StringAttribute) - (可选)排除的位置类型列表,此op不应运行。

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

- type (StringAttribute) - (可选)如果设置,则op将仅在此类型的位置运行。

- 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 - 此更新所针对的场景图形位置。
  • attributes - 已更改属性的值。请注意,如果该位置已被删除,则将包含名为 deleted 的属性

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

 bool  hasPendingDataUpdates() 

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

 int  applyPendingDataUpdates()  

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

Python实用程序

Katana的用户界面有几个实用工具可帮助改善实时渲染体验,如下所示:

LiveRenderAPI

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

LiveRenderActions

通过使用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来获取其他信息。

这篇文章有帮助吗?
/

We're sorry to hear that!

Please tell us why.
0 人中有 0 人觉得有帮助

评论