toruのブログ

月1くらいで記事書きたい。

OpenColorIO v2 を Nuke 13.1 で試す

0. 更新履歴

日付 (YYYY/MM/DD) 内容
2022/1/16 新規作成
2024/1/11 4.2.2 の Built-in Transform の一覧を更新

1. 背景と目的

  • 以前から OpenColorIO v2 (以後 OCIO v2 と略す) を試したいと考えていた
  • Nuke が 13.1 で OCIO v2 をサポートした[1]
  • そこで OCIO v2 の設定ファイルである config.ocio を自分で書いて挙動を確認することにした

2. おことわり

本記事は筆者の備忘録として書いてあります。本記事は OCIO v2 の概要の理解を目的としており、色変換の方法に関する具体的な説明は殆どありません(数式は全く出てきません)。
加えて記事内容の簡略化のために「ACES ワークフロー」に関する内容は極力除外しています(※1)。ご了承下さい。

※1 OCIO v2 の用語ACES の用語 の両方が登場すると混沌とするので、本記事では OCIO の用語しか使わないように注意しました(それでも少し ACES の用語が出てきますが…)。

3. 結論

  • OCIO v2 の config.ocio の作成に成功した

    • Nuke 13.1 を使って意図通りの変換となることを確認した
    • v2 の config.ocio は v1 と比較すると非常に書きやすくなったと考える
  • OCIO v2 に関して以下を理解した

    • OCIO v2 には 4つの色空間が存在する
      • color space
      • scene reference space
      • display reference space
      • display color space
    • config.ocio は この 4つの色空間の変換方法を定義する
    • display reference space と display color space は v2 で登場した新しい概念である
    • scene reference space から display reference space への変換を View Transform と呼ぶ
  • 作成した config.ocio +α を以下で公開する。中身は config.ocio、確認用テストパターン、3DLUT である

drive.google.com

4. 詳細

以下で筆者が理解した内容の詳細を書いていく。 始めに OCIO v2 の処理の概要をブロック図を使って説明する。 その後に、各ブロックの処理が config.ocio でどうのように表現されるかを説明する。

4.1. OCIO v2 の処理の概要

処理の概要を図1 に示す。

図1. OCIO v2 の処理の概要 (資料[2] を参考に作成)

他の一般的なカラーマネジメントシステムと同様に、OCIO v2 も各種 Color Space を特定の Color Space (図1 の scene reference space) に変換して処理する。 その一方で出力側の色空間が display reference spacedisplay color space に別れている点は OCIO v2 の特徴である(と筆者は考えている)。

以後、図1 の 3つの変換 (to_ref Transform, View Transform, from_ref Transform) について説明する (※0)。

※0 "to_ref" と "from_ref" はそれぞれ "to_reference", "from_reference" の略称である(SIGGRAPH の資料の図では略していたので合わせたが、本記事では無理に略す必要は無かったかも…)。

4.1.1 to_ref Transform

図1 の to_ref Transform は各種 Color Space を特定の Color Space (scene reference space) に変換する処理である。 scene reference space には任意の Color Space を設定可能だが、以後は ACES2065-1 が設定されている前提で説明する。 理由は OCIO の公式ドキュメントで公開されている config.ocio が scene reference space として ACES2065-1 を設定していたからである[3]。

to_ref Transform の中身はとても単純である。例えば S-Log3/S-Gamut3 の場合は S-Log3 を Log to Linear 変換し、その後に S-Gamut3 を ACES AP0 に色域変換するだけである (具体的な計算式は資料[4] を参照)。よって変換の詳細については省略する。

また、この変換は OCIO v2 では Built-in Transform を利用して行うこともできる。詳細は後述する。

4.1.2. View Transform

図1 の View Transform は scene reference space (scene-referred) から display reference space (display-referred) への変換を行う処理である。 どのような変換を行うかはユーザーが自由に決めて良いが、一般的には Tone mapping などの処理を行うようである (OCIO の公式ドキュメントでは ACES Output Transform (RRT + ODT のこと) が割り当てられている)。

さて display reference space は(OCIO v2 の仕組み上は)任意の Color Space を設定可能だが、以後は CIE XYZ (D65※2) が設定されている前提で説明する。 理由は OCIO の公式ドキュメントで公開されている config.ocio が display reference space として CIE XYZ Color Space (D65) を設定していたからである[3]。

