ガンマ補正とリニアワークフロー
Category : Tips
DAZ Studio 3(以下DS3)やCarraraのレンダリング設定にはGamma(Correction)という項目があります。以前から私はこれをただのポストワークとしての色調補正だと思っていました。DSでは何も考えずにこの数値を上げるとレンダリング画像の中間調が持ち上がって白っぽくなるだけですしね。
ところが、以前寄せていただいたGA-jさんのコメントから、これがリニアワークフローを実現するための設定なのだという事がわかりました。
私なりに理解した事をまとめますと、通常私たちはガンマ2.2のかかったモニタで作業しているわけです。ガンマについては「ディスプレイガンマ」で検索してみて下さい。しかし3DCGソフトが内部で計算している空間(colorspace)はガンマ1.0なのです。極端な言い方をすると、私たちはガンマ1.0の画像として出力されたものを、ガンマ2.2の画像として扱ってしまっているということなのです(実際はテストレンダを繰り返してライティングの調整をするわけですから、そんなにまずい事にはなっていないと思います)。
そこで登場するのがGamma Correction(ガンマ補正)という設定です。
ここにはユーザーが使っているモニタのガンマ値を入れます。すると、3DCGソフトはレンダリング結果をモニタの特性に合わせて色調補正してくれます。これによって、3DCGソフトが計算した真の色を私たちも見る事ができるという仕組みです。
今回はPoserコンテンツを扱える低価格3DCGソフトでのリニアワークフローがどういう状況になっているかを私なりに調べてみました。かなりコアな話ですよ〜。
今回の記事は私も研究中のものなので、誤解している内容があるかもしれません。ご了承の上、お読み下さい。

※Poser 8の対応について訂正しました。
■ガンマの実情
モニタにガンマが掛かっている理由は、最初のテレビの電気的特性だったとか、人間の目の特性に合わせてあるためとか言われています。モニタの調整具合で変動しますが、Windowsではガンマ2.2で、Macも現在はそうです(MacOSX10.6 SnowLeopard以前は1.8)。コンパクトカメラのカラープロファイルやモニタのスペックでよく聞くsRGBというのもガンマ2.2相当になります。
カラープロファイルとは、その画像が作成された色空間(color space)を示すものです。例えば、ガンマ2.2のモニタで描いた画像はガンマ2.2のカラープロファイルを持ちます(それがカラープロファイルとしてファイルに埋め込まれることは稀ですが)。また、Camera RAW画像やHDR画像はガンマ1.0(リニアデータ)です。
リニアワークフローを行う上で重要なのは、使っているモニタのキャリブレーションです。これを先にやっておかないと始まりません。
自分のモニタのガンマ値がいくつなのかを確認するには、「おれディスクロージャー - ガンマ補正の話」のチャートが分かりやすいと思いました。
この記事ではモニタガンマを2.2として話を進めていきます。
■リニアワークフローの例
リニアワークフローをすれば何が良くなるの?という疑問は当然あると思います。
答えとしては、物理的に正しいライティングができるようになる、という事です。
例えば、球体に真横から平行光源を当てたとします。
上がガンマ補正をしない状態で、下がガンマ補正をした状態です。

条件を考えれば、球体の半分までライトが当たっている下が正しいと言えます。
今度は、平面を点光源で照らした状況を考えてみましょう。
上がガンマ補正をしない状態で、下がガンマ補正した状態です。

