最近、Diffuseの表現に関して調べています。 2点気付いたことがあったので報告します。

UE4.8からBRDF DiffuseモデルがLambertからBurleyに変更された

こちらの方々の会話が発端となって気が付いたのですが、 UE4.8のリリースノートのLighting項目でも述べられていました。

New:Switched diffuse shading model from Lambert to energy conserving Burley.

何気に大きな変更だと思います。 実際にDeferredLightingCommon.usfを見てみると、 StandardShading関数内でDiffuse_Burley関数が呼び出されていました。 文字だと全然分からないので、 UE4.8でのDiffuse_Lambert, Diffuse_Burley, Diffuse_OrenNayarの比較画像を用意しました。 カウチちゃん
カウチちゃん ポストプロセスは全てオフにして、DiffuseのみShowフラグを立ててキャプチャしました。 こうしてみると、Roughnessが大きくなると視線ベクトルの影響も大きくなっていることが分かります。 ちなみに、Burleyの計算式自体はUE4.8から少し変更が加えられており、 新たな係数として ( 1 - 0.3333 * Roughness ) が掛けられていました。 恐らく、BurleyモデルはRoughnessの影響による輝度差が大きいので、 その影響を弱めるために導入されたのではないかと思います。

BRDF.usfでのBRDF DiffuseモデルのDefine切り替えの注意点

BRDF.usfにおいて、DefineのPHYSICAL_DIFFUSEの値を変更すると、 BRDF DiffuseモデルであるLambert, Burley, Oren-Nayarが簡単に切り替えれると思っていたのですが、 実状、そのDefineを使用しているDiffuse関数は使用されていません。 DiffuseFunction
お客様がお使いになったDiffuseは現在使用されておりません Specularに関してはまだ調べていませんが、 Diffuseに関してはBRDF.usfにおいて、 DefineのPHYSICAL_DIFFUSEの値を変更しただけでは見た目は全く何も変わらないので注意して下さい。 私は今回この部分になかなか気が付かず、嵌っていました。 PHYSICAL_DIFFUSE
PHYSICAL_DIFFUSEを変更しても意味が無い DeferredLightingCommon.usfのStandardShading関数のように、 Diffuse_Lambert, Diffuse_Burley, Diffuse_OrenNayar関数を 直に指定して呼び出す使い方をしているようです。


この記事の内容はUnreal Engine 4.7, 4.8 で検証しました。