※2 ここで D65 と書いたのは、scene reference space の D60 (※3) から D65 に Bradford変換が適用済みであることを示すためである
※3 厳密には D60 ではない[5]。D60 xy = (0.32163, 0.33774), ACES White Point xy = (0.32168, 0.33767) である。

筆者は今回 View Transform として Luminance Map (※4) への変換 LUT を適用した(図3)。Nuke 上で View Transform を選択する方法については後半で少し説明する。

図2 View Transform で特別な処理をしない場合 図3 View Transform で Luminance Map への変換を適用した場合

また、to_ref Transform と同様に View Transform についても Built-in Transform を使用できる。こちらも詳細は後述する。

※4 Lumiannce Map とは筆者が作成したフォルスカラー表示の一種である。詳細は以下の記事を参照。

trev16.hatenablog.com

4.1.3. from_ref Transform

図1 の from_ref Transform は display reference space を各種 display color space に変換する処理である。 この処理は非常に単純であり、CIE XYZ to RGB 変換を行う 3x3 Matrix と Liner to Non-Linear 変換を行う OETF を適用するだけである。よって詳細は省略する。

また、前の2つと同様に from_ref Transform についても Built-in Transform を使用できる。こちらも詳細は後述する。

4.2. config.ocio の説明

ここからは OCIO v2 の config.ocio について説明する。なるべく理解しやすいよう、図1 で示した各ブロックの処理との対応関係を明確にして説明する。 なお、本記事は概要を理解することを目的としているため構文の説明は最小限とする。

4.2.1 config.ocio の中身

config.ocio の実態は YAML[6] で書かれたテキストファイルである。 YAML では 連想配列、リスト、スカラーを使ってデータを表現する。

連想配列は "キー: 値" (key: value) の形で表現される。以後、ocio.config で使われるキーに注目して説明していく。

OCIO の公式ドキュメントで公開されている config.ocio では以下のキーが使われている。

  • description
  • name
  • search_path
  • environment
  • family_separator
  • roles
  • file_rules
  • viewing_rules
  • shared_views
  • displays
  • virtual_display
  • default_view_transform
  • view_transforms
  • looks
  • inactive_colorspaces
  • display_colorspaces
  • colorspaces
  • named_transforms

上記のキーのうち、赤太字で表記したものが to_ref Transform, View Transform, from_ref Transform と関係している。 以後、これらのキーについて説明する。

4.2.2. to_ref Transform に関連するキー

図1 の to_ref Transform に対応するのは colorspacesto_scene_reference である。 S-Log3/S-Gamut3 の例を以下に示す。

# colorspaces
colorspaces:
  - !<ColorSpace>
    name: Sony SLog3-SGamut3
    family: Cameras/Sony
    description: |
      Sony SLog3 / SGamut3
    isdata: false
    categories: [ file-io ]
    encoding: log
    to_scene_reference: !<BuiltinTransform> {style: "SONY_SLOG3-SGAMUT3_to_ACES2065-1"}

ここで BuiltinTransform が出てきたので解説する。Built-in Transform とはその名の通り OCIO v2 に内蔵された変換を意味する。 OCIO v1 の時は GroupTransform で複数の Transform を組み合わせて目標とする変換を定義する必要があったが、 v2 では典型的な変換は Built-in Transformで済ませることができる。大変便利である。

なお、筆者が調べたところ OCIO v2.1.1 では以下の Built-in Transformが定義されていた(※5)。
2024.1.11 追記: OpenColorIO 2.3 を使って Built-in Transform 一覧を更新しました

