BlenderのRoughnessをUnityで表現できずに困った話

結論

Roughnessを反転させて、0.45乗させれば大体同じルックになりそう(検証はしていない)

BlenderのRoughness, UnityのSmoothness

Blender(のプリンシプルBSDF)には粗さを表現するRoughnessという値がある。

それと対象にUnityにはShaderにSmoothnessという項目がある。

他のベースカラーや法線, メタリック等は共有できるが、Roughnessに限っては直接Unityで使用できないので何らかの手段で変換をする必要がある

Roughnessの反転

BlenderのRoughnessは0.0~1.0で1.0に近づくほど粗くなる。

それに対しUnityのSmoothnessは0.0 ~ 1.0で1.0に近づくほど滑らかになる (鏡面反射するようになる)

参考

つまりBlenderで決定したRoughnessの値を反転させてやれば、Unityでの表現に一致するのではないかと考えた。

しかしこの目論見は失敗。
Blenderではツヤが出ても、Unityだとツヤが出ないことを切っ掛けに単純な反転では同じ表現を得られないことに気づいた。

Unity (ただRoughnessを反転させた)Blender
補正なしBlenderでの質感

BlenderはRoughnessに補正が掛かっている(らしい)

調べていくうちに以下のブログ記事を発見した。

Correcting Blenders Roughness Value
For a long time I have witnessed some inconsistencies with Blenders Glossy shader, namely its roughness value. It always...

どうやらBlenderのRoughness値には補正が掛かっているらしい、という記事だ。

先ほどのブログ記事からの引用
(引用元: https://tastypudding.wordpress.com/2014/12/19/simple-pbr-shader-for-blender-2-72-cycles/)

この図の縦軸はPBR シェーダーの光沢の値 (何を元に得たのかは不明), 横軸がBlenderのRoughnessである。

これによるとBlenderのRoughnessと物理的な光沢の変化量は綺麗なガンマ2.2の曲線を描いていることが分かる。

UnityとBlenderの粗さ表現が一致しない原因がこの非線形な変化なのであれば、全体を(1/2.2=0.4545..)乗してあげれば直線になる。そしてUnityのSmoothness値の変化量が直線的であれば、表現が大体一致するはずである。

試してみたところ先ほどよりは、明らかに良い結果が得られた。

Roughnessの反転のみRoughnessを反転させ、(1/2.2)乗させるBlender(再現したいもの)
補正なし補正ありBlenderでの質感
質感の比較, ただ反転させたものより良い結果が得られている

コメント

タイトルとURLをコピーしました