diff options
Diffstat (limited to 'brdf.cginc')
| -rwxr-xr-x | brdf.cginc | 28 |
1 files changed, 17 insertions, 11 deletions
@@ -161,6 +161,23 @@ float4 brdf(v2f i, Pbr pbr, LightData data, out BrdfData bd) { remainder *= saturate(1.0f - bd.direct_f_cc * pbr.cc_strength); #endif +#if defined(_GLITTER) + float2 glitter_uv = i.uv01.xy; + float2x2 glitter_uv_J = uv_ellipsoid(mat2_from_cols(ddx(glitter_uv), ddy(glitter_uv))); + float3 H_tangent = mul(data.direct.H, transpose(pbr.tbn)); + const float glitter_filter_size = 0.7f; + float glitter_N = 8.0e5f * pow(10.0f, _Glitter_Amount * 6.0f - 2.0f); + bd.direct_f = F_Schlick(data.direct.LoH, 0.96f, 1.0f); + bd.direct_d = D_Kemppinen(H_tangent, pbr.roughness, _Glitter_Roughness, + glitter_uv, glitter_uv_J, glitter_N, glitter_filter_size); + bd.direct_g = G_GGXSmith(pbr.roughness, data.direct.NoL, data.common.NoV); + float3 direct_specular_glitter = (bd.direct_d * bd.direct_g) * bd.direct_f; + direct_specular_glitter *= data.direct.color * data.direct.NoL; + direct_specular_glitter *= remainder; + specular += direct_specular_glitter; + remainder *= saturate(1.0f - direct_specular_glitter); +#else + #if defined(_CLOTH) float3 cloth_f0 = _Cloth_Sheen.rgb; bd.direct_f = F_Schlick(data.direct.LoH, cloth_f0, f90); @@ -180,17 +197,6 @@ float4 brdf(v2f i, Pbr pbr, LightData data, out BrdfData bd) { #else float3 direct_energy = energy_comp; bd.direct_g = G_GGXSmith(pbr.roughness, data.direct.NoL, data.common.NoV); -#if defined(_GLITTER) - float2 glitter_uv = frac(i.uv01.xy); - float2x2 glitter_uv_J = uv_ellipsoid(mat2_from_cols(ddx(glitter_uv), ddy(glitter_uv))); - float3 H_tangent = mul(data.direct.H, transpose(pbr.tbn)); - const float glitter_filter_size = 0.7f; - float glitter_N = 8.0e5f * pow(10.0f, _Glitter_Amount * 6.0f - 2.0f); - bd.direct_f = F_Schlick(data.direct.LoH, 0.96f, 1.0f); - bd.direct_d = D_Kemppinen(H_tangent, pbr.roughness, _Glitter_Roughness, - glitter_uv, glitter_uv_J, glitter_N, glitter_filter_size); - direct_energy = 1.0f; -#else bd.direct_f = F_Schlick(data.direct.LoH, f0_color, f90); bd.direct_d = D_GGX(pbr.roughness, data.direct.NoH); #endif |
