CRI Sofdec(Unreal Engine) v1
入門編08 色空間とガンマ補正の設定を行ったムービー再生の方法
この章では、色空間とガンマ設定を行ってSofdecムービーを再生する方法をご紹介します。
色空間を設定したムービー再生
色空間の変換
Unreal Engineは浮動小数点数でリニアRGBカラースペースを使用します。
これは、シーンをレンダリングするためのガンマ補正なしの広範囲のカラーを意味します。
一方、Sofdecムービーは、ビデオの圧縮率を向上させるために、Unreal Engineと異なる色空間(通常はRec 601またはRec 709で8bit整数)のYUVにエンコードされています。

フォーマットと色空間の違いにより、CriWareプラグインはムービーで使用されているYUVカラーをUnreal Engineで使用されるRGBカラーに変換します。
Sofdecムービーのテクスチャ:ManaTexture
ManaTextureは「コンポーネントテクスチャ」と呼ばれるサブテクスチャを保持するUTexture派生クラスです。
各テクスチャは、デコードされたムービーからのサブピクセルチャネルを保持します。3枚(Y,U,V) or 2枚(Y,UV) or 1枚のみ(RGB) + アルファムービー用のアルファチャネルを保持するテクスチャクラスです。プラットフォームとムービーフォーマット(SofdecPrime、H264、またはVP9)に応じて、コンポーネントテクスチャは内部的に逆方向になる場合がありますが、UE5のUIやAPIで使われるカラーチャネルは必ず3つ(Y、U、V)です。
コンポーネントテクスチャのある素材を使用する場合
変換はブループリント内で行われるべきです。
マテリアル関数 「Mana Color Space Converter」がこの目的を果たします。ブループリントマテリアルでは常に3つのテクスチャ(Y、U、V)を使用しますが、 シェーダコンパイラはムービーフォーマットとプラットフォームによって異なる数のテクスチャサンプルを 自動的に生成することがあります。
例えば、iPhoneのH264では、YおよびUVテクスチャ(NV12フォーマット)にムービーデコーダが出力されるため、 2つのテクスチャのみを使用したマテリアルが生成されます。ManaTextureで 「Render to Target」オプションがチェックされている場合
YUVからRGBへの変換はオフスクリーンで行われ、結果として生じるピクセルはManaTextureの内部表面に置かれます。
したがって、ManaTextureは古典的なテクスチャとして使用可能なRGBAテクスチャです。この余分なオフスクリーンレンダリングは、より多くのメモリと処理を使用する可能性があるため、 サイズの大きなムービーファイル(4K、VR …)では推奨されません。ムービー再生の色空間の設定方法について
コンポーネントテクスチャ(Y、U、V)を持つマテリアルを使用する場合

YUVからRGBへの変換は「Mana Color Space Converter」ノードで行われます。

色空間を変更するには「Mana Color Space Converter」ノードを選択して、詳細パネルで色の転送に使用する「Color Space」を選択します。

通常のSofdecムービーはRec.601でエンコードされているため、CriWareプラグインはデフォルトでRec.601の色空間に設定されています。
特定のプラットフォームでH264またはVP9でエンコードされたムービーを使用すると、RGBの色で出力されるため、色空間の設定は効果がありません。
RGBAテクスチャにレンダリングされたManaTexture付きのマテリアルを使用する場合

色空間は実際にはRec.601に固定されています。
ガンマ補正を設定したムービー再生
ガンマ補正は、画像の全体的な明るさとコントラストを制御します。
「色空間を設定したムービー再生について」で説明したようにSofdecムービーとUnreal Engineでは異なる色空間を使用します。
Unreal Engineではガンマ補正されていない線形のRGB(1.0)を使用していますが、Sofdecムービーでは使用しているYUV値に非線形のガンマ補正(2.2~2.4の係数を使っている)でsRGBに変換しています。
CriWareプラグインでは、sRGBからリニアRGBへのガンマ補正を削除する関数を使用することで変換に使われる係数を制御できます。
コンポーネントテクスチャ(Y、U、V)のマテリアルを使用する場合
ガンマ補正は「Mana Color Space Converter」ノードを使って行います。
ガンマ補正で使用する係数を変更する方法は2つあります。
詳細パネルから変更する
「Mana Color Space Converter」ノードを選択し詳細パネルに移動します。
「Use Gamma Exponent」にチェックを入れ「Const Gamma」に任意のガンマ値を設定します。
デフォルトは"2.2"です。
値を大きくすると画像が暗く、値を小さくすると画像が明るくなります。

ノードのガンマ値ピンから変更する
可変のfloat出力ノードを「Mana Color Space Converter」の「Gamma」ピンに繋げます。

ガンマ値を固定値や動的に変更できるMaterial Parameterになります。
RGBでレンダリングされたMana Textureを持つマテリアルを使用する場合
インポートしたSofdecムービーから生成したMana Textureをダブルクリックします。
Mana Textureの詳細にある「Render to Texture」の「Gamma Adjustment」でガンマ値を変更します。


値が0.0に設定されている場合、デフォルトのsRGB to RGB Linear関数が使用されます。
値を0.0以外の値に設定すると、ガンマ調整係数が使用されます。
値を大きくすると画像が暗く、値を小さくすると画像が明るくなります。
2.2の値はデフォルトのsRGBと同等の結果を線形関数に与えます。
HDRレンダリングでムービー再生
「色空間を設定したムービー再生について」で説明したように、Unreal Engineはチャネルごとに少なくとも16ビット浮動小数点数を持つRGB線形色空間を使用します。
シーンをレンダリングするのに幅広い色と明るさを使用することを意味し、このプロセスを'HDRR(High Dynamic Range Rendering)'と呼ばれます。
Sofdecムービーは最大で各チャネルあたり8ビット整数でYUVにエンコードされます。
使用される色と明るさの範囲は'SDR(Standard Dynamic Range)'と呼ばれます。
CriWareプラグインによって行われる色空間の変換はSDRからHDRへの変換になります。
一部のムービーでは変換後にダイナミックレンジが失われる為、不正確になる可能性があります。
この現象は高輝度照明を使用するシーンでよく発生します。

コンポーネントテクスチャ(Y、U、V)のマテリアルを使用する場合
リニア色空間への変換はマテリアル内で目的のシーンのレンダリングを行います。

RGBでレンダリングされたMana Textureを持つマテリアルを使用する場合
リニア色空間への変換は1チャネルあたり8ビットRGBAサーフェスで行われます。
これにより色と明るさの正確さが失われ、色の縞模様が現れることがあります。

回避策としてMana Textureの詳細パネルの「Render to Texture」で「HDRを有効」にチェックします。 Mana Textureのターゲットサーフェスのフォーマットをチャネルごとに16ビットfloat型に切り替えます。 変換によって生成された色の範囲を保持できますが、2倍のメモリ量を使用します。

精度が高いほど、色の縞が見えにくくなります。

Unreal Engine マニュアル参照
レンダリングとマテリアルの詳細については、Unreal Engineのドキュメントを参照してください。
レンダリング&グラフィック http://api.unrealengine.com/JPN/Engine/Rendering/
マテリアル http://api.unrealengine.com/JPN/Engine/Rendering/Materials/