summaryrefslogtreecommitdiffstats
path: root/brdf.cginc
diff options
context:
space:
mode:
Diffstat (limited to 'brdf.cginc')
-rwxr-xr-xbrdf.cginc19
1 files changed, 16 insertions, 3 deletions
diff --git a/brdf.cginc b/brdf.cginc
index de222e7..8bd0061 100755
--- a/brdf.cginc
+++ b/brdf.cginc
@@ -101,7 +101,7 @@ float G_Estevez(float roughness, float NoL, float NoV) {
return 1.0 / ((1.0 + lambda_l + lambda_v) * 4.0 * NoL * NoV);
}
-float4 brdf(Pbr pbr, LightData data, out BrdfData bd) {
+float4 brdf(v2f i, Pbr pbr, LightData data, out BrdfData bd) {
bd = (BrdfData)0;
float3 specular = 0;
float3 diffuse = 0;
@@ -178,13 +178,26 @@ float4 brdf(Pbr pbr, LightData data, out BrdfData bd) {
direct_diffuse = max(0, direct_diffuse);
diffuse += direct_diffuse;
#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);
- bd.direct_g = G_GGXSmith(pbr.roughness, data.direct.NoL, data.common.NoV);
+#endif
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 *= direct_energy;
direct_specular *= remainder;
specular += direct_specular;