ガンマ補正をすることで、光源に近い部分から外へ滑らかなグラデーションが描画されます。
3DCGによる画像の独特のクセが、リニアワークフローを行うことによって一つ無くなる、と考えられます。
■リニアワークフロー
「リニア空間と物理的に正しいライティング」とそのスライドデータを読み、よりリアリティのあるライティングをするためにはリニアワークフローを取り入れる事が必須だということが私にも分かりました。3DCGにおける理想的なリニアワークフローがどういうものかと言うのは、Blender2.5のカラーマネージメントの紹介記事(和訳はコチラ)のパイプラインの図がその通りのものだと思います。この図で重要な点は、「Gamma to Linear」「Linear to Gamma」という部分です。前述の通りPCのモニタで調整された画像はガンマ2.2を持ちます。これはテクスチャやカラーセレクタによる色指定も同じです。
そこでその画像や色データをレンダラーに渡す時に必要なのが「Gamma to Linear」という処理で、ガンマデータをリニアデータへ変換します。これを「リニア変換」とします。
そしてレンダラーから出力された画像には「Linear to Gamma」という処理が加えられ、リニアデータからガンマデータへ変換されます。ここがGamma Correction「ガンマ補正」というわけです。
この「リニア変換」「ガンマ補正」を備えた3DCGソフトなら、リニアワークフローを実現できるという事になります。
余談ですが、リニアワークフローは3DCGだけのものではありません。
画像をリニアデータに直してから拡大縮小をするソフトというのもありました。より高品質な処理ができるようです。
■ガンマ補正
「ガンマ補正」はリニアデータをガンマを持つモニタへ色調を変えずに映すための補正値で、使用しているモニタのガンマ値を入力します。
レンダリング設定でGammaという項目がある3DCGソフトは多いと思います。例えばここに2.2という数値を入れると、実際にはモニタのガンマを打ち消すために、その逆数(1/2.2=0.4545)でレンダリング画像に対して色調補正を行うわけです。
■リニア変換
自分の使っているソフトがリニアワークフローを保証しているかどうかを調べるにはどうすればいいのでしょうか。「ガンマ補正」に関しては、レンダリングの設定に項目があるのですぐに分かります。「リニア変換」、特にカラーの変換については、おそまきさんの「(続) 3DCGとガンマ調整 - 色合歪み編」を参考に確認方法を考えてみました。
確認したいソフトでRGB(255,128,0)のオレンジ色の物体をシーンに配置します。そして白100%の平行光源を当てて(アンビエントライトは真っ黒にするのが望ましいです)、ガンマ補正2.2に設定してレンダリングします。

