diff options
| author | yum <yum.food.vr@gmail.com> | 2026-04-05 14:33:57 -0700 |
|---|---|---|
| committer | yum <yum.food.vr@gmail.com> | 2026-04-05 14:34:03 -0700 |
| commit | 69f273558ecfded1fcf7c89b238a241859dc625e (patch) | |
| tree | 7c6b7a809ed74aafabc4993875fbdf4b8443f082 /brdf.cginc | |
| parent | e3a071dbde74e863d4bf56ad957d153886f26406 (diff) | |
Cloth bugfixes; burley tiling scaling fix
Diffstat (limited to 'brdf.cginc')
| -rwxr-xr-x | brdf.cginc | 37 |
1 files changed, 27 insertions, 10 deletions
@@ -73,7 +73,8 @@ float G_GGXSmith(float roughness, float NoL, float NoV) { float L_Estevez(float r, float x) { // Recover constants according to Table 1. - float interpolator = 1 - r * r; + float one_minus_r = 1 - r; + float interpolator = one_minus_r * one_minus_r; float one_minus_i = 1 - interpolator; float a = interpolator * 25.3245 + one_minus_i * 21.5473; float b = interpolator * 3.32435 + one_minus_i * 3.82987; @@ -84,20 +85,24 @@ float L_Estevez(float r, float x) { return a / (1 + b*pow(x, c)) + d*x + e; } -float Lambda_Estevez(float cos_theta, float roughness) { +float Lambda_Estevez_Raw(float cos_theta, float roughness) { // Equation 3 - float lambda = cos_theta < 0.5 + return cos_theta < 0.5 ? exp(L_Estevez(roughness, cos_theta)) : exp(2 * L_Estevez(roughness, 0.5) - L_Estevez(roughness, 1 - cos_theta)); - // Equation 4 +} + +float Lambda_Estevez_Softened(float cos_theta, float roughness) { + // Equation 4 applies only to the light-side term. + float lambda = Lambda_Estevez_Raw(cos_theta, roughness); return pow(lambda, 1 + 2 * pow(1 - cos_theta, 8)); } // Estevez & Kulla "Production Friendly Microfacet Sheen BRDF" // Height-correlated Smith: G2 / (4 * NoL * NoV) float G_Estevez(float roughness, float NoL, float NoV) { - float lambda_l = Lambda_Estevez(NoL, roughness); - float lambda_v = Lambda_Estevez(NoV, roughness); + float lambda_l = Lambda_Estevez_Softened(NoL, roughness); + float lambda_v = Lambda_Estevez_Raw(NoV, roughness); return 1.0 / ((1.0 + lambda_l + lambda_v) * 4.0 * NoL * NoV); } @@ -124,9 +129,9 @@ float4 brdf(v2f i, Pbr pbr, LightData data, out BrdfData bd) { float2 dfg_uv = float2(data.common.NoV, pbr.roughness_perceptual); [branch] if (textureExists(_DFG_LUT)) { - bd.ibl_dfg = _DFG_LUT.SampleLevel(bilinear_clamp_s, dfg_uv, 0).rgb; + bd.ibl_dfg = _DFG_LUT.SampleLevel(bilinear_clamp_s, dfg_uv, 0); } else { - bd.ibl_dfg = float3(1, 1, 1); + bd.ibl_dfg = float4(1, 1, 1, 1); } float3 f0_color = lerp(f0, pbr.albedo.xyz, pbr.metallic); float3 energy_comp = 1.0f + f0_color * (1.0f / (bd.ibl_dfg.xxx + bd.ibl_dfg.yyy) - 1.0f); @@ -136,9 +141,9 @@ float4 brdf(v2f i, Pbr pbr, LightData data, out BrdfData bd) { float2 cc_dfg_uv = float2(data.common.NoV_cc, pbr.cc_roughness_perceptual); [branch] if (textureExists(_DFG_LUT)) { - bd.ibl_dfg_cc = _DFG_LUT.SampleLevel(bilinear_clamp_s, cc_dfg_uv, 0).rgb; + bd.ibl_dfg_cc = _DFG_LUT.SampleLevel(bilinear_clamp_s, cc_dfg_uv, 0); } else { - bd.ibl_dfg_cc = float3(1, 1, 1); + bd.ibl_dfg_cc = float4(1, 1, 1, 1); } float3 cc_f0_color = lerp(cc_f0, pbr.albedo.xyz, pbr.metallic); float3 cc_energy_comp = 1.0f + cc_f0_color * (1.0f / (bd.ibl_dfg_cc.xxx + bd.ibl_dfg_cc.yyy) - 1.0f); @@ -167,10 +172,21 @@ float4 brdf(v2f i, Pbr pbr, LightData data, out BrdfData bd) { bd.direct_d = D_Estevez(pbr.roughness, data.direct.NoH); bd.direct_g = G_Estevez(pbr.roughness, data.direct.NoL, data.common.NoV); + float4 cloth_dfg_i = bd.ibl_dfg; + [branch] + if (textureExists(_DFG_LUT)) { + float2 cloth_direct_uv = float2(data.direct.NoL, pbr.roughness_perceptual); + cloth_dfg_i = _DFG_LUT.SampleLevel(bilinear_clamp_s, cloth_direct_uv, 0); + } + float3 cloth_alpha_o = cloth_f0 * bd.ibl_dfg.zzz; + float3 cloth_alpha_i = cloth_f0 * cloth_dfg_i.www; + float cloth_base_scale = luminance(min(1.0f - cloth_alpha_i, 1.0f - cloth_alpha_o)); + float3 direct_specular_cloth = (bd.direct_d * bd.direct_g) * bd.direct_f; direct_specular_cloth *= data.direct.color * data.direct.NoL; direct_specular_cloth *= remainder; specular += direct_specular_cloth; + remainder *= saturate(cloth_base_scale); /* float Fd = Fd_Lambertian(data.direct.NoL) / PI; float3 direct_diffuse = Fd * pbr.albedo.xyz * data.direct.color; @@ -232,6 +248,7 @@ float4 brdf(v2f i, Pbr pbr, LightData data, out BrdfData bd) { float3 specular_dfg = _Cloth_Sheen.rgb * bd.ibl_dfg.zzz; float3 indirect_specular = data.indirect.specular * specular_dfg; specular += indirect_specular * remainder * data.common.spec_ao; + remainder *= saturate(1.0f - specular_dfg); float3 indirect_diffuse = pbr.albedo.xyz * data.indirect.diffuse; diffuse += indirect_diffuse * remainder; |
