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値は指数関数で補正が掛かっていることが分かる。

また図のグラフは各点の値を見るに、\(Value = Roughness^{2.2}\)であると推測できる。

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

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

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

コメント

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