リニア変換が働いていなければ左の様に物体の色がレモン色へ変化してしまいます。
リニア変換が働いていれば右の様に物体の色はオレンジ色のままです。
※この項には関係ありませんが、ハイライト周辺の色の変化がガンマ補正によって無くなっている点も要注目だと思います。
■ソフトごとの対応
では、Poserコンテンツを扱える3DCGソフトではリニアワークフローができるのか?調べてみました。
・Poser 7
ガンマ補正さえできません。
・Poser 8
レンダリングデータ(おそらくHDR)をLDRへ変換する際のトーンマッピングのパラメータを調整することができます。
・Poser Pro / Pro 2010
可能?
Render設定でGamma Correctionを指定すれば、入力されるテクスチャをガンマ補正の値を持つものとして扱い、リニア変換をしてくれます(Smithmicro「Gamma Correction and Poser Pro」)。さらに、Textureノードのテクスチャ選択ダイアログで個別にガンマ値を指定する事もできます。カラーセレクタによる色のリニア変換ができるかどうかは不明です。
・Shade
おそまきさんが公開されている「DeGamma:色空間線形化スクリプト」で可能に。
この記事を書くにあたって大変参考にさせていただいたサイトです。「3DCGとガンマ調整」の記事は分かりやすく噛み砕いて説明されていて読みやすいです。DSからShadeへデータ変換するShade用プラグインも公開されています。
・CINEMA4D
DeGammaというサードパーティープラグインで可能になるようです。
また、R12からはプロジェクト設定にそのまま「リニアワークフロー」というオプションが追加されています。
・Carrara 8
可能です。
Render設定のGamma Correctionに値を入れるだけで、すべてCarraraにお任せで大丈夫です。ただ、初期設定のAmbient Brightness 20%は明るすぎます。また、SSSシェーダーは設定しなおさないといけないようです。
・Bryce 7
ガンマ補正が可能です。ただし、補正値を設定するところが見当たりません。Onにしてレンダリングするとガンマ1.6に補正されるようです。
・DAZ Studio 3
ガンマ補正のみ可能です。
■DAZ Studioでのリニアワークフロー
DS3ではガンマ補正はできるものの、リニア変換はしてくれません。しかし、将来的にそれを実現させるための種はあるのです。DSに読み込まれたテクスチャは、tdlmake.exeというプログラムで独自形式(中身は8bitTIFF)に変換され、レンダラーに渡されます。tdlmakeには変換元の画像ファイルの色空間を指定するオプションがあり、それを使えばテクスチャのリニア変換が可能だと思われます(3Delight8.5マニュアル「Texture Mapping in Linear Space」)。
また、DAZフォーラムでシェーダー開発者へ向けてGreggoryPeccary氏よりガンマ補正の提言がなされています。
さて、現状のDS3でリニアワークフローを実現させるためにはどうするのか、考えてみました。
「ガンマ補正」にはRenderタブのGammaに2.2(ディスプレイガンマを入れます)を指定するだけです。
しかし「リニア変換」は手作業でするしかありません。あらかじめ用意したリニアデータをDSへ読み込んでやるのです。
テクスチャのリニア変換にはフリーの画像ビューワーとして有名な「IrfanView」のBatch Conversionでガンマ補正0.45を指定して変換しました。これにより中間調を下げた暗い画像になります。変換が必要なのは基本的にディフューズテクスチャと環境マップ用のテクスチャだけです。
問題はカラーセレクタで色を指定している部分で、これも変換が必要かどうかは判断が難しいです。サーフェイスの色としてカラーを指定するDiffuse ColorとAmbient Colorは変換が必要でしょう。しかし強度として使っているカラーは変換の必要は無い場合が多いです。ただしご注意下さい!!突き詰めすぎて、50%グレーは本当に50%グレーなのかとか考え出すと夜眠れなくなります(゚_゚;)
実際にカラーをリニア変換する方法ですが、RGBの各値x(0-255)に対してガンマ2.2からリニアに直すには
(x / 255) ^ 2.2 * 255
という式を使います。
この式で変換するとRGB(255,128,0)の色はRGB(255,56,0)に変化します。
前準備を済ませ、V4フィギュアをレンダリングしてみました。
左から、(a)ガンマ補正を全く考えないでレンダリングしたもの、(b)ガンマ補正2.2でレンダリングしたもの、(c)手作業のリニア変換をしたマテリアルをガンマ補正2.2でレンダリングしたもの(リニアワークフロー)、になります。



(b)は単純に(a)の画像にガンマ補正2.2を実行した形になります。
(c)はなるべく色調が変わらないように努めましたが、それでも少し変わってしまいました。
(a)と(c)を比較すると、ちょっとコントラストが低くなっただけ?と思われるかもしれません。これは、ライト設定を全く同じにしているのも原因の一つだと思われます。この状況では、ちょっと暗部が持ち上がったぐらいしか明確な差は無いのです。
ところが、ライトの設定で差が出始めます。次のレンダリング画像は、上のものからメインライトの強度を2倍にしたものです。


リニアワークフローを行わなかった左の画像はメインライトが当たっている部分が白とびしてしまいました。しかしリニアワークフローを行うことで、自然な感じで明るくなっています。
IBLライトを使ったレンダリングも試してみました。IBLライトのソースとして使われるHDR画像はリニアデータなので、リニアワークフローと親和性が高いはずです。
先ほどのシーンのライトをUberEnvironment2のKHParkプリセット+Distant Light1灯に変えてレンダリングしました。


