色彩設計に従いつつ、リニアな撮影を取り入れる方法
概論
色彩設計によって設定された色味に従うには、色+影(乗算)では成し得ない場合が多い
そのため、色+影(50%透過)で一つ一つcolorchangeした方が合理的
だが、AEでの撮影において合成モードによる加減算の処理を行った方が、一々colorchangeするよりも楽な場合がある
色彩設計によって設定された色味の中間色を合成時の比率によって表現できる
影をmultiplyする場合においては、透明度=影の濃さとしてパラメトリックにできる
ハイライトをadd/screenする場合においては、透明度=ハイライトの濃さとしてパラメトリックにできる
→ 色彩設計によって設定された色味を、元の色味と設定されるべき合成モードから逆算し、撮影時に加えると、元の色彩設計を変えることなく、中間色が規定されたより自然な撮影が可能なのではないか?
あるいは単純に、色面から影色までのcolorama, グラデーションマップで達成することはできないか?
もしくは、2番目のグラデーションマップによる再現のより高度な一般化として、影・通常・明、各種シーンにおける色彩設計からLUTを算出し、撮影時に適用することで、上記の目標を達成できないか?
/icons/hr.icon
具体的な手法
基本的には色彩設計に基づきつつ、撮影時に設計にはない中間色をどのように表現するかという部分に着目する。
手順の骨子
1) ベース色Bを決める(設計の色票から拾う)
2) 目標の影色/ハイライト色Cを決める(設計の指示や作画から)
3) 合成モードを決める(下記表)
4) 可能なら逆算でレイヤ色Sを求め、合成100%で載せる
5) 逆算が不安定な場合はグラデーションマップやLUTで統制する
運用原則
厳密再現を優先するときは「合成レイヤは不透明100%」。
色を解に合わせる。透明度で強度調整は色ずれを生む。
制作効率を優先するときは、設計許容範囲内で透明度運用を許す。
その場合の誤差方向を把握しておく。
/icons/hr.icon
逆算して撮影する方法
目指す色面によって用いる合成モードは変わってくると思うが、基本的には以下に従えると思う
影系→multiply, color burn, linear burn, substract, darken
ハイライト系→add(color dodge), screen, soft light, lighten
シーンカラー系→hard light, overlay, pin light, soft light
よって、色彩設計の影色を色面から逆算することで、影に設定すべき色と合成モードを考えることが可能?
逆算式(リニア空間、各チャンネル独立、C=合成結果、B=下地、S=載せるレイヤ色)
Multiply
C = B*S → S = C/B(B=0のとき未定義。Cも0であることが条件)
B=0ということは黒色面ということなので、乗算する色は何色でもいいということにもなる。
Add(Linear)
C = B+S → S = C-B(クリップ注意)
Subtract
C = B-S → S = B-C
Screen
C = 1-(1-B)(1-S) → S = 1-(1-C)/(1-B)(B=1は未定義。C=1固定)
つまりB=1ということは白色面ということなので、どんな色をscreenしても白になってしまう
Color Dodge
C = min(1, B/(1-S)) → S = 1 - B/C(C>0, クリップ域は喪失)
Color Burn
C = 1 - min(1, (1-B)/S) → S = (1-B)/(1-C)(C<1, ゼロ割回避)
Linear Burn
C = B+S-1 → S = C-B+1
Overlay
B<0.5: C=2BS → S=C/(2B) / B≥0.5: C=1-2(1-B)(1-S) → S=1-(1-C)/(2(1-B))
Hard Light
OverlayのBとS入替と同等。条件反転で解く。
Lighten/Darken/Pin Light/Soft Light
一意解にならない領域あり。近似または他手法へ。
実務ポイント
厳密一致は「不透明100%でSを解に設定」が最短。
透明度αを併用すると C = (1-α)B + α·f(B,S) となり各チャンネルで矛盾が出やすい。
端値(B=0,1やC=0,1)では解が不定または飽和。
マスクで除外し別経路で処理。
そもそも逆算できるのか問題
上述の通り、一部の合成モードでは、非線形であるが故にそのまま逆算できない場合がある。
逆算できる(線形である)合成モードは以下の通り:
multiply
影色から元の色をdivideすることで取得可能
ただし、影色面が黒の時は、影色は必ず黒になる。それ以外は逆算が定義できる。
add, substract
影色から元の色をsubstract,addすることで取得可能
ただし、白飛びしたり黒跳びしてしまっていたら逆算不可能
逆算はできるが、条件によっては元の色味を再現できない恐れあり
overlay, screen, color burnなど
補足
screenやoverlayは端値で不定や飽和が起きる。端値を避ける設計か、別パスの置換が必要。
color dodge/burnはクリップ領域で情報が失われる。厳密な逆解は存在しないので、近傍の最小二乗で近似するのが現実的。
そのため、逆算できない場合は、その合成モードによって撮影したとしても期待通りの中間色の表現にならない可能性あり。
回避策
モードを「線形で単調」なものに寄せる(Add/Multiply/Linear Burn/Linear Light)
色は逆算、強度はマットで制御(不透明100%を維持し、範囲指定はマスクや深度で)
/icons/hr.icon
グラデーションマップから表現する方法
考え方
ベースの輝度(もしくは相対照度)を1Dに射影し、指定パレットへ置換する。
Colorama/グラデーションマップで「平面→半影→影→リム」のキーポイントを設計色で打つ。
実装案
1) 輝度は線形Y=0.2126R+0.7152G+0.0722で算出(表示ガンマではなくリニア)
2) グラデーションのノットを色票に合わせて配置。境界はスプラインではなく分割点を明示。
3) 影色が色相回転を含む場合は、先にHSV/HSLへ変換して色相補間→RGBに戻して適用。
運用
色面ごとに別のマップを持てる。ショット内で一括変更もしやすい。
半透明馴染ませは別レイヤのライトラップで調整。
欠点として、色面と影色のペアごとに設定しないといけない部分
プリセット化と命名規則で運用負荷を抑える。共有マップ+差分マップで管理。
/icons/hr.icon
LUTを作り出す方法
狙い
シーン(環境光色、露出、トーンカーブ)を含む色設計を、1つの変換として外部化。
手順
1) グレースケールとカラーチャートのテストプレートを作成(リニア)。
2) 望ましい見た目になるよう調整レイヤ群でグレーディング。
3) 調整を. cubeの3D LUTとしてベイク(必要なら1Dシェイパー併用)。
4) 撮影では「ベース→影/ハイライトの素朴合成→LUT」で統一感を担保。
注意
LUTは文脈依存。シーンカラーが変わると作り直しが必要。
欠点として、シーンカラーが異なる時にLUTを作り直さないといけない可能性あり。また、それによりLUTとLUT同士を補間するLUTみたいなのも必要になるかも。
LUT間補間が必要なら、露出指標(例: mid grayの位置)でインデックスを取り、2個のLUTを線形補間するブレンドパイプを用意。
最適輸送問題を持ってくることもできそう・・・w
実務では「Base LUT + Show LUT + Shot Trim」の三段で分割。再生成範囲を狭める。
/icons/hr.icon
提案手法に基づいた応用例
影を追加したい
Multiply厳密一致
1) 目標影Cを決める
2) S = C/B を計算
3) 単色レイヤをS色にしてMultiply 100%
備考: B=0は別マスクで処理。ノイズを少量足すとバンディング回避。
半影の連続表現
ライト方向に沿った距離でマットを作り、Multiplyレイヤの露出を勾配で制御。
輪郭はライトラップ(Add 低強度)で環境馴染みを付加。
ハイライトを追加したい
Screen厳密一致
1) 目標ハイライトCを決める
2) S = 1-(1-C)/(1-B)
3) Screen 100%
Addで良い場合
S = C-B を色にしてAdd 100%。飽和しやすいが解は簡単。32bpc前提。
スペキュラと拡散を分離し、スペキュラのみAdd、拡散はScreenで柔らかく。
フレアを追加したい
物理的にはAdd/Linear Dodgeで積分。核は広いガウス、周囲にゴースト成分。
色収差はRGB半径差で擬似。高輝度はトーンマッピング前の段で生成。
フレア本体はLUTの前段、ゴースト色味はLUT後段で微調整。
/icons/hr.icon
まとめと更なる手法の構想
まとめ
厳密再現=逆算+不透明100%。リニア空間で端値に注意。
運用効率=グラデーションマップ。統一感=LUT。
混在運用で「設計順守」と「作業速度」を両立させる。
構想
影/ハイライトの目標色をサンプル対から機械的に推定し、Sを自動算出するスクリプト化。
ショット露出に応じたLUTブレンドの自動化(mid gray一致での補間)。
メモ
32bpc、作業スペースはリニア化。「1.0ガンマでブレンド」をON。
Color Pickerは表示色と作業色の差に注意。数値は作業空間で管理。
不透明度で強度を変えたい場合は、色ずれを許容するか、マットで強度を変える。
加算系は容易にクリップする。常に32bpcで途中段はクリップさせない。
境界のにじみはライトラップと微量のグレインで馴染ませる。
LUTは目的分解(ベース/ショールック/トリム)で可搬性を高める。
端値(0/1)は別パスで処理。逆算の未定義域を回避。
検証用に「B, S, C」を3段で並べるビューワを作ると差異が把握しやすい。
/icons/hr.icon
補足: lightenなどの逆演算が一意解にならない理由
Lighten
定義: $ C=\max(B,S)
不定
$ C=B \land S\le B \Rightarrow \text{任意の }S\text{ で同じ }C
$ C=S \land B\le S \Rightarrow \text{任意の }B\text{ で同じ }C
結論
多対一。逆算で $ S は一意に定まらない領域が広い
Darken
定義: $ C=\min(B,S)
不定
$ C=B \land B\le S \Rightarrow \text{任意の }S\text{ で同じ }C
$ C=S \land S\le B \Rightarrow \text{任意の }B\text{ で同じ }C
結論
Lighten と対称で多対一
Pin Light
定義(各チャンネル)
code:tex
C=
\begin{cases}
\min(B,2S) & (S<\tfrac{1}{2})\\
B & (S=\tfrac{1}{2})\\
\max(B,2S-1) & (S>\tfrac{1}{2})
\end{cases}
不定(代表)
$ S<\tfrac{1}{2},\ 2S\le B \Rightarrow C=2S\ (\text{Bに無関係})
$ S<\tfrac{1}{2},\ 2S> B \Rightarrow C=B\ (\text{B固定で }S\text{ が範囲内で可})
$ S>\tfrac{1}{2},\ 2S-1\ge B \Rightarrow C=2S-1\ (\text{Bに無関係})
$ S>\tfrac{1}{2},\ 2S-1< B \Rightarrow C=B\ (\text{B固定で }S\text{ が範囲内で可})
結論
閾値 $ S=\tfrac{1}{2} を境に min/max の台地が生じ多対一
Soft Light(Photoshop/SVG 系)
定義
code:latex
code:tex
C=
\begin{cases}
B-(1-2S),B(1-B) & (S\le \tfrac{1}{2})\\
B+(2S-1),\bigl(g(B)-B\bigr) & (S>\tfrac{1}{2})
\end{cases}\\
\quad
g(B)=
\begin{cases}
((16B-12)B+4)B & (B\le \tfrac{1}{4})\\
\sqrt{B} & (B>\tfrac{1}{4})
\end{cases}
単調性($ S に関して)
$ \frac{\partial C}{\partial S}=2B(1-B)\\ (>0\ \text{for }B\in(0,1))\ \ (S\le \tfrac{1}{2})
$ \frac{\partial C}{\partial S}=2\bigl(g(B)-B\bigr)\\ (>0\ \text{for }B\in(0,1))\ \ (S> \tfrac{1}{2})
理論上、内部領域では $ S\mapsto C は単調増加で可逆
非一意となる条件
端値: $ B=0\Rightarrow C=0,\ B=1\Rightarrow C=1 ($ S に無関係)
不透明度併用: $ C=(1-\alpha)B+\alpha,\text{SoftLight}(B,S) (同一 $ C を与える $ S が連続)
量子化や非線形空間合成で段階化し実効的に多対一
結論
Lighten/Darken は定義が max/min のため広範に多対一。Pin Light は閾値基準の min/max 切替により台地が発生。Soft Light は数式上は可逆だが端値・α合成・量子化で実務的に非一意領域が生じる。
/icons/hr.icon
あとがき
これ思い出したAodaruma.icon
https://www.youtube.com/watch?v=u6MIQMaJT7M
大筋だけ考えて書き、あとはchatGPTに補足させた