Q100384: Katana で ExrCombine を使用してチャンネル / AOV をマージするとレンダリングが失敗する

症状

Katanaで複数の AOV をチャネルとして 1 つのマルチチャネル EXR ファイルにマージしようとすると、 Katanaが EXR イメージをマージするために使用するツールである ExrCombine に影響する OpenEXR の既知の制限により、レンダリングの失敗やエラーが発生する可能性があります。

エラーは次のようになります。

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 よりも小さい場合に、エラーが発生します。

この問題を解決するには、次のトラブルシューティング手順を試してください。

  • 「プライマリ」レンダリング出力が出力タイプ「raw」に設定されていることを確認するか、マージされた出力に「プライマリ」パスを含めないようにしてください。
  • マージするすべてのAOVが同じデータウィンドウ属性値を持つことを確認します
  • 「raw」出力タイプを使用してレンダリング後の EXR 最適化をバイパスするか、exrOptimize を無効にします。
  • Katanaタイル化された出力をマージできないため、レンダリングされた EXR がタイル化されていないことを確認してください。

それぞれの提案の詳細については、以下をお読みください。

Katana 、画像データを扱う際にデフォルトで 4 チャンネル (RGBA) のみを読み込んでレンダリングできます。ただし、 Katana内部ユーティリティ ExrCombine を使用することで、複数の画像を結合してマルチチャンネル EXR を作成できます。

ExrCombine ユーティリティは、OpenEXR では複数のチャンネルを 1 つの EXR ファイルに書き込む際に制限があるため、元々は同じサイズのピクセル データ ウィンドウを持つ画像を結合するために作成されました。

画像のピクセルデータウィンドウのサイズは、EXRヘッダー属性dataWindowに格納されます。EXRファイルには、この属性を1つしか含めることができません。つまり、すべてのチャンネル/AOVは同じdataWindow属性値を共有する必要があり、マージされたEXRファイル内でそれぞれの値を保持することはできません。

したがって、 Katana 、ピクセル データ ウィンドウ サイズが異なる画像の結合をサポートしていません。

選択したデータウィンドウ属性値が、マージされるすべてのAOVのデータウィンドウサイズをカバーしていない場合、レンダリングが失敗するか、 Katanaクラッシュする可能性があります。これは、ヘッダーに保存できるデータウィンドウが1つだけというOpenEXRの制限によるものです。つまり、すべてのチャンネル/AOVは同じデータウィンドウ属性値を共有する必要があり、マージされたEXR内でそれぞれの値を保持することはできません。そのため、 Katanaピクセルデータウィンドウサイズが異なる画像のマージをサポートしていません。

OpenEXRが同一ファイル内の複数のデータウィンドウヘッダー属性のサポートを拡張したことを受けて、 Katanaに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として使用されます

貼り付けた画像0.png

このスクリーンショットはRenderOutputDefineノードの例で、 mergeOutputsパラメータで最初に選択された入力が「primary」出力です。つまり、ExrCombineユーティリティによって作成される最終的なマージEXRでは、 「primary」パスのdataWindowヘッダー属性が使用されることになります。

このデータウィンドウヘッダー属性が、マージする残りのレンダリング出力のデータウィンドウよりも小さい場合、ExrCombine マージ プロセスが失敗し、上記のレンダリング エラーが発生する可能性があります。

Katanaの Cryptomatte に関する既知の問題

Cryptomatteは、各CryptomatteチャンネルのEXRヘッダー内のcryptomatte/foo/barに保存されているメタデータを使用します。ExrCombineはCryptomatteメタデータをマージしないため、マージされたEXRファイルはNukeでCryptomatteチャンネルを表示しません。Pixarのexrmergeは、最初のEXRのCryptomatteメタデータのみをコピーします。

注: Katana 4.5v6、 Katana 5.0v6 、およびKatana 6.0v3以降では、すべての Cryptomatte チャネルを 1 つの EXR ファイルに結合できるようになりました

回避策

この問題を解決するのに役立つ可能性のあるオプションがいくつかあります。

「プライマリ」レンダリング出力が出力タイプ「raw」に設定されていることを確認するか、マージされた出力に「プライマリ」パスを含めないようにしてください。

注:専用の RenderOutputDefine ノード経由で作成を要求するかどうかに関係なく、 Katana常にデフォルトで「プライマリ」パスを生成します。

