diff options
| author | yum <yum.food.vr@gmail.com> | 2026-03-30 13:11:29 -0700 |
|---|---|---|
| committer | yum <yum.food.vr@gmail.com> | 2026-03-30 13:11:29 -0700 |
| commit | 146b1e287e606b6ce3ebc4f60a1719f43c755916 (patch) | |
| tree | 914758325caffc2a1e2408119c9fd81e48f4520e /brdf.cginc | |
| parent | b5197bed4cad2a8452bcbfa8e116497760edf1ba (diff) | |
Glitter: use micro normal for IBL
Diffstat (limited to 'brdf.cginc')
| -rwxr-xr-x | brdf.cginc | 78 |
1 files changed, 12 insertions, 66 deletions
@@ -1,12 +1,12 @@ #ifndef __BRDF_INC #define __BRDF_INC -#include "glitter.cginc" -#include "lighting.cginc" +#include "LightVolumes.cginc" #include "lysenko.cginc" #include "math.cginc" #include "pema99.cginc" #include "pbr.cginc" +#include "glitter.cginc" float pow5(float x) { float x2 = x * x; @@ -101,43 +101,6 @@ float G_Estevez(float roughness, float NoL, float NoV) { return 1.0 / ((1.0 + lambda_l + lambda_v) * 4.0 * NoL * NoV); } -#if defined(_GLITTER) -struct GlitterData { - float2 uv; - float2x2 uv_J; - float N; -}; - -struct GlitterDFG { - float d; - float3 f; - float g; -}; - -GlitterData GetGlitterData(v2f i) { - GlitterData data; - data.uv = i.uv01.xy; - data.uv_J = uv_ellipsoid(transpose(float2x2(ddx(data.uv), ddy(data.uv)))); - data.N = 8.0e5f * pow(10.0f, _Glitter_Amount * 6.0f - 2.0f); - return data; -} - -GlitterDFG GetGlitterDFG(GlitterData data, - float3x3 world_to_tangent, float roughness, float3 H, float LoH, - float NoL, float NoV) { - GlitterDFG dfg; - const float glitter_filter_size = 0.7f; - float3 H_tangent = mul(H, world_to_tangent); - float f0 = 0.15f; - float f90 = 1.0f; - dfg.f = F_Schlick(LoH, f0, f90); - dfg.d = D_Kemppinen(H_tangent, roughness, _Glitter_Roughness, - data.uv, data.uv_J, data.N, glitter_filter_size); - dfg.g = G_GGXSmith(roughness, NoL, NoV); - return dfg; -} -#endif - float4 brdf(v2f i, Pbr pbr, LightData data, out BrdfData bd) { bd = (BrdfData)0; float3 specular = 0; @@ -181,11 +144,6 @@ float4 brdf(v2f i, Pbr pbr, LightData data, out BrdfData bd) { float3 cc_energy_comp = 1.0f + cc_f0_color * (1.0f / (bd.ibl_dfg_cc.xxx + bd.ibl_dfg_cc.yyy) - 1.0f); #endif -#if defined(_GLITTER) - GlitterData glitter_data = GetGlitterData(i); - float3x3 glitter_world_to_tangent = transpose(pbr.tbn); -#endif - // Direct { float3 remainder = 1.0f; @@ -223,32 +181,21 @@ float4 brdf(v2f i, Pbr pbr, LightData data, out BrdfData bd) { #endif // _CLOTH #if defined(_GLITTER) - GlitterDFG direct_glitter = GetGlitterDFG(glitter_data, - glitter_world_to_tangent, pbr.roughness, data.direct.H, - data.direct.LoH, data.direct.NoL, data.common.NoV); - bd.direct_f = direct_glitter.f; - bd.direct_d = direct_glitter.d; - bd.direct_g = direct_glitter.g; - float3 direct_specular_glitter = (direct_glitter.d * direct_glitter.g) - * direct_glitter.f * data.direct.color * data.direct.NoL + float3 direct_f_glitter = F_Schlick(data.direct.LoH, 0.15f, 1.0f); + float direct_g_glitter = G_GGXSmith(pbr.roughness, data.direct.NoL, data.common.NoV); + float3 direct_specular_glitter = (data.glitter.direct_D * direct_g_glitter) + * direct_f_glitter * data.direct.color * data.direct.NoL * _Glitter_Tint; // No spec ao for glitter, please. direct_specular_glitter *= remainder; specular += direct_specular_glitter; +#endif - float direct_g = G_GGXSmith(pbr.roughness, data.direct.NoL, data.common.NoV); - float3 direct_f = F_Schlick(data.direct.LoH, f0_color, f90); - float direct_d = D_GGX(pbr.roughness, data.direct.NoH); -#else bd.direct_g = G_GGXSmith(pbr.roughness, data.direct.NoL, data.common.NoV); bd.direct_f = F_Schlick(data.direct.LoH, f0_color, f90); bd.direct_d = D_GGX(pbr.roughness, data.direct.NoH); - float direct_g = bd.direct_g; - float3 direct_f = bd.direct_f; - float direct_d = bd.direct_d; -#endif - float3 direct_specular = (direct_d * direct_g) * direct_f; + float3 direct_specular = (bd.direct_d * bd.direct_g) * bd.direct_f; direct_specular *= data.direct.color * data.direct.NoL; direct_specular *= energy_comp; direct_specular *= remainder; @@ -286,11 +233,10 @@ float4 brdf(v2f i, Pbr pbr, LightData data, out BrdfData bd) { diffuse += indirect_diffuse * remainder; #else #if defined(_GLITTER) - GlitterDFG indirect_glitter = GetGlitterDFG(glitter_data, - glitter_world_to_tangent, pbr.roughness, data.indirect.H, - data.indirect.LoH, data.indirect.NoL, data.common.NoV); - float3 indirect_specular_glitter = (indirect_glitter.d * indirect_glitter.g) - * indirect_glitter.f * data.indirect.specular * data.indirect.NoL + float3 indirect_f_glitter = F_Schlick(data.glitter.indirect_LoH, 0.15f, 1.0f); + float indirect_g_glitter = G_GGXSmith(pbr.roughness, data.glitter.indirect_NoL, data.common.NoV); + float3 indirect_specular_glitter = (data.glitter.indirect_D * indirect_g_glitter) + * indirect_f_glitter * data.glitter.indirect_specular * data.glitter.indirect_NoL * _Glitter_Tint; // No spec ao for glitter, please. specular += indirect_specular_glitter * remainder; |