Built-in Transform名称 説明
"UTILITY - ACES-AP0_to_CIE-XYZ-D65_BFD" Convert ACES AP0 primaries to CIE XYZ with a D65 white point with Bradford adaptation
"UTILITY - ACES-AP1_to_CIE-XYZ-D65_BFD" Convert ACES AP1 primaries to CIE XYZ with a D65 white point with Bradford adaptation
"UTILITY - ACES-AP1_to_LINEAR-REC709_BFD" Convert ACES AP1 primaries to linear Rec.709 primaries with Bradford adaptation
"CURVE - ACEScct-LOG_to_LINEAR" Apply the log-to-lin curve used in ACEScct
"ACEScct_to_ACES2065-1" Convert ACEScct to ACES2065-1
"ACEScc_to_ACES2065-1" Convert ACEScc to ACES2065-1
"ACEScg_to_ACES2065-1" Convert ACEScg to ACES2065-1
"ACESproxy10i_to_ACES2065-1" Convert ACESproxy 10i to ACES2065-1
"ADX10_to_ACES2065-1" Convert ADX10 to ACES2065-1
"ADX16_to_ACES2065-1" Convert ADX16 to ACES2065-1
"ACES-LMT - BLUE_LIGHT_ARTIFACT_FIX" LMT for desaturating blue hues to reduce clipping artifacts
"ACES-LMT - ACES 1.3 Reference Gamut Compression" LMT (applied in ACES2065-1) to compress scene-referred values from common cameras into the AP1 gamut
"ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - SDR-CINEMA_1.0" Component of ACES Output Transforms for SDR cinema
"ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - SDR-VIDEO_1.0" Component of ACES Output Transforms for SDR D65 video
"ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - SDR-CINEMA-REC709lim_1.1" Component of ACES Output Transforms for SDR cinema
"ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - SDR-VIDEO-REC709lim_1.1" Component of ACES Output Transforms for SDR D65 video
"ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - SDR-VIDEO-P3lim_1.1" Component of ACES Output Transforms for SDR D65 video
"ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - SDR-CINEMA-D60sim-D65_1.1" Component of ACES Output Transforms for SDR D65 cinema simulating D60 white
"ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - SDR-VIDEO-D60sim-D65_1.0" Component of ACES Output Transforms for SDR D65 video simulating D60 white
"ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - SDR-CINEMA-D60sim-DCI_1.0" Component of ACES Output Transforms for SDR DCI cinema simulating D60 white
"ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - SDR-CINEMA-D65sim-DCI_1.1" Component of ACES Output Transforms for SDR DCI cinema simulating D65 white
"ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - HDR-VIDEO-1000nit-15nit-REC2020lim_1.1" Component of ACES Output Transforms for 1000 nit HDR D65 video
"ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - HDR-VIDEO-1000nit-15nit-P3lim_1.1" Component of ACES Output Transforms for 1000 nit HDR D65 video
"ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - HDR-VIDEO-2000nit-15nit-REC2020lim_1.1" Component of ACES Output Transforms for 2000 nit HDR D65 video
"ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - HDR-VIDEO-2000nit-15nit-P3lim_1.1" Component of ACES Output Transforms for 2000 nit HDR D65 video
"ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - HDR-VIDEO-4000nit-15nit-REC2020lim_1.1" Component of ACES Output Transforms for 4000 nit HDR D65 video
"ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - HDR-VIDEO-4000nit-15nit-P3lim_1.1" Component of ACES Output Transforms for 4000 nit HDR D65 video
"ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - HDR-CINEMA-108nit-7.2nit-P3lim_1.1" Component of ACES Output Transforms for 108 nit HDR D65 cinema
"ARRI_ALEXA-LOGC-EI800-AWG_to_ACES2065-1" Convert ARRI ALEXA LogC (EI800) ALEXA Wide Gamut to ACES2065-1
"ARRI_LOGC4_to_ACES2065-1" Convert ARRI LogC4 to ACES2065-1
"CANON_CLOG2-CGAMUT_to_ACES2065-1" Convert Canon Log 2 Cinema Gamut to ACES2065-1
"CURVE - CANON_CLOG2_to_LINEAR" Convert Canon Log 2 to linear
"CANON_CLOG3-CGAMUT_to_ACES2065-1" Convert Canon Log 3 Cinema Gamut to ACES2065-1
"CURVE - CANON_CLOG3_to_LINEAR" Convert Canon Log 3 to linear
"PANASONIC_VLOG-VGAMUT_to_ACES2065-1" Convert Panasonic Varicam V-Log V-Gamut to ACES2065-1
"RED_REDLOGFILM-RWG_to_ACES2065-1" Convert RED LogFilm RED Wide Gamut to ACES2065-1
"RED_LOG3G10-RWG_to_ACES2065-1" Convert RED Log3G10 RED Wide Gamut to ACES2065-1
"SONY_SLOG3-SGAMUT3_to_ACES2065-1" Convert Sony S-Log3 S-Gamut3 to ACES2065-1
"SONY_SLOG3-SGAMUT3.CINE_to_ACES2065-1" Convert Sony S-Log3 S-Gamut3.Cine to ACES2065-1
"SONY_SLOG3-SGAMUT3-VENICE_to_ACES2065-1" Convert Sony S-Log3 S-Gamut3 for the Venice camera to ACES2065-1
"SONY_SLOG3-SGAMUT3.CINE-VENICE_to_ACES2065-1" Convert Sony S-Log3 S-Gamut3.Cine for the Venice camera to ACES2065-1
"DISPLAY - CIE-XYZ-D65_to_REC.1886-REC.709" Convert CIE XYZ (D65 white) to Rec.1886/Rec.709 (HD video)
"DISPLAY - CIE-XYZ-D65_to_REC.1886-REC.2020" Convert CIE XYZ (D65 white) to Rec.1886/Rec.2020 (UHD video)
"DISPLAY - CIE-XYZ-D65_to_G2.2-REC.709" Convert CIE XYZ (D65 white) to Gamma2.2, Rec.709
"DISPLAY - CIE-XYZ-D65_to_sRGB" Convert CIE XYZ (D65 white) to sRGB (piecewise EOTF)
"DISPLAY - CIE-XYZ-D65_to_G2.6-P3-DCI-BFD" Convert CIE XYZ (D65 white) to Gamma 2.6, P3-DCI (DCI white with Bradford adaptation)
"DISPLAY - CIE-XYZ-D65_to_G2.6-P3-D65" Convert CIE XYZ (D65 white) to Gamma 2.6, P3-D65
"DISPLAY - CIE-XYZ-D65_to_G2.6-P3-D60-BFD" Convert CIE XYZ (D65 white) to Gamma 2.6, P3-D60 (Bradford adaptation)
"DISPLAY - CIE-XYZ-D65_to_DisplayP3" Convert CIE XYZ (D65 white) to Apple Display P3
"CURVE - ST-2084_to_LINEAR" Convert SMPTE ST-2084 (PQ) full-range to linear nits/100
"CURVE - LINEAR_to_ST-2084" Convert linear nits/100 to SMPTE ST-2084 (PQ) full-range
"DISPLAY - CIE-XYZ-D65_to_REC.2100-PQ" Convert CIE XYZ (D65 white) to Rec.2100-PQ
"DISPLAY - CIE-XYZ-D65_to_ST2084-P3-D65" Convert CIE XYZ (D65 white) to ST-2084 (PQ), P3-D65 primaries
"DISPLAY - CIE-XYZ-D65_to_REC.2100-HLG-1000nit" Convert CIE XYZ (D65 white) to Rec.2100-HLG, 1000 nit

