Q100384:在 Katana 中使用 ExrCombine 合并通道/AOV 时渲染失败

症状

Katana中尝试将多个 AOV 作为通道合并到一个多通道 EXR 文件中时,由于 OpenEXR 的一个已知限制, Katana用于合并 EXR 图像的工具 ExrCombine 可能会出现渲染失败和错误。

错误可能如下所示:

Running command: ExrCombine
/tmp/ katana _tmpdir_7664/sphere_diffuse5_Render_primary_rgba_square_512_linear.1.exr primary
/tmp/ katana _tmpdir_7664/sphere_diffuse5_Render_direct_diffuse_direct_diffuse_square_512_linear.1.exr direct_diffuse
/tmp/ katana _tmpdir_7664/sphere_diffuse5_Render_sss_sss_square_512_linear.1.exr
sss /tmp/merge.exr
Render stopped by signal: 6
CommandLineRender Error: doRender problem
Reason = Render stopped by signal: 6
Render error. Time elapsed: 6.33 s
Node 'Render': Render failed with a rendering error: Render stopped by signal: 6

渲染失败甚至可能导致Katana崩溃,并在堆栈跟踪中出现以下错误:

[INFO python.MainBatch]: *** Error in 'ExrCombine': free(): invalid pointer: 0x0000000000e8f1e0 ***

原因

当尝试合并具有不同数据窗口的图像时,ExrCombine 实用程序会失败。

这意味着,如果要合并的 EXR 图像的dataWindow标头属性不匹配,则会发生错误,尤其是当第一个合并的 AOV 的像素数据窗口比后续合并的 AOV 的像素数据窗口小时。

为解决此问题,请尝试以下故障排除步骤:

  • 确保将“主”渲染输出设置为“原始”输出类型,或者不要将“主”通道包含在合并输出中。
  • 确保所有要合并的 AOV 都具有相同的 dataWindow 属性值
  • 通过使用“raw”输出类型和/或禁用exrOptimize来绕过渲染后的EXR优化。
  • 请确保渲染的 EXR 文件不是分块的,因为Katana无法合并分块的输出。

请继续阅读,了解每项建议的详细信息。

默认情况下, Katana在处理图像数据时只能读取和渲染四个通道(RGBA)。但是,用户可以通过Katana内置的名为 ExrCombine 的工具合并多个图像,从而创建多通道 EXR 文件。

ExrCombine 工具最初是为合并像素数据窗口大小相同的图像而创建的,因为 OpenEXR 在将多个通道写入单个 EXR 文件时存在局限性:

图像像素数据窗口的大小存储在dataWindow EXR 文件头属性中,一个 EXR 文件只能包含一个这样的属性。这意味着每个通道/AOV 必须共享相同的dataWindow属性值,并且在合并后的 EXR 文件中无法保留各自的值。

因此, Katana不支持合并像素数据窗口大小不同的图像。

如果所选的dataWindow属性值无法涵盖所有待合并 AOV 的数据窗口大小,则渲染将失败,甚至Katana可能崩溃。这是由于 OpenEXR 的限制,其头部信息中只能存储一个数据窗口。这意味着每个通道/AOV 必须共享相同的dataWindow属性值,而无法在合并后的 EXR 文件中保留各自的值。因此, Katana不支持合并具有不同像素数据窗口大小的图像。

目前已有一个针对Katana的功能请求,希望在 OpenEXR 提供对同一文件中多个数据窗口头部属性的扩展支持后,改进 ExrCombine 的功能。该请求已记录为: ID 75636 - ExrCombine:更好地支持具有不同像素数据窗口的图像

请继续阅读以了解更多信息,以及上面建议的解决方法详情,这些解决方法应该可以解决合并问题,具体取决于您的多通道设置。


更多信息

EXR 数据窗口
每个 OpenEXR 文件都通过文件头中的属性列表进行描述。对示例 .exr 文件运行类似“exrinfo”的命令,将输出这些属性的值,如下所示:

> exrinfo image.exr

例如,image.exr 的属性如下所示:

file format version: 2, flags 0x0
channels (type chlist):
B, 16-bit floating-point, sampling 1 1
G, 16-bit floating-point, sampling 1 1
R, 16-bit floating-point, sampling 1 1
compression (type compression): piz
dataWindow (type box2i): (0 0) - (511 511 )
displayWindow (type box2i): (135 125) - (377 409)
lineOrder (type lineOrder): increasing y
pixelAspectRatio (type float): 1
screenWindowCenter (type v2f): (0 0)
screenWindowWidth (type float): 1 

在这种情况下, dataWindow属性的值为(0 0) - (511 511) ,这意味着图像文件中存储了 512x512 像素。

displayWindow描述了查看图像时显示的图像区域。该区域可能大于或小于 OpenEXR 文件中数据所在的区域。

Katana中定义“合并”输出的数据窗口

当使用类型为“合并”的渲染输出将具有不同数据窗口的图像合并时, RenderOutputDefine 节点的mergeOutputs参数下拉列表中第一个选定输入的dataWindow属性值将用作最终输出的dataWindow

