Q100418:通过使用 VectorBlur 作为 ScanlineRender 的替代方案来改善 3D 运动模糊的运动模糊渲染时间

关注

概括

Nuke中增加 3D 对象运动模糊的标准方法是增加 ScanlineRender 节点内的样本。这些样本值控制用于计算帧之间的内插数据量。因此,样本值越大,运动模糊就会变得越详细。

增加这些样本值将显着增加图像处理时间,这可能会影响更复杂项目的性能。

为了避免这种处理开销,作为替代方案,您可以在 ScanlineRender 节点本身之外处理此计算。这可以通过在 VectorBlur 节点中使用 ScanlineRender 节点生成的运动矢量来实现。

本文介绍了如何使用 VectorBlur 节点(VectorBlur2 迭代)创建工作流程,还包括示例场景。

更多信息

默认情况下,ScanlineRender 节点从Nuke中的 3D 对象生成运动矢量通道。运动矢量通道本身将位置信息存储为图层的红色和绿色通道内的数值。这些通道的值并不代表预期的颜色,但Nuke使用这些值来确定镜头中移动物体的方向、速度和位置的变化。

ScanlineRender 节点内的运动矢量信息默认存储在前层中,但也可以存储在运动层或自定义创建的层中。

然后可以将正在生成的运动矢量信息读入 VectorBlur 节点,以实现更快的图像处理水平。该过程就像将uv 通道源定义为从 ScanlineRender 节点生成的图层一样简单。有多个预设选项,但我们建议使用Nuke ScanlineRender 预设以获得最佳效果。

此工作流程有几个优点:

1)由于VectorBlur节点可以选择使用GPU进行处理,如果您的机器符合我们推荐的GPU加速规格,那么这个过程将非常高效。

有关我们建议的 GPU 加速最低规格的更多信息,请参阅以下链接: Nuke系统要求

2) VectorBlur 节点仅通过 u 和 v 值解释基于 2D 的信息,这反过来又减少了所需的处理量。

3) 由于 VectorBlur 节点和运动矢量计算位于 ScanlineRender 节点之外,因此可以通过禁用 VectorBlur 节点本身来轻松禁用运动模糊。

4) 运动矢量计算可以渲染为 2D 数据并读回到Nuke中,然后用于完全避免之前通过 3D 场景进行的任何处理。

下面是一个示例工作流程,其中包含重新创建此流程的步骤列表。

工作流程示例

这个过程需要两个阶段。第一阶段是在 ScanlineRender 节点中正确创建运动矢量通道,第二阶段是将这些运动矢量通道正确集成到 VectorBlur 节点中。

第一阶段:扫描线渲染

1)创建一个CheckerBoard节点用作3D对象的Shader

2) 创建一个球体节点,在平移 x上将关键帧设置为“-2”值,并在第 10 帧上将另一个关键帧设置为“2”值。(这将用于在 3D 空间中为球体设置动画并创建基础运动模糊)

帧 1 帧 10

框架1.PNG框架10.PNG

3)将Sphere节点的img输入连接到CheckerBoard节点

4) 创建一个Camera 节点并将平移z值设置为“10”。 (这将在 3D 空间中构建球体)

5) 创建一个 ScanlineRender 节点,并将 Camera [3D Classic] 节点连接到cam输入,将 Sphere 节点连接到obj/scn输入。

6) 在 ScanlineRender 中,确保 MultiSample 选项卡中的样本值旋钮设置为“1”

7) 还要确保“着色器”选项卡的运动矢量旋钮设置为“距离”,运动矢量通道设置为“向前”。

Screen_Shot_2018-06-22_at_5.15.58_PM.png

第 2 阶段:矢量模糊

1)创建一个VectorBlur节点并将输入连接到ScanlineRender节点

2) 改变uv 通道旋钮并设置为“向前”层

3) 确保mv 预设旋钮设置为“ Nuke ScanlineRender”

4) 更改模糊 uv旋钮并将其设置为“线性”。 (如果保留默认值,则会在边缘上产生不正确的插值)

5) 改变运动量旋钮并设置为您想要的运动模糊量。

6) 将运动衰减旋钮更改为值“ 0.2 ”。 (此控件可用于根据预期插值来控制衰减)

7) 按照此示例,如果 ScanlineRender 节点的输出为黑色并使用边界框仅计算图像本身的面积,则需要将扩展模糊 bbox旋钮更改为允许边界框的值不剪切图像。

此大小将根据您的输入图像而有所不同,在我的示例中,我使用的值为“ 50 ”。

您可以在下面看到不同值的比较:

扩展模糊 bbox = 0扩展模糊 bbox = 50

bbox_0.PNGbbox_50.PNG

注意:上述工作流程也在附加脚本中重新创建: Alternative3DMotionBlur.nk

结果对比测试

作为示例,您可以在附件中找到原始流程与 VectorBlur 建议的替代流程之间比较的屏幕录制: Alternative3DMotionBlur_comparison.mp4。

此外,我们还添加了比较测试,允许您在以下附加脚本中自行运行此测试: Alternative3DMotionBlur.nk

下面是来自上述记录的两个比较图像,显示在比较 25 帧渲染时通过 VectorBlur 节点生成的运动模糊明显更快:

矢量模糊

矢量模糊.jpg

扫描线渲染

扫描线.jpg

注意: ScanlineRender 节点中的运动模糊样本已尽可能紧密地匹配,使用实现相同结果所需的最少量样本。

从上面的比较中您可以看到,在 VectorBlur 节点中使用运动矢量作为增加 ScanlineRender 节点样本的替代方法,可以减少所需的处理量。这在较大且复杂的基于 3D 渲染的脚本中会更加明显。

注意:此过程也可以使用 RayRender 节点而不是 ScanlineRender 节点来实现。需要更改 RayRender 节点“AOV”选项卡中的以下选项才能正常工作:

光线渲染.PNG '

1) 需要打开输出 AOV复选框

2) 需要设置运动矢量通道以输出正确的层,在我们的示例中是从“前向”层上方输出。

延伸阅读

有关 VectorBlur 和 ScanlineRender 节点的更多信息可以通过以下Nuke文档链接找到:

矢量模糊节点
扫描线渲染节点

我们很遗憾听到

请告诉我们