※5 公式ドキュメントを読んでも Built-in Transform 一覧の記載が無かったため、以下のコードで吐き出した。

import PyOpenColorIO as ocio

if __name__ == '__main__':
    builtin_transform_registry = ocio.BuiltinTransformRegistry()
    builtin_transforms = builtin_transform_registry.getBuiltins()
    for builtin_transform in builtin_transforms:
        name = builtin_transform[0]
        description = builtin_transform[1]
        print(f'name: "{name}", description: "{description}"')

4.2.3. View Transform に関連するキー

図1 の View Transform に対応するのは view_transformsfrom_scene_reference である。 ここでは、図2と図3 で紹介した、特別な処理をしないパターン (Un-tone-mapped) と Luminance Map を適用する場合 (Luminance_Map_4000nits) の2例を示す。

view_transforms:
  - !<ViewTransform>
    name: Un-tone-mapped
    description: |
      Convert the scene colorimetry directly to display-referred with no tone-mapping.
    from_scene_reference: !<BuiltinTransform> {style: "UTILITY - ACES-AP0_to_CIE-XYZ-D65_BFD"}

  - !<ViewTransform>
    name: Luminance_Map_4000nits
    description: |
      Luminance mapping 100-4000 nits
    from_scene_reference: !<GroupTransform>
      children:
        - !<BuiltinTransform> {style: "UTILITY - ACES-AP0_to_CIE-XYZ-D65_BFD"}
        - !<BuiltinTransform> {style: "DISPLAY - CIE-XYZ-D65_to_REC.2100-PQ"}
        - !<FileTransform> {src: LuminanceMap_for_ST2084_BT2020_D65_MapRange_100-4000nits_65x65x65_on_ST2084.cube, interpolation: tetrahedral}
        - !<BuiltinTransform> {style: "DISPLAY - CIE-XYZ-D65_to_REC.2100-PQ", direction: inverse}

