結論
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に近づくほど滑らかになる (鏡面反射するようになる)
参考
- https://docs.blender.org/manual/ja/2.90/render/shader_nodes/shader/principled.html
- https://docs.unity3d.com/ja/2022.3/Manual/StandardShaderMaterialParameterSmoothness.html
つまりBlenderで決定したRoughnessの値を反転させてやれば、Unityでの表現に一致するのではないかと考えた。
しかしこの目論見は失敗。
Blenderではツヤが出ても、Unityだとツヤが出ないことから単純な反転では同じ表現を得られないことに気づいた。
Unity (ただRoughnessを反転させた) | Blender |
BlenderはRoughnessに補正が掛かっている(らしい)
調べていくうちに以下のブログ記事を発見した。
どうやらBlenderのRoughness値には補正が掛かっているらしい、という記事だ。
この図の縦軸はPBR シェーダーの光沢の値 (何を元に得たのかは不明), 横軸がBlenderのRoughnessである。グラフからBlenderのRoughness値は指数関数で補正が掛かっていることが分かる。
また図のグラフは各点の値を見るに、\(Value = Roughness^{2.2}\)であると推測できる。
UnityとBlenderの粗さ表現が一致しない原因がこの非線形な変化なのであれば、この変化を打ち消すように全体を(1/2.2=0.4545..)乗してあげれば直線になる。そしてUnityのSmoothness値の変化量が直線的であれば、表現が大体一致するはずである。
試してみたところ先ほどよりは、明らかに良い結果が得られた。
Roughnessの反転のみ | Roughnessを反転させ、(1/2.2)乗させる | Blender(再現したいもの) |
コメント