summaryrefslogtreecommitdiffstats
path: root/brdf.cginc
diff options
context:
space:
mode:
authoryum <yum.food.vr@gmail.com>2026-04-05 14:33:57 -0700
committeryum <yum.food.vr@gmail.com>2026-04-05 14:34:03 -0700
commit69f273558ecfded1fcf7c89b238a241859dc625e (patch)
tree7c6b7a809ed74aafabc4993875fbdf4b8443f082 /brdf.cginc
parente3a071dbde74e863d4bf56ad957d153886f26406 (diff)
Cloth bugfixes; burley tiling scaling fix
Diffstat (limited to 'brdf.cginc')
-rwxr-xr-xbrdf.cginc37
1 files changed, 27 insertions, 10 deletions
diff --git a/brdf.cginc b/brdf.cginc
index 65a25c9..75eb295 100755
--- a/brdf.cginc
+++ b/brdf.cginc
@@ -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;