「プライマリ」パスはmergeOutputsリストの最初のエントリとして追加され、追加のチャンネルはこれにマージされます。「プライマリ」パスのデータウィンドウが、マージするすべてのAOVのデータウィンドウサイズ全体をカバーしていない場合、マージ操作は失敗します。

これは、「プライマリ」パスの RenderOutputDefine ノードを追加し、タイプ パラメータを「raw」に設定することで解決できる場合があります

プライマリパスが不要な場合は、 RenderOutputDefineノードのmergeOutputsリストから明示的に無効にすることができます。リスト内の2番目のパスのデータウィンドウが、マージされたEXRに使用されます。上記のスクリーンショットの例では、 「プライマリ」が選択解除されている場合に使用されるデータウィンドウの値は、「拡散」パスから取得されます。

マージするすべての AOV が同じ dataWindow 属性値を持つことを確認します。

マージ対象となるすべてのAOVのデータウィンドウが同じサイズであれば、マージ操作は成功するはずです。そうでない場合は、最初にマージされる出力のdataWindow属性値が、他のすべての出力を包含するのに十分な大きさである必要があります。

マージ プロセスで AOV の順序を定義するときにこれを念頭に置くと、より広いデータウィンドウを小さなデータウィンドウに合わせようとすることによって発生する ExrCombine レンダリングの失敗を回避できます。

RenderOutputDefine ノードの設定を使用して AOV のデータ ウィンドウ サイズに影響を与える 2 つの方法を以下に説明します。

「raw」出力タイプとexrOptimize設定を使用して、レンダリング後のEXR最適化をバイパスします。

Katanaデフォルトでレンダリングされたカラー出力を後処理します。この内部的な 2D 画像処理では、EXR ヘッダー属性は保持されず、元の画像から後処理後の画像に関連属性がコピーされます。

これらの属性は、RenderOutputDefineノードのconvertSettingsパラメータで定義されます。これらの設定の詳細については、 KatanaリファレンスガイドのRenderOutputDefineをご覧ください

exrOptimizeパラメータを「No」に設定する

convertSettings.exrOptimizeパラメータは主に画像データ ウィンドウを最適化し、端の周囲のピクセル データのない領域を削除して画像を「シュリンクラップ」するために使用されます。

exrOptimizeCompare.png

exrOptimize をオンとオフにしてレンダリングした EXR 画像とメタデータの比較 ( Nukeで表示)

exrOptimizeフラグは主に画像データウィンドウを最適化し、エッジ周辺の冗長なクリア情報を削除することで画像を「シュリンクラップ」するために使用されます。exrOptimizeパラメータを「No」に設定すると、画像データウィンドウ全体がレンダリングされ、最適化ステップがスキップされ、元のデータウィンドウが強制的に使用されます。これにより、レンダリングされたAOV間でデータウィンドウ属性値が異なることが回避され、AOVのマージが成功する可能性があります

貼り付けた画像0__1_.png

exrOptimize 操作はタイル内の画像を処理するプログラムのメモリ使用量とパフォーマンスの向上を目的としているため、場合によっては、画像のサイズに応じて、画像の処理中のパフォーマンスがわずかに影響を受けることがあります。

レンダリング出力のタイプを「raw」に設定する

RenderOutputDefineノードのタイプを「raw」に設定すると、レンダラーから受信した画像をそのままレンダリングし、後処理を省略できます。Katana Katana出力に対して色変換や画像最適化を行いません。これにより、レンダラーによって定義されたヘッダー属性を使用してファイルが書き込まれるようになり、 Katana内部の画像処理によるデータウィンドウ属性の変更が防止されます。

貼り付けた画像0__2_.png

Katanaタイル化された出力をマージできないため、レンダリングされた EXR がタイル化されていないことを確認してください。

これはArnoldなどの一部のレンダラーのデフォルト設定です。レンダラー固有の出力定義ノード(ArnoldOutputChannelDefineなど)を確認し、 driverParameters.tiled設定が無効になっていることを確認してください。

助けを得る

これらの提案のいずれでも問題が解決しない場合は、サポート リクエストを発行し、発生している問題とこれまでに行ったトラブルシューティング手順について詳しくお知らせください。

サポートリクエストを開く方法の詳細については、次の記事を参照してください: Q100064: サポートチケットの発行方法

    私たちはそれを聞いて申し訳ございません

    理由をお聞かせください