summaryrefslogtreecommitdiffstats
path: root/brdf.cginc
diff options
context:
space:
mode:
Diffstat (limited to 'brdf.cginc')
-rwxr-xr-xbrdf.cginc26
1 files changed, 18 insertions, 8 deletions
diff --git a/brdf.cginc b/brdf.cginc
index da3fcd6..254adc3 100755
--- a/brdf.cginc
+++ b/brdf.cginc
@@ -70,10 +70,6 @@ float4 brdf(Pbr pbr, LightData data) {
float3 specular = 0;
float3 diffuse = 0;
- // TODO parameterize
- float f0 = 0.04f;
- const float f90 = 1.0f;
-
//#define FURNACE_TEST_DIRECT
#if defined(FURNACE_TEST_DIRECT)
// Create the conditions for the standard BRDF furnace test.
@@ -86,6 +82,9 @@ float4 brdf(Pbr pbr, LightData data) {
data.direct.LoH = 1;
#endif
+ // TODO parameterize
+ float f0 = 0.04f;
+ const float f90 = 1.0f;
float2 dfg_uv = float2(data.common.NoV, pbr.roughness_perceptual);
float3 dfg;
[branch]
@@ -107,8 +106,8 @@ float4 brdf(Pbr pbr, LightData data) {
} else {
cc_dfg = float3(1, 1, 1);
}
- float cc_Ess = max(cc_dfg.y, 1e-4f);
- float cc_energy_comp = 1.0f + cc_f0 * (1.0f / cc_dfg.xxx - 1.0f);
+ float3 cc_f0_color = lerp(cc_f0, pbr.albedo.xyz, pbr.metallic);
+ float3 cc_energy_comp = 1.0f + cc_f0_color * (1.0f / (cc_dfg.xxx + cc_dfg.yyy) - 1.0f);
#endif
// Direct
@@ -153,14 +152,23 @@ float4 brdf(Pbr pbr, LightData data) {
// Indirect
#if !defined(FURNACE_TEST_DIRECT) && (defined(FORWARD_BASE_PASS) || defined(OUTLINES_PASS))
{
+ float3 remainder = 1.0f;
+#if defined(_CLEARCOAT)
+ float3 cc_specular_dfg = cc_dfg.xxx * cc_f0_color + cc_dfg.yyy; // filament 5.3.4.6
+ float3 cc_indirect_specular = data.indirect.specular_cc * cc_specular_dfg;
+ cc_indirect_specular *= cc_energy_comp;
+ specular += cc_indirect_specular;
+ remainder -= cc_specular_dfg;
+#endif
+
float3 specular_dfg = dfg.xxx * f0_color + dfg.yyy; // filament 5.3.4.6
float3 indirect_specular = data.indirect.specular * specular_dfg;
indirect_specular *= energy_comp;
- specular += indirect_specular;
+ specular += indirect_specular * remainder;
float3 indirect_diffuse = pbr.albedo.xyz * data.indirect.diffuse * (1.0 - pbr.metallic);
- diffuse += indirect_diffuse;
+ diffuse += indirect_diffuse * remainder;
}
#endif
@@ -175,7 +183,9 @@ float4 brdf(Pbr pbr, LightData data) {
}
#endif
+ diffuse *= data.common.ao;
specular *= data.common.spec_ao;
+
#if defined(_EMISSIONS) && defined(FORWARD_BASE_PASS)
float3 emission = pbr.emission;
#else