始めに Un-tone-mapped について説明する。これはとても単純である。Built-in Transform の style に書かれた文字列が示す通り、ACES2065-1 を CIE XYZ (D65) に RGB to XYZ 変換しているだけである。Tone mapping は適用していないため、機材のセットアップ時の動作確認などで便利である。

次に Luminance_Map_4000nits について説明する。これは少々複雑である。GroupTransform で4つの変換を行っているが、後半の3つは 筆者が作成した 3DLUT (.cube) を適用するために行っている。

筆者が作成した 3DLUT は、BT.2100-PQ の色空間に対して動作するよう設計したものである。従って、ACES2065-1 や CIE XYZ (D65) の空間では適用できない。 そこで今回は FileTransform の前処理後処理として "DISPLAY - CIE-XYZ-D65_to_REC.2100-PQ" の順変換逆変換を行っている。

4.2.4. from_ref Transform に関連するキー

図1 の from_ref Transform に関連するキーは display_colorspacesfrom_display_reference である。 BT.1886-BT709 と BT.2100-PQ の例を以下に示す。

display_colorspaces:
  - !<ColorSpace>
    name: BT1886-BT709
    family: Displays/SDR
    description: |
      Gamut: BT.709, EOTF: Gamma 2.4
    isdata: false
    categories: [ file-io ]
    encoding: sdr-video
    from_display_reference: !<BuiltinTransform> {style: "DISPLAY - CIE-XYZ-D65_to_REC.1886-REC.709"}

  - !<ColorSpace>
    name: BT2100-PQ
    family: Displays/HDR
    description: |
      Gamut: BT.2020, EOTF: SMPTE ST2084
    isdata: false
    categories: [ file-io ]
    encoding: hdr-video
    from_display_reference: !<BuiltinTransform> {style: "DISPLAY - CIE-XYZ-D65_to_REC.2100-PQ"}

from_display_reference に書かれている通り、ここで display reference space (CIE XYZ D65) から display color space への変換を定義している。 今回の例では、ここでも Built-in Transform を使用した。Built-in Transform は本当に便利である。

4.2.5. displays キーを使用した Display View Transform の説明

ここまでの説明で、筆者は図1 で示した3つの変換 (to_ref Transform, View Transform, from_ref Transform) と config.ocio の対応関係を示した。

だが実は OCIO v2 にはもう1つ重要な概念がある。それは View Transform と from_ref Transform の 紐付け を config.ocio で定義できる点である。

この概念は理解が困難かもしれない。筆者も最初は何を意味しているのか理解できなかった。 しかし、自分で config.ocio を書き、Nuke で複数の View Transform と display color space の組み合わせを確認するうちに、とても便利な概念だと分かった。 この概念は OCIO v2 の config.ocio を書く際に必ず必要となるため、以下で説明していく。

早速だが Nuke での具体例を 図4、図5 に示す。図4、図5 は Nuke を使用し、紐付けされた View Transform と from_ref Transform をプルダウンメニューから選択して表示した例である。

図4. View Transform と from_ref Transform を Un-tone-mapped と BT1886-BT709 に紐付けた例 図5. View Transform と from_ref Transform を Luminance_Map_4000nits と BT1886-BT709 に紐付けた例

Nuke の UI に表示されている Simple BT1886-BT709Luminance_Map_4000nit BT1886-BT709 は View Transform と from_ref Transform の 紐付けの名称 である。また括弧で囲われた BT1886-BT709 は display color space の名称である。

これを別の視点からも説明する。図4、図5 を別の視点から見たものを図6、図7 に示す(青点線の箇所)。

図6 View Transform と from_ref Transform を Un-tone-mapped と BT1886-BT709 に紐付けた例 図7 View Transform と from_ref Transform を Luminance_Map_4000nits と BT1886-BT709 に紐付けた例

図から読み取れるように、View Transform と from_ref Transform の紐付けとは、特定の View Transform と from_ref Transform を一組のペアとして取り扱うことである。

筆者は OCIO v2 の動作確認をする中でこの機能はとても便利だと感じた。なぜならば View Transform と from_ref Transform の組み合わせはある程度決まっているからである<要出典 (ここから先は筆者の推測が多数含まれる)>。そのため、組み合わせを事前に紐付けしておくと映像制作ツール上の操作が楽になると感じた。