pasted_image_0.png

在此示例 RenderOutputDefine 节点的屏幕截图中, mergeOutputs参数的第一个选定输入是“主”输出。这意味着对于 ExrCombine 工具创建的最终合并 EXR 文件,将使用“主”通道的dataWindow标头属性。

如果此数据窗口标头属性小于要合并的其他渲染输出的数据窗口,则 ExrCombine 合并过程可能会失败,从而触发上面提到的渲染错误。

Katana中 Cryptomatte 的已知问题

Cryptomatte 使用存储在 EXR 文件头中cryptomatte/foo/bar目录下的元数据,每个 cryptomatte 通道对应一个 EXR 文件。ExrCombine 不会合并 cryptomatte 元数据,因此合并后的 EXR 文件在Nuke中无法显示 cryptomatte 通道。Pixar 的 exrmerge 函数仅复制第一个 EXR 文件的 cryptomatte 元数据。

注意:Katana 4.5v6、 Katana 5.0v6Katana 6.0v3开始,您现在应该能够将所有 Cryptomatte 通道合并到一个 EXR 文件中

变通方法

有几种方法或许可以帮助解决这个问题。

确保将“主”渲染输出设置为“原始”输出类型,或者不要将“主”通道包含在合并输出中。

注意:无论您是否通过专用的 RenderOutputDefine 节点请求创建, Katana默认都会生成一个“主”通道。

“主通道”将作为第一个条目添加到 mergeOutputs 列表中,任何其他通道都将合并到其中。如果“主通道”的数据窗口未包含所有要合并的 AOV 的总数据窗口大小,则合并操作将失败。

有时可以通过为“主要”通道添加 RenderOutputDefine 节点并将 type 参数设置为“raw”来解决此问题

如果您不需要主渲染通道,则可以在 RenderOutputDefine 节点的 mergeOutputs 列表中显式禁用它。列表中第二个渲染通道的 dataWindow 将用于合并后的 EXR 文件。在上面的示例屏幕截图中,如果取消选择“primary”,则使用的dataWindow值将来自“diffuse”渲染通道。

确保所有要合并的 AOV 都具有相同的 dataWindow 属性值。

当所有待合并的AOV的数据窗口大小相同时,合并操作应该会成功。或者,首先合并的输出需要具有足够大的dataWindow属性值,以包含所有其他输出。

如果在合并过程中定义 AOV 的顺序时牢记这一点,就可以避免由于试图将更宽的数据窗口放入更小的数据窗口中而导致的 ExrCombine 渲染失败。

下面介绍两种使用 RenderOutputDefine 节点上的设置来影响 AOV 数据窗口大小的方法:

通过使用“raw”输出类型和exrOptimize设置来绕过渲染后的EXR优化。

默认情况下, Katana会对渲染后的彩色输出进行后处理。这种内部 2D 图像处理不会保留 EXR 头部属性,而是将相关属性从原始图像复制到后处理后的图像。

这些属性是通过 RenderOutputDefine 节点的convertSettings参数定义的。有关这些设置的更多信息,请参阅Katana参考指南 - RenderOutputDefine

将 exrOptimize 参数设置为“否”

convertSettings.exrOptimize参数主要用于优化图像数据窗口,并通过去除边缘周围没有像素数据的区域来“收缩”图像

exrOptimizeCompare.png

比较开启和关闭 exrOptimize 功能后渲染的 EXR 图像和元数据(在Nuke中查看)

exrOptimize 标志主要用于优化图像数据窗口,并通过移除边缘周围冗余的清晰信息来“收缩”图像。将exrOptimize参数设置为“No”将渲染整个图像数据窗口,跳过优化步骤,强制使用原始数据窗口。这可以避免渲染的 AOV 中出现不同的dataWindow属性值,从而使它们能够成功合并

pasted_image_0__1_.png

在某些情况下,处理图像时的性能可能会受到轻微影响,具体取决于图像的大小,因为 exrOptimize 操作旨在提高以图块形式处理图像的程序的内存使用率和性能。

将渲染输出类型设置为“raw”

将 RenderOutputDefine 节点的类型设置为“raw”将允许渲染器直接渲染接收到的图像,并绕过任何后处理步骤。Katana 不会对输出执行任何颜色转换或图像优化。这确保文件将使用渲染器定义的头部属性写入,并防止Katana的内部图像处理导致 dataWindow 属性Katana任何更改。

pasted_image_0__2_.png

请确保渲染的 EXR 文件不是分块的,因为Katana无法合并分块的输出。

这是某些渲染器(例如 Arnold)的默认设置。请检查渲染器特定的输出定义节点,例如 ArnoldOutputChannelDefine,并确保driverParameters.tiled设置已禁用。

寻求帮助

如果以上建议均无法解决问题,请提交支持请求,并告知我们您遇到的问题以及您目前已采取的故障排除步骤。

如需了解如何提交支持请求,请参阅文章: Q100064:如何提交支持工单

    我们很遗憾听到

    请告诉我们