今回はdarktableで現像した画像から、Nukeを利用してHDRIを高品質に作成する手順を紹介していきます。

基本的には、CGWORLD vol.262(2020年6月号)の記事で紹介したNukeツールのフローの再紹介となりますが、今回の連載に合わせてカスタムノードの更新と追加を行なっています。

Nukeファイルの配布もありますので、合わせて活用してください。

記事の目次

    CGSLAB LLC.

    テクスチャスキャナの作成/スキャン。3Dスキャナ、フォトグラメトリー等を用いた3Dスキャニングなどのサービス、研究開発をしています

    site.cgslab.info

    関連記事:
    CG映像業界のテクニカル系の仕事を探る 第3回 前編:CGSLABの仕事
    CG映像業界のテクニカル系の仕事を探る 第3回 後編:3DスキャニングとCG映像制作の民主化

    各種設定ファイルなどの配布

    前回に引き続き、本連載向けのGitHubリポジトリのリリースページに、今回解説するファイルを用意しました。

    そちらからダウンロードについてを確認して、zipファイルをダウンロードの上、展開しておいてください。

    GitHub - cgslab/CGW_TEHTAZ1_VFXHDRIHandbook: CGWORLD.jpの連載向けデータ配布先

    darktableのスタイルを使用した一括現像

    darktableは、スタイルを使用した一括現像ができることがメリットです。
    一度設定を行えば、同じ現像処理を行う場合は画像を読み込んで選択し、エクスポートをクリックするだけで現像が行えます。

    基本的なdarktableのセットアップは前回行なっているものとして、解説を進めます。
    読み込んだ全ての画像を選択して、[ライトルーム]タブ[選択画像をエクスポート]カテゴリを展開して各種設定を行なっていきます。

    [エクスポート先ストレージ]で指定されている書き出し先は、特に指定していなければ読み込んだ画像フォルダ内に「darktable_exported」というフォルダが生成され、その中に同名で書き出されます。こちらは必要に応じて変更してください。

    フォーマットオプションに関しては、darktableではEXR書き出しの場合、EXIFメタデータ付きでの書き出しが行えません。

    ロゴスコープ亀村氏によると、ACESは16bit float非圧縮が既定となっているため、EXIFメタデータ付きのHDRを書き出したい場合は[プロファイル]を[REC2020(Rec709 Gamma)]とした上で、[ファイルフォーマット]を[TIFF]、[ビット深度]を[16ビット]に設定することが推奨されます。

    併せて[インテント]が[絶対的な色彩を維持]、一番下の[モード]が[履歴を置き換え]になっていることを確認します。

    また、[スタイル]には前回読み込んだ「THETA_Z1_HDRI_IDT_REC2020_v2」を選択することで、個々の画像にスタイルを適用しなくても自動でスタイルを適用して書き出すことが可能となります。

    最後に、初回のみ[エクスポート]のメニュー横の[設定]から[EXIFデータ]が有効になっていることを確認し、[エクスポート]ボタンをクリックして書き出しを実行してください。

    darktable-cliを使用したバッチ処理

    現像時に設定を変更することがないため、GUIへのインポート処理を省略し、フォルダを指定したバッチ処理をすることで、より簡単にスタイルを適用させた一括現像を行うことも可能です。

    ここでは、Windowsのバッチファイル化した例を紹介します。

    darktableのセットアップを行なったあとに、配布データ内の「darktable_CGWHDRI_DevBatch.bat」をテキストで開き、ICCプロファイルのパスを自分の環境に合わせて書き換え、上書き保存してください。

    保存が済んだら、darktable_CGWHDRI_DevBatch.batを実行します。※管理者権限でもダブルクリックでも動作します。

    なお、darktableは様々なプロファイルデータベースを参照して動作しています。そのためdarktableがGUIですでに起動しているとデータベースをロックしてしまうので、バッチが正常に実行できません。darktableが起動していない状態で実行しましょう。

    @echo off
    setlocal enabledelayedexpansion
    
    :: Darktable CLIのパス
    set "dt_cli=C:\Program Files\darktable\bin\darktable-cli.exe"
    :: dtstyleのパス
    set "Style=--hq 0 --style THETA_Z1_HDRI_IDT_REC2020_v2 --style-overwrite --out-ext tiff --icc-intent ABSOLUTE_COLORIMETRIC --icc-file"
    :: ICCプロファイルのパス
    set "Icc_file=C:\Users\<ユーザー名>\AppData\Local\darktable\color\out\REC2020(Rec709 Gamma).icc"
    :: tiffオプション
    set "tiff_option=--verbose  --core --conf plugins/imageio/format/tiff/bpp=16 plugins/imageio/format/tiff/bcompress=2 plugins/imageio/format/tiff/compresslevel=5"
    
    :: 入力ディレクトリと出力ディレクトリの入力
    set /p "In_dir=Input Directory: "
    set /p "Out_dir=Output Directory: "
    
    :: パスの末尾のバックスラッシュを削除(もし存在する場合)
    if "%In_dir:~-1%"=="\" set "In_dir=%In_dir:~0,-1%"
    if "%Out_dir:~-1%"=="\" set "Out_dir=%Out_dir:~0,-1%"
    
    :: バックスラッシュをスラッシュに置換
    set "In_dir=%In_dir:\=/%"
    set "Out_dir=%Out_dir:\=/%"
    
    echo !In_dir!
    :: 入力ディレクトリのファイルを処理
    for %%f in ("%In_dir%\*.*") do (
        set "input_path=%%f"
        echo loading file=!input_path!
        set "file_name=%%~nf"
        set "output_path=!Out_dir!/%!file_name!"
        echo "%dt_cli%" "!input_path!" "!output_path!" !Style! "!Icc_file!" !tiff_option! !Config_dir!
        echo ----------------------
        echo Processing: !input_path!
        "%dt_cli%" "!input_path!" "!output_path!" !Style! "!Icc_file!" !tiff_option! !Config_dir!
    
        if errorlevel 1 (
            echo Error occurred during processing !input_path!
        )
        echo ======================
    )
    
    echo Processing complete.
    pause
    ▲darktable_CGWHDRI_DevBatch.bat

    実行すると「Input Directory」と「Ounput Directory」を確認されるので、それぞれパスを入力して[Enter]キーを押して続行します。

    自動でフォルダ内のDNGファイルごとに、指定したdtstyleの設定を使用して現像から書き出しが行われます。

    「Gtk-WARNING **: 14:20:37.061: gtk_disable_setlocale() must be called before gtk_init()」はライブラリの呼び出し警告ですが、無視して構いません。

    実行されるバッチコマンドと読み込みするDNGファイル、書き出し完了時にそのパスを表示するようにしています。

    このコードはdarktable-cliのユーザーガイドを参考に制作したものです。
    darktable 4.6 user manual

    こちらをベースにして、各自のフローに合わせてツール化などに活用していただければと思います。

    Nukeを使用したマージ処理

    HDR化処理

    ダウンロードデータのNuke_HDRI_Mergeフォルダ内の「Nuke_HDRI_Merge_v2.nk」が今回使用するデータになります。このデータはNuke14で作成していますが、Nuke15やNuke13でも問題なく開けると思います。Nuke12では、後述のとおりOCIOのバージョンについて設定の変更が必要になります。

    OCIOのバージョンはv1.2になっています。Nuke14で最新のOCIO v2からはカスタム記述を行わないとRec.2020 Cameraのカラースペースが使えないため、あえてv1.2を使用しています。なお、Nuke12の場合はOCIO v1.1がデフォルトの最新となり、v1.2ではエラーが出るので、Project Settingsでv1.1に変更してください。

    このフローでは、HDR統合がどういう処理かもふまえて、理解を深めやすいツールに整備しています。どういう処理を行なっているかはHDRI Mergeのグループノードの中身を確認してみてください。

    この方法で作成した場合は、EV値を基に全体の明るさが調整できるため、バックプレートとの整合性もとりやすくなっています。

    ここでの処理はカメラレスポンスカーブ等の計算はしていないため、今回のTHETA Z1のデータのように適切な現像処理をした上で、色も含めてリニアライズされた画像入力が前提となります。一眼レフ等のデータを使用する場合は注意してください。

    CGWORLD vol.262での配布データからのNukeツールの変更点

    HDRI Merge
    ・メタデータ等を引き継いで書き出し時の名前に使用できるように変更
    ・IDTを新旧(ホワイトポイントの補正を現像時に行うか、Nuke内で行うか)選択切り替えできるように変更
    ・インプット順の確認が行えるようEV checkタブを追加
    ・マージ処理で暗部のノイズが載ってしまう場合がある問題を修正
    ・Add Sunタブを単独Add Sunノードと合わせて更新

    Add Sun
    ・色と強度の調整を分離
    ・Inpaint、AddGlowを追加。自然な見た目で太陽を追加できる機能

    SetColorspace(新規ノード)
    OCIOのプロジェクト設定が適切にされていない場合でも、読み込んだ素材や書き出し時のカラースペースを一括で設定できるツール

    HDRI Lux Meter(新規ノード)
    照度値の確認を行える。詳細な使い方は次回連載で紹介

    Color Match(新規ノード)
    撮影プレートとHDRIの色、露出合わせ等を行える。詳細な使い方は次の連載で紹介

    Writeノード
    ・相対パス化していたものをプロジェクトのパスになるようTCL記述を変更
    ・メタデータから自動で名前等が入るようにTCL記述追加。書き出しをACEScgに変更

    STMap
    ・添付のSTMapを16bit float EXRから32bit float EXRに更新
    ・それに伴い16bit floatの精度補完で加えていたBlurノードを削除
    ※32bit float EXRにしたことでファイルサイズも大きくなったため、以前のものを使用いただいても問題はありません

    CaraVR
    更新がないため今回削除

    ※グループノードのギズモ化やツール登録、画像の自動差し替えやバッチ処理など、必要に応じて自由にカスタムしてご活用ください。

    1:Project Settingsの設定変更

    「NukeHDRIMerge.nk」では、Project Settingsについて、以下の画像のようにデフォルトから[16-bit files]の設定を「Utility - Rec.2020 - Camera」に変更しています。

    2:HDRI Merge処理

    現像したTIFFを読み込み、「HDRI_Merge」ノードに接続します。インプット順は明るい画像から順に[In1]から接続してください。

    読み込むTIFFは、16bitで書き出しているので、先ほど設定したように「Utility - Rec.2020 - Camera」で読み込まれます(※現像時の「REC2020(Rec709 Gamma)」と同一)。

    現像処理と読み込みに問題がなければ、接続するだけでHDR画像が生成されます。

    露出オーバーしている画像は接続しても意味がなく、黒浮きなど線形性破綻の原因にもなりますので使用しないように注意しましょう。また、Burst撮影などで重複している画像の使用も避けてください。

    案件の仕様等による事情で16-bitファイルの設定を「Utility - Rec.2020 - Camera」に変更できない場合や後から変更していないことに気づいた場合は、SetColorspaceノードで選択画像のカラースペースを一括設定できるようにしています。

    変更したいノードを選択し、変更するカラースペースのボタンを押すと一括で変更されます。

    「HDRI_Merge」ノードの各パラメータ

    EV:事前に見た目合わせでのEV補正を行えます。

    Name(MetaData):メタデータに名前を埋め込み、WriteノードにTCLとして使用できます。デフォルトでは撮影されたDNGがフォルダ分けされており、darktable_exportedに現像されている前提で元のフォルダ名をIn1の.tifから拾うTCLとなっています(例:BIS_20240101_1200_00 \ darktable_exported \ BIS_0005.tifが入力の場合、BIS_20240101_1200_00がファイル名となる)。
    または、シーンナンバーなど任意の名前を入力することでファイル管理を行いやすくなります。

    darktable THETA Z1 IDT optimizeNEWはホワイトポイント補正済みIDTを使用している場合の設定で、IDT基準の露出補正のみになります。OLDはCGWORLD vol.262時に配布していたIDTを使用する場合の設定で、Nuke内でホワイトポイントの簡易補正をしています。

    WhiteBalance:見た目での簡易的なホワイトバランスの補正ができます。

    EV checkタブ:適切に接続出できているかの確認ができます。各画像のEV値、EVステップの値がおかしくないか一覧できます。

    Add Sunタブ:後述の太陽光の光源補完を行えます。

    3:適正露出補正

    「HDRI_Merge」ノードのEVパラメータが無効の場合は、完全に白飛びした画像となります。このデータがまさに現実の輝度値と一致しているので、フィジカルカメラに適正なカメラ設定をして使う場合は、データは適正となります。

    この状態で書き出す場合、32-bit floatでないと16-bit floatに収まる最大値は (2−2^−10) × 2^15 = 65,504 となるため、高輝度部分が収まらずクランプされる場合があるので注意して下さい。

    フィジカルカメラを使用しない場合は、汎用的に使えるように事前にバックプレートの露出に合わせて「HDRI_Merge」ノードのEV値を調整します。もしバックプレートの合成がない場合や後で再調整を行う場合は、いったん見た目合わせでも問題ないでしょう。

    PTGuiでスティッチを行う場合は、ある程度適正な露出でないとスティッチが失敗することもあるので、露出調整は必要となります。適正露出に補正した場合でも稀に日陰等に露出を合わせた場合、補完済みの太陽光の値が65,504を超える場合があるため16-bit float書き出しの際は気をつけてください。

    「Exposure HDRI」ノードを使うと、Modeを切り替えて別途細かく、EV値、任意のカメラ設定値、バックプレートなど外部のメタデータ(スチル)の3択のいずれかの設定でEV値を調整することが可能です。「Exposure HDRI」ノードを使用する場合は「HDRI_Merge」ノードのEVの項目はOFFにしてください。

    ※IDTなどが使用できていない場合やカメラにフィルタが付いている場合など、メタデータ参照で必ずしも正確には露出が一致しない場合があります。

    適正露出とはどこに基準をおくかで変動するため絶対的な正解はありませんが、チャートが撮影できている場合は18%グレーが基準とされやすいです。

    バックプレートに合成する場合にはバックプレートと同じ露出が基準となります。メタデータ等を使わずにバックプレートに露出と色(ホワイトバランス)を合わせる方法は、次回紹介します。

    スティッチ処理

    外部でスティッチ処理をする場合は、ここで一度書き出しを行います。

    この段階でHDR画像になっているため、OpenEXRフォーマットで書き出します。カラースペースはデフォルトでACEScgとなりますが、使用するレンダラや用途によってはsRGBなどに変更が必要な場合もあるでしょう。

    より精度の高いスティッチ処理を行いたい場合はPTGuiでのスティッチをオススメします。

    PTGuiでのスティッチ処理については前回紹介しているので、ここでは「NukeHDRIMerge.nk」で用意した「STMapを使用したスティッチ」と、「RICOH THETA Stitcher」を紹介します。

    方法1:STMapを使用したスティッチ

    前回Blenderを使用したのと同じ、一番シンプルな簡易スティッチ処理のSTMapを用いた手法です。

    ・ブレンド処理はアルファブレンドのみなので、境界の色ムラ補正はされませんがNUKE内で完結することが可能です(※STMap作成時のスティッチに縛られスティッチ調整できないため万能ではありません)。

    ・STMapを自分で作成する方法は、Nukeで作成したUV画像を書き出し、PTGuiでスティッチしたTHETAの画像をUV Map画像に差し替え[個々のHDRレイヤー]で書き出すことで作成できます。

    方法2:RICOH THETA Stitcherを使用した事前スティッチ

    RICOH THETA Stitcherは、RICOH THETA Z1で撮影したDNGファイルをRAW現像したデュアルフィッシュアイのJPEG/TIFFファイルで読み込み、THETA Z1本体と同等のスティッチングアルゴリズムで360°画像にスティッチ処理できるアプリケーションです。

    ●ダウンロード先

    リコー公式サイト
    https://support.theta360.com/ja/download/lrstitch/

    リリース初期はAdobe Lightroom Classic上のプラグインとして起動する必要があったRICOH THETA Stitcher ですが、v3.00.0以降のバージョンからスタンドアロンで起動・利用できるようになりました。これにより、darktableから書き出したTIFF画像を事前に一括スティッチすることが可能です。

    RICOH THETA Stitcherを使う利点として、公式のスティッチアルゴリズムを使用できる点(PTGuiの方がきれいな結果にはなりやすい)と撮影時のセンサ情報から傾きを補正して水平のとれた天頂補正を行える点があります。

    また、Nukeで読み込む前にスティッチ処理されていることで、次回紹介する太陽光の補完や色補正をSTMapよりスティッチがキレイな状態で、中間ファイルの書き出しなしで行うことができます。

    元のDNGの情報が必要となるため、書き出したTIFFデータはDNGと同一階層にある方が処理をスムーズに行えます(別階層の場合は、画像ごとに元のDNGの場所の指定が要求されます)。

    darktableのデフォルトの設定では、書き出し先はdarktable_exportedフォルダになっているため、書き出し設定を変更するか、書き出されたデータをDNGと同階層のフォルダに移動しておきます。

    また、RICOH THETA Stitcherは処理後、元のTIFFデータに上書き保存されるため、デュアルフィッシュアイの状態の現像済みデータを残しておきたい場合は、データを複製してバックアップをとっておきます

    RICOH THETA Stitcherのショートカット、または起動したRICOH THETA Stitcherにスティッチしたい画像をまとめてドラッグ&ドロップして、一括処理します。

    基本的には自動で問題ありませんが、一括でドラッグ&ドロップした際には、基本的に暗い露出画像が初めにくるため、スティッチをプレビュー確認したい場合や丁寧にスティッチ処理をしたい場合、スティッチが上手く行かないといった場合は、適正に近い露出で撮影できているデータを先に1枚処理しておき、設定をプリセットに保存して、他の画像にプリセットを適用して一括処理することも可能です。

    Nukeで太陽の追加処理

    「HDRI_Merge」ノードのSunタブまたは「AddSun」ノードで、太陽の追加・補完処理が簡易的に行えます。また、次回で紹介する照度計を使用した太陽の補完方法では、Nukeで完結できる補完方法を紹介します。

    そうした補正が行えない場合は、基本的にレンダリングテストをくり返しながら調整が必要になるため、3D上でサンライトを追加して調整する方が良いでしょう。その場合は、既存の光源に追加でライトを置くか、既存の光源を消してCGのライトのみにする方法でセットアップすることになるでしょう。

    また、消し込み用に「AddSun」ノードの[Sun OFF]にチェックを入れることで、Inpaint機能で消し込みのみをすることもできます。

    基本的に光源はCGソフト内のライトオブジェクトに差し替える方がノイズが少なくレンダリング品質が上がりやすいとされています。また、BlenderのEeveeなどライトオブジェクトを追加しないと影が適切に処理されないレンダラもあります。

    それでも様々なソフト間で共通のHDRIとして使う場合は、CGソフト内でのライト追加ではなく、事前に画像の方を調整しておく方が同じライティング結果になりやすいので、CGソフト内で追加した光源をパノラマレンダリングでHDRI化して使用するのも選択肢になるでしょう。

    「AddSun」ノードで光源を追加する際には、光源位置が画面端に来てしまうと補正しづらいため、SphericalTransformノードを使い補正しやすい位置に光源が来るように、パノラマ画像の調整を先に行います。

    各パラメータを調整していきます。

    power:光源の強度を調整
    color:光源の色を指定。後から修正しやすいように色のみの指定になるようにしているので、大きな値を指定しても内部では強度に影響が出ないようになっています
    blur:光源をぼかしたい際に使用。光源の明るさに影響が出ないようにブラー処理を行えます
    Inpaint:元のクランプされた光源の消し込み。各パラメータで範囲等の調整を行えます
    AddGlow:光源にグロー処理の追加。グローのサイズ強度の調整を行います

    ※InpaintとAddGlowは画像的にキレイに見せるためのもので、CG上のレンダリングへの影響は限られます。
    ※光源サイズはデフォルト値が大まかですが、THETA Z1の撮影解像度に対して実際の太陽のサイズと近似する値になっています。
    ※Latlongの画像に対して追加するため正確には位置によってサイズが変わったり楕円になったりするのが正しいですが、Addsunノードにそれらの補正は入れていません。SphericalTransformで適宜調整します。


    Blenderでは、標準でバンドルされている[Sun Position]アドオンを有効にすることで、緯度・経度・時間で太陽光を合わせたり、HDRIの光源位置をピックして太陽光を同期させて合わせることが可能です。

    また、同様に太陽オブジェクトをHDRI内の最も明るい点に自動で合わせてくれる[HDRI Sun Aligner]というアドオンもあります(こちらは記事掲載時点でBlender4.0非対応)。

    CGソフト上で太陽光源の追加を確認をする際、HDRIの露出を撮影プレートなどに合わせている場合は、すでに光源以外は適切な状態のはずです。そのため、HDRI自体の露出・強度は変更せずに、一緒に撮影しているカラーチャートやグレーボールなどがCG上のものと一致するように太陽の光源強度や色のみを調整します。

    それらの指標がない場合は、HDRIや撮影プレートに映っているものの影とハイライトの対比を見て、同様に追加したCGオブジェクトを見ながら調整するかたちになります。

    次回も、Nukeをメインに、照度計を使った太陽光の補完やバックプレートとHDRIの色合わせについて紹介していきます。今回使用方法を説明していない配布データに含まれるノード類に関しても次回紹介します。

    TEXT_CGSLAB
    EDIT_小村仁美 / Hitomi Komura(CGWORLD)