本当のIBLライトはこんなのだったの?と驚くほど色調が変化します。また、プリセットそのままではきつすぎるライトも、許容範囲内に収まるようになります。ついでにAOの発生具合も心なしか自然になっています。
今回は無理矢理DS3でリニアワークフローを行ってみました。結果は理想的なものでしたが、手間がかかるのと、レンダリングしないと本来の色がわからないという点が問題です。さらには、リニアワークフローを考慮していないシェーダーも存在すると思われます。
ガンマ補正が実装されたのもDS3からですし、まだこれからという部分もあります。DS4にはリニア変換も実装!といけばうれしいのですが。
そういえばLuxRenderエクスポートプラグインではどうなるのでしょうね。
今回のツールと画像の素材はこちら
ところが、以前寄せていただいたGA-jさんのコメントから、これがリニアワークフローを実現するための設定なのだという事がわかりました。
私なりに理解した事をまとめますと、通常私たちはガンマ2.2のかかったモニタで作業しているわけです。ガンマについては「ディスプレイガンマ」で検索してみて下さい。しかし3DCGソフトが内部で計算している空間(colorspace)はガンマ1.0なのです。極端な言い方をすると、私たちはガンマ1.0の画像として出力されたものを、ガンマ2.2の画像として扱ってしまっているということなのです(実際はテストレンダを繰り返してライティングの調整をするわけですから、そんなにまずい事にはなっていないと思います)。
そこで登場するのがGamma Correction(ガンマ補正)という設定です。
ここにはユーザーが使っているモニタのガンマ値を入れます。すると、3DCGソフトはレンダリング結果をモニタの特性に合わせて色調補正してくれます。これによって、3DCGソフトが計算した真の色を私たちも見る事ができるという仕組みです。
今回はPoserコンテンツを扱える低価格3DCGソフトでのリニアワークフローがどういう状況になっているかを私なりに調べてみました。かなりコアな話ですよ〜。
今回の記事は私も研究中のものなので、誤解している内容があるかもしれません。ご了承の上、お読み下さい。

※Poser 8の対応について訂正しました。
■ガンマの実情
モニタにガンマが掛かっている理由は、最初のテレビの電気的特性だったとか、人間の目の特性に合わせてあるためとか言われています。モニタの調整具合で変動しますが、Windowsではガンマ2.2で、Macも現在はそうです(MacOSX10.6 SnowLeopard以前は1.8)。コンパクトカメラのカラープロファイルやモニタのスペックでよく聞くsRGBというのもガンマ2.2相当になります。
カラープロファイルとは、その画像が作成された色空間(color space)を示すものです。例えば、ガンマ2.2のモニタで描いた画像はガンマ2.2のカラープロファイルを持ちます(それがカラープロファイルとしてファイルに埋め込まれることは稀ですが)。また、Camera RAW画像やHDR画像はガンマ1.0(リニアデータ)です。
リニアワークフローを行う上で重要なのは、使っているモニタのキャリブレーションです。これを先にやっておかないと始まりません。
自分のモニタのガンマ値がいくつなのかを確認するには、「おれディスクロージャー - ガンマ補正の話」のチャートが分かりやすいと思いました。
この記事ではモニタガンマを2.2として話を進めていきます。
■リニアワークフローの例
リニアワークフローをすれば何が良くなるの?という疑問は当然あると思います。
答えとしては、物理的に正しいライティングができるようになる、という事です。
例えば、球体に真横から平行光源を当てたとします。
上がガンマ補正をしない状態で、下がガンマ補正をした状態です。

条件を考えれば、球体の半分までライトが当たっている下が正しいと言えます。
今度は、平面を点光源で照らした状況を考えてみましょう。
上がガンマ補正をしない状態で、下がガンマ補正した状態です。