例として View Transform で Tone mapping を行うことを考える。この時、必要とされる Tone mapping の特性は display color space に依って大きく異なる。

  • BT1886-BT709 (SDR 100 nit) の場合、Tone mapping で 0.0-1.0 に丸めることが求められる
  • BT2100-PQ (HDR 1000 nit) の場合、Tone mapping で 0.0-10.0 に丸めることが求められる
  • BT2100-PQ (HDR 4000 nit) の場合、Tone mapping で 0.0-40.0 に丸めることが求められる

すると、View Transform と from_ref Transform の組み合わせは自然と以下に決まる。

  • BT1886-BT709 (SDR 100 nit) の場合
    • View Transform: ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - SDR-VIDEO-REC709lim_1.1
    • from_ref Transform: BT1886-BT709
  • BT2100-PQ (HDR 1000 nit) の場合
    • View Transform: ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - HDR-VIDEO-1000nit-15nit-REC2020lim_1.1
    • from_ref Transform: BT2100-PQ
  • BT2100-PQ (HDR 4000 nit) の場合
    • View Transform: ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - HDR-VIDEO-4000nit-15nit-REC2020lim_1.1
    • from_ref Transform: BT2100-PQ

実際の運用では、View Transform と from_ref Transform の組み合わせが 一組 に限定されるケースは少ないと思うが、組み合わせの数はある程度は限られると考える。 OCIO v2 では、これを効率よく運用できるように View Transform と from_ref Transform を紐付けして config.ocio に定義できる(と筆者は理解した)。

さて、ocio.config ではこの概念を displays キーで記述する。 筆者が作成した config.ocio の例を以下に示す。

displays:
  BT1886-BT709:
    - !<View>
      name: Simple BT1886-BT709
      view_transform: Un-tone-mapped
      display_colorspace: BT1886-BT709

    - !<View>
      name: ACES_OT_BT1886-BT709
      view_transform: SDR-VIDEO_BT709_1.1
      display_colorspace: BT1886-BT709

    - !<View>
      name: Luminance_Map_1000nit BT1886-BT709
      view_transform: Luminance_map_1000nit
      display_colorspace: BT1886-BT709

    - !<View>
      name: Luminance_Map_4000nit BT1886-BT709
      view_transform: Luminance_map_4000nit
      display_colorspace: BT1886-BT709

  BT2100-PQ:
    - !<View>
      name: Simple BT2100-PQ
      view_transform: Un-tone-mapped
      display_colorspace: BT2100-PQ

    - !<View>
      name: ACES_OT_HDR_1000nit_BT2100-PQ
      view_transform: HDR-VIDEO-1000nit_BT2020
      display_colorspace: BT2100-PQ

    - !<View>
      name: Luminance_Map_1000nit BT2100-PQ
      view_transform: Luminance_map_1000nit
      display_colorspace: BT2100-PQ

    - !<View>
      name: Luminance_Map_4000nit BT2100-PQ
      view_transform: Luminance_map_4000nit
      display_colorspace: BT2100-PQ

上記の設定と Nuke での実例 (図5、図6) を見れば Display View Transform の概要が理解できると考える。

4.3. ociocheck を使用した config.ocio の検証

作成した config.ocio は ociocheck というツールを使って検証 (Validation) することが可能である。 コマンドラインで以下のように実行すれば良い。

$ ociocheck --iconfig config.ocio

Validation の欄に passed と表示されれば成功である。

5. デモ

作成した config.ocio を Nuke 13.1 を使用して試している様子を動画で撮影した。結果を以下に示す。 (筆者は映像制作ツールの操作に関しては完全に初心者である。見苦しい点があってもご容赦して頂きたい。)

行っている内容は以下の通り。

  • OCIO v2 の config.ocio の読み込み
  • Read1 で "Gamma 2.4_ITU-R BT.709_D65_1920x1080_rev05_type1.dpx" を読み込み
    • View Transform と from_ref Transform の紐付けとして "Simple BT1886-BT709" と "ACES_OT_BT1886-BT709" をそれぞれ適用
  • Read2 で "SONY S-Log3_S-Gamut3_D65_1920x1080_rev05_type1.dpx" を読み込み
    • View Transform と from_ref Transform の紐付けとして "Simple BT1886-BT709" と "ACES_OT_BT1886-BT709" をそれぞれ適用
  • Read3 で "SMPTE ST2084_ITU-R BT.2020_D65_1920x1080_rev05_type1.dpx" を読み込み
    • View Transform と from_ref Transform の紐付けとして "Simple BT2100-PQ" と "Luminance_Map_1000nit BT1886-BT709" と "Luminance_Map_4000nit BT1886-BT709" をそれぞれ適用
  • Read4 で "SolLevante_HDR10_r2020_ST2084_UHD_24fps_1000nit.mov" を読み込み(※6)
    • Reformat で 1920x1080 にリサイズ
  • Read5 で "step_ramp_step_65.png" を読み込み、Merge ノードで合成
    • View Transform と from_ref Transform の紐付けとして "Luminance_Map_1000nit BT1886-BT709" を適用

