diff options
| author | yum <yum.food.vr@gmail.com> | 2026-03-09 21:07:15 -0700 |
|---|---|---|
| committer | yum <yum.food.vr@gmail.com> | 2026-03-09 21:07:15 -0700 |
| commit | c8cfc043c105a32e1efab341536311277bfc90eb (patch) | |
| tree | 9cc7d41f7db78b165f2051160b82e20500af2148 /brdf.cginc | |
| parent | 439aa46bba1695becd9d42731c29dedc93e05a28 (diff) | |
Fix clearcoat IBL
Diffstat (limited to 'brdf.cginc')
| -rwxr-xr-x | brdf.cginc | 26 |
1 files changed, 18 insertions, 8 deletions
@@ -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 |