ガンマ補正をすることで、光源に近い部分から外へ滑らかなグラデーションが描画されます。
3DCGによる画像の独特のクセが、リニアワークフローを行うことによって一つ無くなる、と考えられます。
■リニアワークフロー
「リニア空間と物理的に正しいライティング」とそのスライドデータを読み、よりリアリティのあるライティングをするためにはリニアワークフローを取り入れる事が必須だということが私にも分かりました。3DCGにおける理想的なリニアワークフローがどういうものかと言うのは、Blender2.5のカラーマネージメントの紹介記事(和訳はコチラ)のパイプラインの図がその通りのものだと思います。この図で重要な点は、「Gamma to Linear」「Linear to Gamma」という部分です。前述の通りPCのモニタで調整された画像はガンマ2.2を持ちます。これはテクスチャやカラーセレクタによる色指定も同じです。
そこでその画像や色データをレンダラーに渡す時に必要なのが「Gamma to Linear」という処理で、ガンマデータをリニアデータへ変換します。これを「リニア変換」とします。
そしてレンダラーから出力された画像には「Linear to Gamma」という処理が加えられ、リニアデータからガンマデータへ変換されます。ここがGamma Correction「ガンマ補正」というわけです。
この「リニア変換」「ガンマ補正」を備えた3DCGソフトなら、リニアワークフローを実現できるという事になります。
余談ですが、リニアワークフローは3DCGだけのものではありません。
画像をリニアデータに直してから拡大縮小をするソフトというのもありました。より高品質な処理ができるようです。
■ガンマ補正
「ガンマ補正」はリニアデータをガンマを持つモニタへ色調を変えずに映すための補正値で、使用しているモニタのガンマ値を入力します。
レンダリング設定でGammaという項目がある3DCGソフトは多いと思います。例えばここに2.2という数値を入れると、実際にはモニタのガンマを打ち消すために、その逆数(1/2.2=0.4545)でレンダリング画像に対して色調補正を行うわけです。
■リニア変換
自分の使っているソフトがリニアワークフローを保証しているかどうかを調べるにはどうすればいいのでしょうか。「ガンマ補正」に関しては、レンダリングの設定に項目があるのですぐに分かります。「リニア変換」、特にカラーの変換については、おそまきさんの「(続) 3DCGとガンマ調整 - 色合歪み編」を参考に確認方法を考えてみました。
確認したいソフトでRGB(255,128,0)のオレンジ色の物体をシーンに配置します。そして白100%の平行光源を当てて(アンビエントライトは真っ黒にするのが望ましいです)、ガンマ補正2.2に設定してレンダリングします。

リニア変換が働いていなければ左の様に物体の色がレモン色へ変化してしまいます。
リニア変換が働いていれば右の様に物体の色はオレンジ色のままです。
※この項には関係ありませんが、ハイライト周辺の色の変化がガンマ補正によって無くなっている点も要注目だと思います。
■ソフトごとの対応
では、Poserコンテンツを扱える3DCGソフトではリニアワークフローができるのか?調べてみました。
・Poser 7
ガンマ補正さえできません。
・Poser 8
レンダリングデータ(おそらくHDR)をLDRへ変換する際のトーンマッピングのパラメータを調整することができます。
・Poser Pro / Pro 2010
可能?
Render設定でGamma Correctionを指定すれば、入力されるテクスチャをガンマ補正の値を持つものとして扱い、リニア変換をしてくれます(Smithmicro「Gamma Correction and Poser Pro」)。さらに、Textureノードのテクスチャ選択ダイアログで個別にガンマ値を指定する事もできます。カラーセレクタによる色のリニア変換ができるかどうかは不明です。
・Shade
おそまきさんが公開されている「DeGamma:色空間線形化スクリプト」で可能に。
この記事を書くにあたって大変参考にさせていただいたサイトです。「3DCGとガンマ調整」の記事は分かりやすく噛み砕いて説明されていて読みやすいです。DSからShadeへデータ変換するShade用プラグインも公開されています。
・CINEMA4D
DeGammaというサードパーティープラグインで可能になるようです。
また、R12からはプロジェクト設定にそのまま「リニアワークフロー」というオプションが追加されています。
・Carrara 8
可能です。
Render設定のGamma Correctionに値を入れるだけで、すべてCarraraにお任せで大丈夫です。ただ、初期設定のAmbient Brightness 20%は明るすぎます。また、SSSシェーダーは設定しなおさないといけないようです。
・Bryce 7
ガンマ補正が可能です。ただし、補正値を設定するところが見当たりません。Onにしてレンダリングするとガンマ1.6に補正されるようです。
・DAZ Studio 3
ガンマ補正のみ可能です。
■DAZ Studioでのリニアワークフロー
DS3ではガンマ補正はできるものの、リニア変換はしてくれません。しかし、将来的にそれを実現させるための種はあるのです。DSに読み込まれたテクスチャは、tdlmake.exeというプログラムで独自形式(中身は8bitTIFF)に変換され、レンダラーに渡されます。tdlmakeには変換元の画像ファイルの色空間を指定するオプションがあり、それを使えばテクスチャのリニア変換が可能だと思われます(3Delight8.5マニュアル「Texture Mapping in Linear Space」)。
また、DAZフォーラムでシェーダー開発者へ向けてGreggoryPeccary氏よりガンマ補正の提言がなされています。
さて、現状のDS3でリニアワークフローを実現させるためにはどうするのか、考えてみました。
「ガンマ補正」にはRenderタブのGammaに2.2(ディスプレイガンマを入れます)を指定するだけです。
しかし「リニア変換」は手作業でするしかありません。あらかじめ用意したリニアデータをDSへ読み込んでやるのです。
テクスチャのリニア変換にはフリーの画像ビューワーとして有名な「IrfanView」のBatch Conversionでガンマ補正0.45を指定して変換しました。これにより中間調を下げた暗い画像になります。変換が必要なのは基本的にディフューズテクスチャと環境マップ用のテクスチャだけです。
問題はカラーセレクタで色を指定している部分で、これも変換が必要かどうかは判断が難しいです。サーフェイスの色としてカラーを指定するDiffuse ColorとAmbient Colorは変換が必要でしょう。しかし強度として使っているカラーは変換の必要は無い場合が多いです。ただしご注意下さい!!突き詰めすぎて、50%グレーは本当に50%グレーなのかとか考え出すと夜眠れなくなります(゚_゚;)
実際にカラーをリニア変換する方法ですが、RGBの各値x(0-255)に対してガンマ2.2からリニアに直すには
(x / 255) ^ 2.2 * 255
という式を使います。
この式で変換するとRGB(255,128,0)の色はRGB(255,56,0)に変化します。
前準備を済ませ、V4フィギュアをレンダリングしてみました。
左から、(a)ガンマ補正を全く考えないでレンダリングしたもの、(b)ガンマ補正2.2でレンダリングしたもの、(c)手作業のリニア変換をしたマテリアルをガンマ補正2.2でレンダリングしたもの(リニアワークフロー)、になります。



