Skip to content

Commit ca3bd3d

Browse files
clean up GGX slightly and start the GGX dielectric over, also commit the forgotten file.
1 parent cb20f6b commit ca3bd3d

File tree

5 files changed

+205
-102
lines changed

5 files changed

+205
-102
lines changed

include/irr/builtin/glsl/bxdf/brdf/specular/beckmann.glsl

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -194,7 +194,6 @@ vec3 irr_glsl_beckmann_aniso_cos_remainder_and_pdf(out float pdf, in irr_glsl_Li
194194
}
195195

196196

197-
198197
float irr_glsl_beckmann_height_correlated_cos_eval_DG_wo_clamps(in float NdotH2, in float NdotL2, in float NdotV2, in float a2)
199198
{
200199
float NG = irr_glsl_beckmann(a2, NdotH2);
@@ -205,11 +204,11 @@ float irr_glsl_beckmann_height_correlated_cos_eval_DG_wo_clamps(in float NdotH2,
205204
}
206205
vec3 irr_glsl_beckmann_height_correlated_cos_eval_wo_clamps(in float NdotH2, in float NdotL2, in float maxNdotV, in float NdotV2, in float VdotH, in mat2x3 ior, in float a2)
207206
{
208-
const float scalar_part = irr_glsl_beckmann_height_correlated_cos_eval_DG_wo_clamps(NdotH2, NdotL2, NdotV2, a2);
207+
const float NG = irr_glsl_beckmann_height_correlated_cos_eval_DG_wo_clamps(NdotH2, NdotL2, NdotV2, a2);
209208

210209
const vec3 fr = irr_glsl_fresnel_conductor(ior[0], ior[1], VdotH);
211210

212-
return fr*irr_glsl_microfacet_to_light_measure_transform(scalar_part,maxNdotV);
211+
return fr*irr_glsl_microfacet_to_light_measure_transform(NG,maxNdotV);
213212
}
214213
vec3 irr_glsl_beckmann_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)
215214
{
@@ -229,11 +228,11 @@ float irr_glsl_beckmann_aniso_height_correlated_cos_eval_DG_wo_clamps(in float N
229228
}
230229
vec3 irr_glsl_beckmann_aniso_height_correlated_cos_eval_wo_clamps(in float NdotH2, in float TdotH2, in float BdotH2, 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)
231230
{
232-
const float scalar_part = irr_glsl_beckmann_aniso_height_correlated_cos_eval_DG_wo_clamps(NdotH2,TdotH2,BdotH2, NdotL2,TdotL2,BdotL2, NdotV2,TdotV2,BdotV2, ax, ax2, ay, ay2);
231+
const float NG = irr_glsl_beckmann_aniso_height_correlated_cos_eval_DG_wo_clamps(NdotH2,TdotH2,BdotH2, NdotL2,TdotL2,BdotL2, NdotV2,TdotV2,BdotV2, ax, ax2, ay, ay2);
233232

234233
const vec3 fr = irr_glsl_fresnel_conductor(ior[0], ior[1], VdotH);
235234

236-
return fr*irr_glsl_microfacet_to_light_measure_transform(scalar_part,maxNdotV);
235+
return fr*irr_glsl_microfacet_to_light_measure_transform(NG,maxNdotV);
237236
}
238237
vec3 irr_glsl_beckmann_aniso_height_correlated_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)
239238
{

include/irr/builtin/glsl/bxdf/brdf/specular/ggx.glsl

Lines changed: 19 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -20,27 +20,25 @@ vec3 irr_glsl_ggx_height_correlated_aniso_cos_eval(in irr_glsl_BSDFAnisotropicPa
2020
//defined using NDF function with better API (compared to burley used above) and new impl of correlated smith
2121
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)
2222
{
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);
2524
if (ax>FLT_MIN || ay>FLT_MIN)
2625
{
27-
float g = irr_glsl_ggx_smith_correlated_wo_numerator(
26+
NG *= irr_glsl_ggx_smith_correlated_wo_numerator(
2827
maxNdotV, TdotV2, BdotV2, NdotV2,
2928
maxNdotL, TdotL2, BdotL2, NdotL2,
3029
ax2, ay2
3130
);
32-
scalar_part *= g;
3331
}
3432

35-
return scalar_part;
33+
return NG;
3634
}
3735

3836
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)
3937
{
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);
4139

4240
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);
4442
}
4543

4644
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
6462

6563
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)
6664
{
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);
6966
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);
7468

75-
return scalar_part;
69+
return NG;
7670
}
7771

7872
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)
7973
{
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);
8175

8276
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);
8479
}
8580

8681
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
116111
return normalize(vec3(_ax*H.x, _ay*H.y, H.z));
117112
}
118113

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
119115
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)
120116
{
121117
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
137133

138134
float irr_glsl_ggx_pdf_wo_clamps(in float ndf, in float devsh_v, in float maxNdotV)
139135
{
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));
141137
}
142138
float irr_glsl_ggx_pdf_wo_clamps(in float NdotH2, in float maxNdotV, in float NdotV2, in float a2)
143139
{
@@ -159,11 +155,11 @@ float irr_glsl_ggx_pdf_wo_clamps(in float NdotH2, in float TdotH2, in float Bdot
159155

160156
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)
161157
{
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);
164160
pdf = irr_glsl_ggx_pdf_wo_clamps(ndf, devsh_v, maxNdotV);
165161

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);
167163

168164
return reflectance * G2_over_G1;
169165
}
@@ -175,7 +171,7 @@ vec3 irr_glsl_ggx_cos_remainder_and_pdf(out float pdf, in irr_glsl_LightSample _
175171
const float ndf = irr_glsl_ggx_trowbridge_reitz(a2, _cache.NdotH2);
176172
const vec3 reflectance = irr_glsl_fresnel_conductor(ior[0], ior[1], _cache.VdotH);
177173

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);
179175
}
180176
else
181177
{
@@ -215,9 +211,9 @@ vec3 irr_glsl_ggx_aniso_cos_remainder_and_pdf(out float pdf, in irr_glsl_LightSa
215211
const float ax2 = ax*ax;
216212
const float ay2 = ay*ay;
217213
const float ndf = irr_glsl_ggx_aniso(TdotH2,BdotH2,_cache.isotropic.NdotH2, ax, ay, ax2, ay2);
218-
219214
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);
221217
}
222218
else
223219
{

0 commit comments

Comments
 (0)