※6 このファイルは本記事の添付ファイルには含まれていない。NETFLIX OPEN CONTENT[7] からダウンロードして頂きたい

6. 今後の課題

OCIO v2 の説明資料を読みながら自分自身で conig.ocio を作成することで、OCIO v2 の基本的な動作は理解することができた。 その一方で、まだまだ業務で使用できるレベルでの理解はできていないと考える。

時間とモチベーションがあれば以下の内容を調査したい。

  • conifig.ocio で shared_views を使いたい。
    • 今回は理解しやすいように shared_views を使わずに記述したが、結果として冗長な書き方になってしまった
    • config.ocio をアップデートする機会があれば shared_views を使ってスッキリさせたい
  • Luminance Map 適用時に発生していた誤差の調査を行いたい
    • 記事中では触れなかったが、BT.709 や S-Log3 のテストパターンに対して Luminance Map を適用すると、わずかに意図しない誤差が生じていた
    • 誤差が生じた原因の調査をしたい
      • もしかしたら 3DLUT 適用時はもう1ステップ、config.ocio に何か記述が必要なのかも?
      • 書いていて思ったが、そもそも筆者は Nuke が CPUで処理してるのか GPUで処理しているのかも知らない…
  • ACES Output Transform の逆変換を試したい
    • 今回の確認では、"ACES Output Transform 適用済み" のコンテンツを入力映像として扱うことは無かった。そのうち試したい
  • Display P3 など Built-in Transform が存在しない Color Space への変換を自分で書きたい
    • Built-in Transform が便利すぎて RangeTransform や ExponentWithLinearTransform などの変換を試す機会が無かった
    • これらの変換への理解を深めるためにも、任意の変換をサラサラっとお試しで書いてみたい
  • Academy/ASC Common LUT Format (CLF) を使った変換を試したい
    • CLF については仕様書すら読んでないので、どこかでちゃんと勉強したい
  • Nuke を使わず Python で直接 OCIO のライブラリを叩いて画像変換して遊びたい

7. 感想

OCIO v2 の config.ocio は理屈さえ分かってしまえば大変書きやすく、また拡張性も高いと感じた。 とは言え、まだ基本的なところしか理解できていないため、使う機会を増やして理解を深めていきたい。(と書いたが、仕事でも趣味でも今のところ使う予定が無い😇)。

個人的には DaVinci Resolve が OCIO v2 に対応してくれると非常に助かる。

とうことで冬休みの宿題は完了した。明日以降は DaVinci Resolve 17.4 の RCM の調査に戻ろうと思う。

参考資料

[1] Foundry, "What's New in Nuke, Nuke Studio, and Hiero 13.1", https://learn.foundry.com/nuke/current/content/release_notes/nuke_13.1.html

[2] ACM Digital Library, "Color management with OpenColorIO V2", https://dl.acm.org/doi/10.1145/3450508.3464600

[3] OpenColorIO - Read the Docs, "ocio-v2_demo", https://opencolorio.readthedocs.io/en/latest/configurations/ocio_v2_demo.html

[4] ampas/aces-dev, "ACEScsc.Academy.SLog3_SGamut3_to_ACES.ctl", https://github.com/ampas/aces-dev/blob/dev/transforms/ctl/csc/sony/ACEScsc.Academy.SLog3_SGamut3_to_ACES.ctl

[5] ACES TB-2018-001, "Derivation of the ACES white point CIE chromaticity coordinates", https://www.oscars.org/science-technology/aces/aces-documentation

[6] Wikipedia (EN), "YAML", https://en.wikipedia.org/wiki/YAML

[7] Netflix, "NETFLIX OPEN CONTENT", https://opencontent.netflix.com/