今回はリニアワークフローの実装を行ってみました。
リニアワークフローについてはここで説明するほどのことでは無いかもしれないですが
とりあえず簡単にだけ説明します。
・まず一般的に使われているモニタはsRGB(ガンマ2.2)です。これは以下のように
入力された色データはガンマ補正されて出力されているということです。
Out = pow( In, 2.2 );
・普段Photoshop等で画像を作成した場合、このガンマ2.2のモニタ上で見ながら
作業を行うため、シェーダ上でそれらの画像を扱う際は当然同じ色味として扱わなけ
ればなりません。つまり入力値0.5のピクセルは明るさpow(0.5,2.2) = 0.217..と
して扱う必用があるということです。
・最終的にはモニタと同じガンマ値に戻す必要があるので以下の補正を加えます。
Out = pow( Color, 1/2.2 );
以上のような感じです。
ただしsRGBで途中計算をしていたものと同じパラメータでリニアで計算するように変更
した場合、かなり画面が不自然になってしまうためパラメータも一部変える必要が
出てきます(自身の場合だと明るい部分をライト色になるように補正を加えているのですが
その補正がかなり効きすぎる感じになったので補正を弱めたりしました)。
これによってフレネルやスペキュラがいい感じに入るようになってくれたのはいいですが
現在は法線マップをほとんどのモデルで使っていないので不自然にフレネルが入ったり
スペキュラが入るべき位置に入っていなかったりしています。
さて、時間がかかるので後回しにしてましたが、法線マップとスペキュラマップを今後
用意しないとライティングの検証がしづらくなってきました。うーむ。
追記:
モニタには何故ガンマ特性があるのか
ttp://www.denjuku.org/old/hayakawa/gamma.html
"元をたどればリニア(直線的)な階調はリニアに感じられないという、人間の眼の感受
特性に端を発しているのですが、同様に各々の出力機器に応じた固有のガンマ特性
を考慮しないと、視覚的に正しい階調を得る事ができないのです。"(記事抜粋)
つまりPhotoShopでリニアのグラデーションの画像を作成してもそれはモニタが人の
目にリニアで見えるように勝手に補正してくれているだけであり、各ピクセル間の勾配は
"エネルギー的には"リニアでないため、物理学的に正しく光の計算をシェーダで行う前に
一旦リニアに戻す必要がある、とまぁそういう訳ですね。ようやくすんなりと理解できる
ようになりました。
これを踏まえるとOutputもリニアのままでも物理的には間違ってないような気がしますが
これだとテクスチャ作成時の見た目と実行時の見た目が結構変わってしまうため
デザイナーさんが困るとかそういうことなのだと思われます。
ようやく理解できてよかったですが、今までは「モニタがガンマ補正してるだけだから
データ的にはリニアなんじゃないの?」とか悩んだりしてたんですよね笑。