Cook-Torrance BRDF と Lambert BRDF に関する多くの資料があります。Unreal Engine 4 のリアル シェーディングと、 Frostbite を BPRに移動すると、リアルタイム レンダリング用にそれらを実装する方法が詳しく説明されています。
彼らが省略しているのは、完全なシェーディング モデルを作成するための両方の BRDF の組み合わせです。私がこれを正しく理解していれば、少なくとも 2 つの基本原則を使用してそれを行うことができます: スペキュラー ワークフローとメタルネス ワークフローです。これがそれらの比較です。
metalness-workflow を実装することにしました。したがって、計算の基礎となる次のパラメーターがあります。
- アルベド (RGB)
- 粗さ(フロート)
- メタルネス(浮き)
スペキュラー パーツについては、スペキュラー カラーを決定する必要があります。
マモセットは次のように述べています。
金属性マップを使用する場合、絶縁表面 (金属性マップで 0.0 (黒) に設定されたピクセル) には固定反射率値 (線形: 0.04 sRGB: 0.22) が割り当てられ、拡散値にアルベド マップが使用されます。金属面 (金属性マップで 1.0 (白) に設定されたピクセル) の場合、鏡面反射光の色と強度はアルベド マップから取得され、拡散値はシェーダーで 0 (黒) に設定されます。
したがって、鏡面反射色は次のように計算する必要があります。
vec3 specularColor = mix(vec3(0.04), material.albedo, material.metalness);
その後、これを使用して反射放射輝度を計算できます。私の質問の範囲を制限するために、ここでBrian Karisの実装を参照します。これは次のとおりです。
vec3 L_specular = specularIBL(specularColor, material.roughness, normal, view);
拡散部分については、アルベドを決定する必要があります。
これがどのように機能するかは、上記の同じ引用で説明されています。
vec3 albedo = mix(material.albedo, vec3(0), material.metalness);
ここで、Lambert BRDF を使用して、入射放射照度 E から拡散照明を計算できます。
vec3 L_diffuse = f_lambert(albedo) * E;
結果の放射輝度を得るために、拡散部分と鏡面反射部分が組み合わされます。
vec3 L = kd * L_diffuse + ks * L_specular;
私の質問は、どのように計算するkd
のks
ですか?
- Codinglabsは、フレネル関数を半球上で積分して を計算することを提案しています
ks
。
kd
その後、次のように計算されます。
vec3 kd = (1 - ks) * (1 - material.metalness);
非金属で得られる結果は、たとえば非現実的なエンジンと比較したときに期待するものではありません。反射は、通常の入射で予想されるようにはるかに低くなります。これは、非金属の場合に設定された低い F0 によるものです。しかし、さらに情報源を確認したところ、0.04 が一般的に使用されている値のようです。
誰かがCodinglabsの提案された計算を確認できますか? または、エピックが使用するコードを提供しますか?