前回は、Pixel Expressionで確認したPremultiplied / Unpremultipliedの処理を、GLSLシェーダー「Premultiplied Adjust」として再現しました。
今回は、もともと予定していた「Tone Adjustment」を取り上げます。
Tone Adjustmentは、映像のトーンを段階的に調整しながら、Pivot Gamma、Black、Highlight、Whiteを調整でき、Legal / Full間の信号レンジ変換にも対応しています。
Flameの浮動小数点数環境で、1.0を超えるハイライト情報を保持したまま調整できることも目的のひとつです。
Tone Adjustmentを作った経緯
あるユーザー様から、
「ビデオ素材をFullレンジでFlameに取り込んだ場合、CGなどのRGB素材が0.0〜1.0を超えることがありますが、
どのように扱えばよいですか?」
という問い合わせがありました。
Flameは浮動小数点数で処理されるため、内部では0.0〜1.0を超える値も保持することができます。
そこで、単純に0.0〜1.0へClampするのではなく、オーバーしているハイライト情報を保持しながら調整できないかと考えたのが、このシェーダーを作り始めたきっかけです。
最初は、ハイライト側の調整を目的としていましたが、検証を進める中で、Pivot Gamma、Black、Highlight、Whiteをそれぞれ調整できるようにして、さらに、Legal / Full間のレンジ変換も追加しました。
結果として、0.0〜1.0の範囲だけでなく、その外側にある値も含めて、暗部からハイライトまで段階的に調整できるシェーダーになっています。
Pivot Gamma / Pivot
まず、Tone Adjustmentの基本となるPivot Gammaから確認します。
Pivot Gammaは、一般的な0.0と1.0を固定したガンマ調整とは少し異なります。
まず、Rampから、Pivot GammaとPivotによってトーンカーブがどのように変化するか確認します。



デフォルト値
Pivot Gamma : 1.0 / Pivot : 0.5

Rampは線形。入力と出力が同じ状態。


Pivot Gamma : 1.0 → 0.7 / Pivot : 0.5

Pivot Gammaを0.7にすると、Pivotを基準として非線形に変化します。一般的な0.0 / 1.0を固定したGamma調整とは異なり、1.0側も変化します。


Pivot Gamma : 0.7 / Pivot : 0.5 → 0.3

Pivotを0.5から0.3へ変更すると、基準点が暗い側へ移動し、より広い範囲の明るい領域にPivot Gammaの効果がかかります。
この特性を利用して、暗部への影響を抑えながら明るい領域全体を調整し、その後、Highlight / Whiteでハイライトを段階的に調整できます。
Black 暗部を調整


2D Histogram : Minimum Out -0.100

Rampの後に2D Histogramを追加し、0.0以下の値を含むRampを作成します。



Black Start : 0.10 / Black Amount : 0.00 → 1.00

Black Startは、暗部の調整基準となる位置を設定します。
Black Amountをプラス側に変更すると、Black Startで設定した位置を基準として暗部が非線形に明るく変化します。


Black Start : 0.10 / Black Amount : 1.00 → -1.00

Black Amountをマイナス側に変更すると、Black Startで設定した位置を基準として暗部が非線形に暗く変化します。


Black Start : 0.10 / Black Width : 0.20 → 0.01

Black Widthは、Black Startを基準として、暗部の調整が影響する範囲を設定します。
値を小さくすると影響する範囲が狭くなり、Black Start付近から急速に元のトーンへ戻ります。
Highlight 明部を調整
Highlightでは、明るい領域を段階的に調整します。
まずHighlightで広い明部の範囲を調整し、その後、Whiteで明るさの上限付近を調整できます。
Pivot Gammaと組み合わせることで、暗部への影響を抑えながら、中間域から明部、さらに1.0を超える領域まで段階的にトーンを整えることができます。


2D Histogram : Maximum Out 1.100

Rampの後に2D Histogramを追加し、1.0以上の値を含むRampを作成します。



High Start : 0.65 / High Amount : 0.00 → 2.00

High Amountを変更すると、High Startで設定した位置を基準として明部が非線形に変化します。


High Start : 0.65 → 0.8 / High Amount : 2.00

High Startを0.65から0.8へ変更すると、調整の基準がより明るい側へ移動します。
White 明るさの上限付近を調整
Highlightで明部を調整したあと、Whiteではさらに明るさの上限付近を調整します。



White Start : 0.8 / White Amount : 0 → -1.00

White Amountを変更すると、White Startで設定した位置を基準として、明るさの上限付近が非線形に変化します。
実素材でトーンを調整
ここまではRampを使用して、それぞれのパラメータによるトーンの変化を確認しました。
次に実際の素材を使用して、各コントロールの役割を確認します。



Colour ManagementノードからRec.709 videoにビュートランスフォーム。

Waveform上でも、0.0〜1.0の範囲に収まっていることを確認できます。



ActionノードからRaysを追加。

浮動小数点数での運用なので、1.0を大幅に超えます。


Tone Adjustmentを追加。


Pivot Gamma : 1.00 → 0.80

Pivot Gammaで、0.5を基準に、暗部と明部を中間側へ寄せることで、いったん全体のコントラストを抑えます。


次にBlackで暗部を戻します。まず、調整を開始する位置を変更します。
Black Start : 0.10 → 0.30


続いてBlack Amountで、暗部を下げる量を調整します。
Black Amount : 0.00 → -1.00

0.30付近から暗部側にかけて下がります。


次にBlack Widthで、暗部の調整範囲を狭くします。
Black Width : 0.20 → 0.10

調整範囲が暗部側に絞られ、より深い暗部が下がります。
- Black Start : 調整範囲の基準となる位置
- Black Amount : 調整量。マイナス方向では暗部を下げます
- Black Width : 調整が影響する範囲


次にHighlightで明部を戻します。
High Amount : 0.00 → 0.50

0.65付近から明部側が持ち上がります。


続いてWhiteで、明るさの上限付近を調整します。
White Amount : 0.00 → -1.00


White Width : 0.40 → 0.10

0.90付近から上限側を抑え、ハイライトを1.0付近に収めます。
このように、Highlightで明部を持ち上げ、Whiteで上限付近を抑えることで、ハイライトの階調を残しながら1.0付近へ収めることができます。
調整前との差分を確認します。


暗部からハイライトまで、それぞれの調整が反映されていることを確認できます。


Rangeモード
最後にRangeモードを確認します。
Rangeモードでは、映像信号のレンジを Legal / Fullレンジ間で再マッピングできます。
Pivot GammaやBlack / Highlight / Whiteによるトーン調整とは独立した処理です。
Legal to Full
Legal Range(64〜940)をFull Range(0〜1023)へ再マッピングします。



-4%を含むQuickTimeカラーバーを、FlameからFullレンジ(Include YUV Headroom)として読み込みます。


RangeモードはBypassのため、入力された信号レンジのままです。


Legal to Fullに切り替え。

Waveformから、Legal Rangeの信号が0〜1023へ再マッピングされていることを確認できます。
Full to Legal
Full Range(0〜1023)をLegal Range(64〜940)へ再マッピングします。



QuickTime素材を、FlameからFullレンジ(Include YUV Headroom)として読み込みます。

素材内のRampは、0.0〜1.0の外側(Footroom / Headroom)まで保持されています。


Legalレンジとして取り込んだ場合、0.0〜1.0の範囲外はクランプされます。



タイトル素材(RGBA)をActionノードからブレンド。

タイトル素材(RGBA)は、Legalレンジの上限を超えています。



Tone Adjustmentから、Full to Legalに切り替え。

Waveformから、タイトル素材(RGBA)がLegal Range(64〜940)へ再マッピングされていることを確認できます。
Pivot Gammaの処理
今回作成したTone Adjustmentでは、Pivotを基準としたGamma処理をベースにしています。
以下は、その基本となる処理です。
float pivot_gamma(float x, float gamma, float pivot)
{
if (x <= 0.0)
return x;
pivot = max(pivot, 0.0001);
return pivot * pow(x / pivot, gamma);
}
まとめ
今回は、Pixel Expressionで試したTone調整をベースに、Tone Adjustment GLSLシェーダーを作成しました。
Pivot Gammaを中心に、Black / Highlight / Whiteを個別に調整できるようにし、最後に、Legal / Fullのレンジ変換も追加しています。
Rampだけでなく実素材でも確認することで、それぞれのパラメータがどの範囲に作用しているのか確認できました。
※カラーマネージメントや表示レンダリングの設定によって、0.0未満や1.0を超える値の表示やWaveform上の見え方が異なる場合があります。