@@ -20,27 +20,25 @@ vec3 irr_glsl_ggx_height_correlated_aniso_cos_eval(in irr_glsl_BSDFAnisotropicPa
20
20
// defined using NDF function with better API (compared to burley used above) and new impl of correlated smith
21
21
float irr_glsl_ggx_height_correlated_aniso_cos_eval_DG_wo_clamps(in float NdotH2, in float TdotH2, in float BdotH2, in float maxNdotL, in float NdotL2, in float TdotL2, in float BdotL2, in float maxNdotV, in float NdotV2, in float TdotV2, in float BdotV2, in float ax, in float ax2, in float ay, in float ay2)
22
22
{
23
- float ndf = irr_glsl_ggx_aniso(TdotH2,BdotH2,NdotH2, ax, ay, ax2, ay2);
24
- float scalar_part = ndf* maxNdotL;
23
+ float NG = irr_glsl_ggx_aniso(TdotH2,BdotH2,NdotH2, ax, ay, ax2, ay2);
25
24
if (ax> FLT_MIN || ay> FLT_MIN)
26
25
{
27
- float g = irr_glsl_ggx_smith_correlated_wo_numerator(
26
+ NG * = irr_glsl_ggx_smith_correlated_wo_numerator(
28
27
maxNdotV, TdotV2, BdotV2, NdotV2,
29
28
maxNdotL, TdotL2, BdotL2, NdotL2,
30
29
ax2, ay2
31
30
);
32
- scalar_part *= g;
33
31
}
34
32
35
- return scalar_part ;
33
+ return NG ;
36
34
}
37
35
38
36
vec3 irr_glsl_ggx_height_correlated_aniso_cos_eval_wo_clamps(in float NdotH2, in float TdotH2, in float BdotH2, in float maxNdotL, in float NdotL2, in float TdotL2, in float BdotL2, in float maxNdotV, in float NdotV2, in float TdotV2, in float BdotV2, in float VdotH, in mat2x3 ior, in float ax, in float ax2, in float ay, in float ay2)
39
37
{
40
- float scalar_part = irr_glsl_ggx_height_correlated_aniso_cos_eval_DG_wo_clamps(NdotH2,TdotH2,BdotH2,maxNdotL,NdotL2,TdotL2,BdotL2,maxNdotV,NdotV2,TdotV2,BdotV2,ax,ax2,ay,ay2);
38
+ float NG_already_in_reflective_dL_measure = irr_glsl_ggx_height_correlated_aniso_cos_eval_DG_wo_clamps(NdotH2,TdotH2,BdotH2,maxNdotL,NdotL2,TdotL2,BdotL2,maxNdotV,NdotV2,TdotV2,BdotV2,ax,ax2,ay,ay2);
41
39
42
40
vec3 fr = irr_glsl_fresnel_conductor(ior[0 ], ior[1 ], VdotH);
43
- return fr* scalar_part ;
41
+ return fr* irr_glsl_ggx_microfacet_to_light_measure_transform(NG_already_in_reflective_dL_measure,maxNdotL) ;
44
42
}
45
43
46
44
vec3 irr_glsl_ggx_height_correlated_aniso_cos_eval(in irr_glsl_LightSample _sample, in irr_glsl_AnisotropicViewSurfaceInteraction interaction, in irr_glsl_AnisotropicMicrofacetCache _cache, in mat2x3 ior, in float ax, in float ay)
@@ -64,23 +62,20 @@ vec3 irr_glsl_ggx_height_correlated_aniso_cos_eval(in irr_glsl_LightSample _samp
64
62
65
63
float irr_glsl_ggx_height_correlated_cos_eval_DG_wo_clamps(in float NdotH2, in float maxNdotL, in float NdotL2, in float maxNdotV, in float NdotV2, in float a2)
66
64
{
67
- float ndf = irr_glsl_ggx_trowbridge_reitz(a2, NdotH2);
68
- float scalar_part = ndf* maxNdotL;
65
+ float NG = irr_glsl_ggx_trowbridge_reitz(a2, NdotH2);
69
66
if (a2> FLT_MIN)
70
- {
71
- float g = irr_glsl_ggx_smith_correlated_wo_numerator(maxNdotV, NdotV2, maxNdotL, NdotL2, a2);
72
- scalar_part *= g;
73
- }
67
+ NG *= irr_glsl_ggx_smith_correlated_wo_numerator(maxNdotV, NdotV2, maxNdotL, NdotL2, a2);
74
68
75
- return scalar_part ;
69
+ return NG ;
76
70
}
77
71
78
72
vec3 irr_glsl_ggx_height_correlated_cos_eval_wo_clamps(in float NdotH2, in float maxNdotL, in float NdotL2, in float maxNdotV, in float NdotV2, in float VdotH, in mat2x3 ior, in float a2)
79
73
{
80
- float scalar_part = irr_glsl_ggx_height_correlated_cos_eval_DG_wo_clamps(NdotH2, maxNdotL, NdotL2, maxNdotV, NdotV2, a2);
74
+ float NG_already_in_reflective_dL_measure = irr_glsl_ggx_height_correlated_cos_eval_DG_wo_clamps(NdotH2, maxNdotL, NdotL2, maxNdotV, NdotV2, a2);
81
75
82
76
vec3 fr = irr_glsl_fresnel_conductor(ior[0 ], ior[1 ], VdotH);
83
- return fr* scalar_part;
77
+
78
+ return fr* irr_glsl_ggx_microfacet_to_light_measure_transform(NG_already_in_reflective_dL_measure,maxNdotL);
84
79
}
85
80
86
81
vec3 irr_glsl_ggx_height_correlated_cos_eval(in irr_glsl_LightSample _sample, in irr_glsl_IsotropicViewSurfaceInteraction interaction, in irr_glsl_IsotropicMicrofacetCache _cache, in mat2x3 ior, in float a2)
@@ -116,6 +111,7 @@ vec3 irr_glsl_ggx_cos_generate(in vec3 localV, in vec2 u, in float _ax, in float
116
111
return normalize (vec3 (_ax* H.x, _ay* H.y, H.z));
117
112
}
118
113
114
+ // TODO: unifty the two following functions into `irr_glsl_microfacet_BRDF_cos_generate_wo_clamps(vec3 H,...)` and `irr_glsl_microfacet_BRDF_cos_generate` or at least a auto declaration macro in lieu of a template
119
115
irr_glsl_LightSample irr_glsl_ggx_cos_generate_wo_clamps(in vec3 localV, in mat3 m, in vec2 u, in float _ax, in float _ay, out irr_glsl_AnisotropicMicrofacetCache _cache)
120
116
{
121
117
const vec3 H = irr_glsl_ggx_cos_generate(localV,u,_ax,_ay);
@@ -137,7 +133,7 @@ irr_glsl_LightSample irr_glsl_ggx_cos_generate(in irr_glsl_AnisotropicViewSurfac
137
133
138
134
float irr_glsl_ggx_pdf_wo_clamps(in float ndf, in float devsh_v, in float maxNdotV)
139
135
{
140
- return ndf * irr_glsl_GGXSmith_G1_wo_numerator(maxNdotV, devsh_v) * 0.5 ;
136
+ return irr_glsl_smith_VNDF_pdf_wo_clamps( ndf, irr_glsl_GGXSmith_G1_wo_numerator(maxNdotV,devsh_v)) ;
141
137
}
142
138
float irr_glsl_ggx_pdf_wo_clamps(in float NdotH2, in float maxNdotV, in float NdotV2, in float a2)
143
139
{
@@ -159,11 +155,11 @@ float irr_glsl_ggx_pdf_wo_clamps(in float NdotH2, in float TdotH2, in float Bdot
159
155
160
156
vec3 irr_glsl_ggx_cos_remainder_and_pdf_wo_clamps(out float pdf, in float ndf, in float maxNdotL, in float NdotL2, in float maxNdotV, in float NdotV2, in vec3 reflectance, in float a2)
161
157
{
162
- float one_minus_a2 = 1.0 - a2;
163
- float devsh_v = irr_glsl_smith_ggx_devsh_part(NdotV2, a2, one_minus_a2);
158
+ const float one_minus_a2 = 1.0 - a2;
159
+ const float devsh_v = irr_glsl_smith_ggx_devsh_part(NdotV2, a2, one_minus_a2);
164
160
pdf = irr_glsl_ggx_pdf_wo_clamps(ndf, devsh_v, maxNdotV);
165
161
166
- float G2_over_G1 = irr_glsl_ggx_smith_G2_over_G1_devsh(maxNdotL, NdotL2, maxNdotV, devsh_v, a2, one_minus_a2);
162
+ const float G2_over_G1 = irr_glsl_ggx_smith_G2_over_G1_devsh(maxNdotL, NdotL2, maxNdotV, devsh_v, a2, one_minus_a2);
167
163
168
164
return reflectance * G2_over_G1;
169
165
}
@@ -175,7 +171,7 @@ vec3 irr_glsl_ggx_cos_remainder_and_pdf(out float pdf, in irr_glsl_LightSample _
175
171
const float ndf = irr_glsl_ggx_trowbridge_reitz(a2, _cache.NdotH2);
176
172
const vec3 reflectance = irr_glsl_fresnel_conductor(ior[0 ], ior[1 ], _cache.VdotH);
177
173
178
- return irr_glsl_ggx_cos_remainder_and_pdf_wo_clamps(pdf, ndf, max ( _sample.NdotL,0.0 ), _sample.NdotL2, max ( interaction.NdotV, 0.0 ) , interaction.NdotV_squared, reflectance, a2);
174
+ return irr_glsl_ggx_cos_remainder_and_pdf_wo_clamps(pdf, ndf, _sample.NdotL, _sample.NdotL2, interaction.NdotV, interaction.NdotV_squared, reflectance, a2);
179
175
}
180
176
else
181
177
{
@@ -215,9 +211,9 @@ vec3 irr_glsl_ggx_aniso_cos_remainder_and_pdf(out float pdf, in irr_glsl_LightSa
215
211
const float ax2 = ax* ax;
216
212
const float ay2 = ay* ay;
217
213
const float ndf = irr_glsl_ggx_aniso(TdotH2,BdotH2,_cache.isotropic.NdotH2, ax, ay, ax2, ay2);
218
-
219
214
const vec3 reflectance = irr_glsl_fresnel_conductor(ior[0 ], ior[1 ], _cache.isotropic.VdotH);
220
- return irr_glsl_ggx_aniso_cos_remainder_and_pdf_wo_clamps(pdf, ndf, max (_sample.NdotL, 0.0 ), _sample.NdotL2, TdotL2, BdotL2, max (interaction.isotropic.NdotV, 0.0 ), TdotV2, BdotV2, interaction.isotropic.NdotV_squared, reflectance, ax2, ay2);
215
+
216
+ return irr_glsl_ggx_aniso_cos_remainder_and_pdf_wo_clamps(pdf, ndf, _sample.NdotL, _sample.NdotL2, TdotL2, BdotL2, interaction.isotropic.NdotV, TdotV2, BdotV2, interaction.isotropic.NdotV_squared, reflectance, ax2, ay2);
221
217
}
222
218
else
223
219
{
0 commit comments