BRDF Diffuseモデルについて

最近、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 で検証しました。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください