土屋つかさの技術ブログは今か無しか

土屋つかさが主にプログラミングについて語るブログです。

#unity [ポスプロ]LUT(ラット)について

 技術書典9が無事閉幕しました。土屋のサークルの新刊も大変多くの方に手に取っていただきありがたい限りです。ブログで告知するのを完全に忘れてまして(!)ホントすみません。早めにエントリ記事を作ります。

 さて、次回技術書典10は年末予定(次もオンラインです)で、シェーダー本5はURPのポストプロセス処理周りの解説を考えてまして現在情報集め中です。すでに想像を超える沼っぽいことが判明してめげ気味なんですが頑張ります。

 今後作業の過程でまとまった物をアップしたりしなかったりする予定です。今回はLUT(ラット)について。LUTはそもそもデータ構造の用語なのですが、ポスプロでは特定の概念を指すようなので、それぞれについて解説します。

LUT(ラット)の元の意味

 LUTはルックアップテーブル(Look Up Table)の略称で、入力と出力が対応するデータ群のことを指します。例えば連想配列もLUTの一つです。入力の数に応じて1次元、2次元、3次元がよく使われます(連想配列は1次元LUT)。入力をインデックス指定する事も多く、n次元配列=n次元LUTと考えても良いです。

 シェーダープログラミングでLUTを使用する時、テクスチャデータとしてGPUに渡すのが一般的です。テクスチャデータにも1次元、2次元、3次元があり、用途に応じて使い分けます。例えば、グレースケールでのグラーデションをLUTとして使いたい場合は1次元テクスチャ(縦1ドット×横nドットのテクスチャと考えて良い)を使います。

 テクスチャとして渡したLUTを参照する方法ですが、いつもと同じようにテクスチャサンプリングでアクセスします。原理的にはテクスチャサンプリング自体が2次元LUTを使ったデータ参照処理と言えるでしょう(多分)。

LUT(ラット)のポスプロでの意味

 前述の通り、「LUT」という用語は特定のデータ種類を指しているわけではありません。しかし、ポストプロセス処理(というか映像分野)では、「LUT(ラット)」と言うと、暗黙的に「カラーグレーディング用途に用いる3次元LUT」の事を指すようです(わかりにくいな!)。

 「カラーグレーディング」についての詳細説明はここでは省略します(土屋がよく分かってないというのもある)。ここでは「あるカラー値を別のカラー値に変換すること」だと思ってください。

 LUTを使ったカラーグレーディングの仕組みは簡単で、RGB3チャンネルの各カラー値を入力にして3次元LUTを探索し、出力として対応するRGBカラー値を得ます。3次元LUTにはRGBのすべての組み合わせに対応する値が格納されていて、適切な変換カラー値を出力できるわけです。

 これも前述の通り、シェーダープログラミングでは、この3次元LUTのデータを、3次元テクスチャとしてビデオメモリに格納します。3次元テクスチャというのは、文字通り3次元のデータを持ったテクスチャです。例えば3ピクセル×3ピクセル×3ピクセルの3次元テクスチャは、27ピクセル分の情報を格納していることになります。

 さきほど「RGBのすべての組み合わせに対応する値が格納されていて」と書きましたが、実際にそれをするのは現実的ではありません。というのも、3次元テクスチャは解像度が上がると指数的に肥大化するためです。

 たとえば、RGB888を別のRGB888に変換する場合、3次元テクスチャを構成する要素数は256×256×256×3バイトが必要です。これは256×256サイズのテクスチャを256枚格納しているような物でして、普段如何にテクスチャ枚数を減らすかに奮闘しているのに、カラグレのためにそんなメモリの消費はできません(できませんよね?)。また、入力が8bitではなく16bitになった場合(HDR環境で必要になります)、現実的なサイズではなくなってしまいます。

 この問題については、ずっと小さな規模の3次元LUTを用意し、隙間は補間することで対応します。通常、この補間はテクスチャサンプリングの仕組みで行うのだと思いますが、LUTによっては専用の数式を使う場合もあるようです(詳細不明)。

 LUTデータは映像機器メーカーやフィルムメーカーなどが、様々な種類の物を公開しています(録画時(光→データ)と再生時(データ→光)で自社製品の特性に合わせたチューンがされているんじゃないかと思います)。また、業界標準のLUTや、自作LUTを使うこともあるようです。

UnityでのLUT対応

 UnityではPost-Processingのトーンマッピング処理においてLUTを使用します。現状では組み込みレンダーパイプラインとHDRPではLUTを設定するメニューがあります。URPでは組み込みの処理を選択するのみで、現状カスタムLUTを設定する方法はなく、カスタマイズが必要です*1

カラーグレーディング 101:映像制作における色調補正の基礎

*1:旧PostProcessingV2を使う方法もある筈だけど今も使える野かは知らない