(b)は単純に(a)の画像にガンマ補正2.2を実行した形になります。
(c)はなるべく色調が変わらないように努めましたが、それでも少し変わってしまいました。
(a)と(c)を比較すると、ちょっとコントラストが低くなっただけ?と思われるかもしれません。これは、ライト設定を全く同じにしているのも原因の一つだと思われます。この状況では、ちょっと暗部が持ち上がったぐらいしか明確な差は無いのです。
ところが、ライトの設定で差が出始めます。次のレンダリング画像は、上のものからメインライトの強度を2倍にしたものです。


リニアワークフローを行わなかった左の画像はメインライトが当たっている部分が白とびしてしまいました。しかしリニアワークフローを行うことで、自然な感じで明るくなっています。
IBLライトを使ったレンダリングも試してみました。IBLライトのソースとして使われるHDR画像はリニアデータなので、リニアワークフローと親和性が高いはずです。
先ほどのシーンのライトをUberEnvironment2のKHParkプリセット+Distant Light1灯に変えてレンダリングしました。


| Character: | MH Rain for V4 |
|---|---|
| Hair: | Wet Hair |
| Costume: | Bikini for She Freak V4 |
| Shader: | UberEnvironment2 |
本当のIBLライトはこんなのだったの?と驚くほど色調が変化します。また、プリセットそのままではきつすぎるライトも、許容範囲内に収まるようになります。ついでにAOの発生具合も心なしか自然になっています。
今回は無理矢理DS3でリニアワークフローを行ってみました。結果は理想的なものでしたが、手間がかかるのと、レンダリングしないと本来の色がわからないという点が問題です。さらには、リニアワークフローを考慮していないシェーダーも存在すると思われます。
ガンマ補正が実装されたのもDS3からですし、まだこれからという部分もあります。DS4にはリニア変換も実装!といけばうれしいのですが。
そういえばLuxRenderエクスポートプラグインではどうなるのでしょうね。
今回のツールと画像の素材はこちら
![]() Bikini for She Freak V4 | ![]() Wet Hair |
![]() MH Rain for V4 |





