モノトーンの伝説日記

Apex Legends, Splatoon, Programming, and so on...

OBS Studio などで使える LUT 生成プログラム(簡易)を Rust で書いてみた

 今後プログラムベースで生成した LUT を簡単に作るための基盤を作ってみた。

1. 昔は画像のみ,しかし今は。

 かなり前に画像で RGB full range にする LUT 作っていました。ただめんどくさいんですよねこれ。

mntone.hateblo.jp

 で,この PR。cube ファイルに対応したんですよね。

github.com

 cube ファイルってなんぞ? ってなるわけじゃないですか。検索したら Adobe の 1.0 spec があったんですよね。

https://wwwimages2.adobe.com/content/dam/acom/en/products/speedgrade/cc/pdfs/cube-lut-specification-1.0.pdf

 それで確認のためにソースコード読むじゃないですか。それっぽいんですよね。

https://github.com/obsproject/obs-studio/blob/990a07dc187688d567ab61bc569741edd2050cdf/plugins/obs-filters/color-grade-filter.c#L173-L238

 そういう感じで,最近 Rust 使って何か作ろうとしていたのですがモチベなくて投げ捨てて,Rust 環境はあったんで,Rust ベースで cube ファイルを書き出そう! って試みをしてみたんです。

2. 簡単で速い Rust

 main.rs に書いているだけでできました。とりあえず,sRGB の gamma を linear にして,それを BT.709 ベースに変換するっていう関数書きました。公開版はそこから多少手直しして,タイトル,ファイル名,そして変換関数を渡して LUT ファイルを生成できるように整形してます。ただし 8-bit 1:1 前提コードなので,10-bit や 12-bit は考慮していません。

 実行は Rust 実行環境のあるところで cargo run で OK です。output フォルダー化に 3 つのファイルが生成されます。

github.com

 色変換周りは昔書いたこちらを元に雑にコード書きました。

mntone.hateblo.jp

 関数を追加するだけで吐き出す LUT を追加できるので,結構実験的に遊べると思います。例えば,Display P3 向けに配信することが今後は増えると思っていて,一眼レフカメラ使って配信しているから,顔の部分は P3 で配信したいけど,ゲーム画面は BT.709 空間に収めて配信したいといったことも簡単にできると思います。

 本格的なツールではありませんし,色が正しく変換されている保証はできませんが,机上でお話を進めるだけならそこまで困ることはないと思います。

まとめ

 PC ゲームは本来 sRGB gamma から BT.709 gamma に変換して保存するべきなんでしょうけど,PC で再生する際,BT.709 gamma から sRGB gamma に変換してない環境も存在し,PC で見る分には変換しない方がいいのかもしれません。

 そもそも SDR の gamma って雰囲気調整って感じが強くて,

  • 昔の Mac: 1.8
  • Windows, 今の Mac (sRGB, Display P3): 2.2
  • HDTV (BT.709): 2.4
  • DCI-P3 (劇場): 2.6

といった感じで,バラバラなんですよね。WindowsmacOS が 2.2 であることから,スマフォも 2.2 がほとんどだと思うのですよ。そしたら,「配信だと sRGB gamma の方が適切なのでは?」とか思ったりしましたw

 いや,本当にどっちがいいんですかね…… 処理系によって gamma 適性になるように補正されているのとかちゃんと調査したことないですし,なんなら OS バージョンによっても処理が変わりそう…… なんて思うとあまり気にしてられないのかな? って思ったり……

 強いていえば,LUT 使って変換するより,「transfer characteristics」に sRGB と BT.709 指定をちゃんと使い分けた方が将来的な互換性の面とデータ保持のためにはいいのかな? って思ったりしました。