リニアワークフロー

Shade3D自身は、リニアワークフローには対応していないのですが
設定を調整することで、写実的なレンダリングを行うことができます。
チュートリアルの「リンゴのレンダリング」などでもレンダリング工程で説明はしていますが、改めてまとめることにします。

リニアワークフローとは ?

写真と区別がつかないようなレンダリングを行う場合、ディスプレイで表示されている色とレンダリング工程での色の扱いが異なる、というのを理解する必要があります。
また、人間の目自身もフィルタがかかっています。
それぞれがバラバラだと一貫性がないため、統一して管理するための流れを作るのが「リニアワークフロー」になります。
ここでは、ディスプレイ表示で最適になるように色合いを合わせる作業となります。
このリニアワークフローに対応している3DCGツールの場合は、
自然な色合いに自動的に対応できるかちょっとした調整だけで対応できるようになっています。
Shade3Dはリニアワークフローがシステム化されているわけではないため、理論を理解しながら手動で調整することになります。

以下の図は、入力としての画像や色を逆ガンマ補正(Gamma 1.0/2.2)を考慮してリニアにし、
シーンをレンダリング後にガンマ補正(Gamma 2.2)してディスプレイに表示する流れです。

入力と出力があり、レンダリング中はすべて「リニア」に統一することが望ましいです。
「リニア」については後述します。

リニアワークフローで考慮が必要な要素

  • 入力 : テクスチャイメージ
  • 入力 : 表面材質の色
  • 入力 : 光源の色
  • 出力 : レンダリング後のガンマ補正

また、これはリニアワークフローの範囲外ですが、大域照明使用時に写実的にレンダリングするには以下の調整も必要になります。

  • レンダリング設定のパラメータ調整(パストレーシング/フォトンマッピング時)
  • 大域照明を使用時は環境光を0にする

これらについてはナレッジベースの「フォトリアルにしたい (リニアワークフロー)」もご参照くださいませ。

ガンマ補正とリニア

リニア

レンダリングは「リニア」な状態で統一するようにします。
これは、色空間を統一することになります。
リニア(線形)とは、色のRGBそれぞれの要素を0.0-1.0の範囲で表した場合直線的な出力となる状態です。
この場合は、RGB値はそのまま採用します。

上図の「pow(value,1.0)」はべき乗計算の関数となり、valueの1.0乗を表します。
このリニアの状態は、ディスプレイや目で見た場合は全体的に暗くなっているような色合いになります。

逆ガンマ補正

jpgやpngなどの画像ファイルは、人間の目で見た場合と近い状態ですでに補正が入っています。
イメージ的には、下図のように「pow(value, 1.0/2.2)」がかかった状態です。

これをリニアに変換するために、逆ガンマ補正として「pow(value, 1.0/(1.0/2.2))」の計算を行います。
画像や色の場合、リニア変換すると以下のように暗くなることになります。

Shade3Dでは、イメージの形状情報ウィンドウで「ガンマ」を「モニター (1.0/2.2)」とすることで、
レンダリング時に逆ガンマ補正がかかってリニアになります。

なお、hdr/exrといったHDRIの場合はイメージはリニアであることが多いです。
この場合はレンダリングではそのままの状態で使用します。

色の逆ガンマ補正

表面材質の拡散反射色についても、逆ガンマ補正を行ってリニアにする必要があります。

これをPythonスクリプトで計算する場合は、以下のようになります。


import math

# 選択形状を取得.
shape = xshade.scene().active_shape()

# 拡散反射色を取得.
diffuseCol = shape.surface.diffuse_color

# ガンマ 1.0 / 2.2をかけて、リニアにする.
gamma = 1.0 / 2.2
diffR = math.pow(diffuseCol[0], 1.0 / gamma)
diffG = math.pow(diffuseCol[1], 1.0 / gamma)
diffB = math.pow(diffuseCol[2], 1.0 / gamma)

個々で計算された(diffR, diffG, diffB)がリニア変換されたRGB値です。
なお、拡散反射値も色として反映されます。
拡散反射値は1.0としておくほうが扱いやすいです。

その他、光源色や環境光の色など、色に関するあらゆるものはリニアを考慮する必要があります。

リニア変換してはいけないもの

注意点として、表面材質の法線マップ/バンプマップのイメージや反射値/透明度など、
これについては色ではありませんのでリニア変換してはいけません。

ガンマ補正の2.2とは?

ところで、ガンマ補正の2.2という数値はどこから出てきたのでしょうか?
2.2という数値は、ディスプレイのガンマ補正の特性値になります。
昨今のディスプレイはWindowsもMacもガンマ2.2で統一されています(過去、Macではガンマ値1.8を採用していました)。

昨今は、「sRGB」という色空間(規格)が使用されています。
これはガンマ2.2と似ていますが異なるものです。
Shade3DではsRGBを使用していません。

レンダリングでの色補正でガンマ2.2を指定

レンダリング後はそのままではガンマ1.0でリニアの状態となります。
レンダリング画像に対してガンマ補正することでディスプレイ表示に適した色になります。

メインメニューの「表示」-「色補正」を選択し、色補正ウィンドウを表示します。
「ガンマ」で2.2を指定してレンダリングします。

Shade3D Standard/Professional版の場合は、「レンダリング画像に即時反映する」チェックボックスをオンにすることで、
レンダリング後でも色補正ウィンドウのパラメータを変更できます。

これにより、入力の画像や色をリニア変換、リニアの色空間にてレンダリング、出力時にガンマ補正、の流れができました。

大域照明時の調整

これはリニアワークフローとは異なりますが、大域照明使用時は以下を考慮するとより写実的になります。

環境光を0にする

無限遠光源の「環境光」をゼロにします。
この環境光は間接照明の影/陰部分の明るさを底上げするものですが、
大域照明のレンダリングでは環境光を使用せずに間接照明計算に任せたほうがより現実に近づきます。

レンダリング設定のパラメータ調整

大域照明として「パストレーシング」を使用している際、
グラデーションの境目が滑らかでない場合は
拡散反射カットオフ」を0にすると改善されます。

また、パストレーシング時は「反射係数」を2.0とすると、現実に近い表現、他のPBR対応レンダラに近い表現ができます。
このとき、拡散反射色が白に近い場合はレンダリングの拡散反射の相互作用で明るくなる箇所が出ることになります。
そのため、真っ白の表面材質は使用しないようにする必要があります。
他のレンダラでは、デフォルトでマテリアルの拡散反射色を白ではなく灰色にしている場合が多いです。
逆ガンマ補正前の場合は、RGB(0.72, 0.72, 0.72)あたりを色の最大の目安にするとよさそうです。
これを逆ガンマ補正すると「pow(0.72, 1.0/(1.0/2.2))」の計算が0.4854のように0.5より小さくなり、
反射係数2.0の場合でも累積していくと減衰する挙動になります。

大域照明として「フォトンマッピング」を使用している際、レンダリング設定の大域照明の「反射係数」を1.25とすると、
パストレーシングの色合いとほぼ一致します。

以上は、レンダリングでの機械的な調整となります。
表現としては、三点照明など光源の配置も非常に重要です。

今回はここまでです。
リニアワークフローを知っていないとなかなかフォトリアルなレンダリングを得られませんが、
知っていると手間をかけずにフォトリアルな表現が可能となります。
次回、別のレンダリングTipsを記載予定です。

カテゴリー: レンダリング