summaryrefslogtreecommitdiffstats
path: root/brdf.cginc
diff options
context:
space:
mode:
authoryum <yum.food.vr@gmail.com>2026-03-30 13:11:29 -0700
committeryum <yum.food.vr@gmail.com>2026-03-30 13:11:29 -0700
commit146b1e287e606b6ce3ebc4f60a1719f43c755916 (patch)
tree914758325caffc2a1e2408119c9fd81e48f4520e /brdf.cginc
parentb5197bed4cad2a8452bcbfa8e116497760edf1ba (diff)
Glitter: use micro normal for IBL
Diffstat (limited to 'brdf.cginc')
-rwxr-xr-xbrdf.cginc78
1 files changed, 12 insertions, 66 deletions
diff --git a/brdf.cginc b/brdf.cginc
index 92fd8bb..a76ee13 100755
--- a/brdf.cginc
+++ b/brdf.cginc
@@ -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;