Skip to content

Commit 8e2ff25

Browse files
committed
Merge branch 'shader_pipeline_irrlichtbaw' of https://github.com/Devsh-Graphics-Programming/Nabla into master
2 parents efcaf41 + b971544 commit 8e2ff25

File tree

14 files changed

+349
-203
lines changed

14 files changed

+349
-203
lines changed

examples_tests/42.FragmentShaderPathTracer/common.glsl

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -203,7 +203,7 @@ BSDFNode bsdfs[BSDF_COUNT] = {
203203
{{uvec4(floatBitsToUint(vec3(1.02,1.02,1.3)),CONDUCTOR_OP),floatBitsToUint(vec4(1.0,1.0,2.0,0.0))}},
204204
{{uvec4(floatBitsToUint(vec3(1.02,1.3,1.02)),CONDUCTOR_OP),floatBitsToUint(vec4(1.0,2.0,1.0,0.0))}},
205205
{{uvec4(floatBitsToUint(vec3(1.02,1.3,1.02)),CONDUCTOR_OP),floatBitsToUint(vec4(1.0,2.0,1.0,0.15))}},
206-
{{uvec4(floatBitsToUint(vec3(1.4,1.45,1.5)),DIELECTRIC_OP),floatBitsToUint(vec4(0.0,0.0,0.0,0.125))}}
206+
{{uvec4(floatBitsToUint(vec3(1.4,1.45,1.5)),DIELECTRIC_OP),floatBitsToUint(vec4(0.0,0.0,0.0,0.0625))}}
207207
};
208208

209209

@@ -281,7 +281,7 @@ bool anyHitProgram(in ImmutableRay_t _immutable)
281281
}
282282

283283

284-
#define INTERSECTION_ERROR_BOUND_LOG2 (-9.0)
284+
#define INTERSECTION_ERROR_BOUND_LOG2 (-8.0)
285285
float getTolerance_common(in int depth)
286286
{
287287
float depthRcp = 1.0/float(depth);
@@ -333,6 +333,7 @@ void missProgram()
333333
#include <irr/builtin/glsl/bxdf/bsdf/diffuse/lambert.glsl>
334334
#include <irr/builtin/glsl/bxdf/bsdf/specular/dielectric.glsl>
335335
#include <irr/builtin/glsl/bxdf/bsdf/specular/beckmann.glsl>
336+
#include <irr/builtin/glsl/bxdf/bsdf/specular/ggx.glsl>
336337
irr_glsl_LightSample irr_glsl_bsdf_cos_generate(in irr_glsl_AnisotropicViewSurfaceInteraction interaction, in vec3 u, in BSDFNode bsdf, in float monochromeEta, out irr_glsl_AnisotropicMicrofacetCache _cache)
337338
{
338339
const float a = BSDFNode_getRoughness(bsdf);
@@ -353,7 +354,7 @@ irr_glsl_LightSample irr_glsl_bsdf_cos_generate(in irr_glsl_AnisotropicViewSurfa
353354
smpl = irr_glsl_ggx_cos_generate(interaction,u.xy,a,a,_cache);
354355
break;
355356
default:
356-
smpl = irr_glsl_beckmann_dielectric_cos_generate(interaction,u,a,a,monochromeEta,_cache);
357+
smpl = irr_glsl_ggx_dielectric_cos_generate(interaction,u,a,a,monochromeEta,_cache);
357358
break;
358359
}
359360
return smpl;
@@ -398,7 +399,7 @@ vec3 irr_glsl_bsdf_cos_remainder_and_pdf(out float pdf, in irr_glsl_LightSample
398399
remainder = irr_glsl_ggx_cos_remainder_and_pdf_wo_clamps(pdf,irr_glsl_ggx_trowbridge_reitz(a2,_cache.isotropic.NdotH2),clampedNdotL,_sample.NdotL2,clampedNdotV,interaction.isotropic.NdotV_squared,reflectance,a2);
399400
break;
400401
default:
401-
remainder = vec3(irr_glsl_beckmann_dielectric_cos_remainder_and_pdf(pdf, _sample, interaction.isotropic, _cache.isotropic, monochromeEta, a2));
402+
remainder = vec3(irr_glsl_ggx_dielectric_cos_remainder_and_pdf(pdf, _sample, interaction.isotropic, _cache.isotropic, monochromeEta, a*a));
402403
break;
403404
}
404405
}

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

Lines changed: 19 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ vec3 irr_glsl_beckmann_cos_generate_wo_clamps(in vec3 localV, in vec2 u, in floa
5959

6060
b -= value/derivative;
6161
}
62+
// TODO: investigate if we can replace these two erf^-1 calls with a box muller transform
6263
slope.x = irr_glsl_erfInv(b);
6364
slope.y = irr_glsl_erfInv(2.0 * max(u.y,1.0e-6) - 1.0);
6465
}
@@ -77,6 +78,7 @@ vec3 irr_glsl_beckmann_cos_generate_wo_clamps(in vec3 localV, in vec2 u, in floa
7778
return normalize(vec3(-slope, 1.0));
7879
}
7980

81+
// 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
8082
irr_glsl_LightSample irr_glsl_beckmann_cos_generate_wo_clamps(in vec3 localV, in mat3 m, in vec2 u, in float ax, in float ay, out irr_glsl_AnisotropicMicrofacetCache _cache)
8183
{
8284
const vec3 H = irr_glsl_beckmann_cos_generate_wo_clamps(localV,u,ax,ay);
@@ -192,25 +194,21 @@ vec3 irr_glsl_beckmann_aniso_cos_remainder_and_pdf(out float pdf, in irr_glsl_Li
192194
}
193195

194196

195-
196-
float irr_glsl_beckmann_height_correlated_cos_eval_DG_wo_clamps(in float NdotH2, in float NdotL2, in float maxNdotV, in float NdotV2, in float a2)
197+
float irr_glsl_beckmann_height_correlated_cos_eval_DG_wo_clamps(in float NdotH2, in float NdotL2, in float NdotV2, in float a2)
197198
{
198-
float ndf = irr_glsl_beckmann(a2, NdotH2);
199-
float scalar_part = ndf / (4.0 * maxNdotV);
199+
float NG = irr_glsl_beckmann(a2, NdotH2);
200200
if (a2>FLT_MIN)
201-
{
202-
float g = irr_glsl_beckmann_smith_correlated(NdotV2, NdotL2, a2);
203-
scalar_part *= g;
204-
}
201+
NG *= irr_glsl_beckmann_smith_correlated(NdotV2, NdotL2, a2);
205202

206-
return scalar_part;
203+
return NG;
207204
}
208205
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)
209206
{
210-
float scalar_part = irr_glsl_beckmann_height_correlated_cos_eval_DG_wo_clamps(NdotH2, NdotL2, maxNdotV, NdotV2, a2);
211-
vec3 fr = irr_glsl_fresnel_conductor(ior[0], ior[1], VdotH);
212-
213-
return scalar_part*fr;
207+
const float NG = irr_glsl_beckmann_height_correlated_cos_eval_DG_wo_clamps(NdotH2, NdotL2, NdotV2, a2);
208+
209+
const vec3 fr = irr_glsl_fresnel_conductor(ior[0], ior[1], VdotH);
210+
211+
return fr*irr_glsl_microfacet_to_light_measure_transform(NG,maxNdotV);
214212
}
215213
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)
216214
{
@@ -220,24 +218,21 @@ vec3 irr_glsl_beckmann_height_correlated_cos_eval(in irr_glsl_LightSample _sampl
220218
return vec3(0.0);
221219
}
222220

223-
float irr_glsl_beckmann_aniso_height_correlated_cos_eval_DG_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 ax, in float ax2, in float ay, in float ay2)
221+
float irr_glsl_beckmann_aniso_height_correlated_cos_eval_DG_wo_clamps(in float NdotH2, in float TdotH2, in float BdotH2, in float NdotL2, in float TdotL2, in float BdotL2, in float NdotV2, in float TdotV2, in float BdotV2, in float ax, in float ax2, in float ay, in float ay2)
224222
{
225-
float ndf = irr_glsl_beckmann(ax, ay, ax2, ay2, TdotH2, BdotH2, NdotH2);
226-
float scalar_part = ndf / (4.0 * maxNdotV);
223+
float NG = irr_glsl_beckmann(ax, ay, ax2, ay2, TdotH2, BdotH2, NdotH2);
227224
if (ax>FLT_MIN || ay>FLT_MIN)
228-
{
229-
float g = irr_glsl_beckmann_smith_correlated(TdotV2, BdotV2, NdotV2, TdotL2, BdotL2, NdotL2, ax2, ay2);
230-
scalar_part *= g;
231-
}
225+
NG *= irr_glsl_beckmann_smith_correlated(TdotV2, BdotV2, NdotV2, TdotL2, BdotL2, NdotL2, ax2, ay2);
232226

233-
return scalar_part;
227+
return NG;
234228
}
235229
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)
236230
{
237-
float scalar_part = irr_glsl_beckmann_aniso_height_correlated_cos_eval_DG_wo_clamps(NdotH2,TdotH2,BdotH2, NdotL2,TdotL2,BdotL2, maxNdotV,NdotV2,TdotV2,BdotV2, ax, ax2, ay, ay2);
238-
vec3 fr = irr_glsl_fresnel_conductor(ior[0], ior[1], VdotH);
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);
232+
233+
const vec3 fr = irr_glsl_fresnel_conductor(ior[0], ior[1], VdotH);
239234

240-
return scalar_part*fr;
235+
return fr*irr_glsl_microfacet_to_light_measure_transform(NG,maxNdotV);
241236
}
242237
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)
243238
{

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

Lines changed: 12 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -60,27 +60,23 @@ vec3 irr_glsl_blinn_phong_conductor_cos_remainder_and_pdf(out float pdf, in irr_
6060
}
6161
*/
6262

63-
float irr_glsl_blinn_phong_cos_eval_DG_wo_clamps(in float NdotH, in float maxNdotV, in float NdotV_squared, in float NdotL2, in float n, in float a2)
63+
float irr_glsl_blinn_phong_cos_eval_DG_wo_clamps(in float NdotH, in float NdotV_squared, in float NdotL2, in float n, in float a2)
6464
{
65-
float d = irr_glsl_blinn_phong(NdotH, n);
66-
float scalar_part = d/(4.0*maxNdotV);
65+
float NG = irr_glsl_blinn_phong(NdotH, n);
6766
if (a2>FLT_MIN)
68-
{
69-
float g = irr_glsl_beckmann_smith_correlated(NdotV_squared, NdotL2, a2);
70-
scalar_part *= g;
71-
}
67+
NG *= irr_glsl_beckmann_smith_correlated(NdotV_squared, NdotL2, a2);
7268
return scalar_part;
7369
}
74-
float irr_glsl_blinn_phong_cos_eval_DG_wo_clamps(in float NdotH, in float maxNdotV, in float NdotV_squared, in float NdotL2, in float n)
70+
float irr_glsl_blinn_phong_cos_eval_DG_wo_clamps(in float NdotH, in float NdotV_squared, in float NdotL2, in float n)
7571
{
7672
float a2 = irr_glsl_phong_exp_to_alpha2(n);
77-
return irr_glsl_blinn_phong_cos_eval_DG_wo_clamps(NdotH, maxNdotV, NdotV_squared, NdotL2, n, a2);
73+
return irr_glsl_blinn_phong_cos_eval_DG_wo_clamps(NdotH, NdotV_squared, NdotL2, n, a2);
7874
}
7975

8076
vec3 irr_glsl_blinn_phong_cos_eval_wo_clamps(in float NdotH, in float maxNdotV, in float NdotV_squared, in float NdotL2, in float VdotH, in float n, in mat2x3 ior, in float a2)
8177
{
82-
float scalar_part = irr_glsl_blinn_phong_cos_eval_DG_wo_clamps(NdotH, maxNdotV, NdotV_squared, NdotL2, n, a2);
83-
return scalar_part*irr_glsl_fresnel_conductor(ior[0], ior[1], VdotH);
78+
float scalar_part = irr_glsl_blinn_phong_cos_eval_DG_wo_clamps(NdotH, NdotV_squared, NdotL2, n, a2);
79+
return irr_glsl_fresnel_conductor(ior[0], ior[1], VdotH)*irr_glsl_microfacet_to_light_measure_transform(scalar_part,maxNdotV);
8480
}
8581
vec3 irr_glsl_blinn_phong_cos_eval_wo_clamps(in float NdotH, in float maxNdotV, in float NdotV_squared, in float NdotL2, in float VdotH, in float n, in mat2x3 ior)
8682
{
@@ -96,31 +92,26 @@ vec3 irr_glsl_blinn_phong_cos_eval(in irr_glsl_LightSample _sample, in irr_glsl_
9692
}
9793

9894

99-
float irr_glsl_blinn_phong_cos_eval_DG_wo_clamps(in float NdotH, in float NdotH2, in float TdotH2, in float BdotH2, float TdotL2, float BdotL2, in float maxNdotV, in float TdotV2, in float BdotV2, in float NdotV_squared, in float NdotL2, in float nx, in float ny, in float ax2, in float ay2)
95+
float irr_glsl_blinn_phong_cos_eval_DG_wo_clamps(in float NdotH, in float NdotH2, in float TdotH2, in float BdotH2, float TdotL2, float BdotL2, in float TdotV2, in float BdotV2, in float NdotV_squared, in float NdotL2, in float nx, in float ny, in float ax2, in float ay2)
10096
{
10197
float d = irr_glsl_blinn_phong(NdotH, 1.0/(1.0-NdotH2), TdotH2, BdotH2, nx, ny);
102-
float scalar_part = d/(4.0*maxNdotV);
10398
if (ax2>FLT_MIN || ay2>FLT_MIN)
104-
{
105-
float g = irr_glsl_beckmann_smith_correlated(TdotV2, BdotV2, NdotV_squared, TdotL2, BdotL2, NdotL2, ax2, ay2);
106-
scalar_part *= g;
107-
}
108-
99+
NG *= irr_glsl_beckmann_smith_correlated(TdotV2, BdotV2, NdotV_squared, TdotL2, BdotL2, NdotL2, ax2, ay2);
109100
return scalar_part;
110101
}
111-
float irr_glsl_blinn_phong_cos_eval_DG_wo_clamps(in float NdotH, in float NdotH2, in float TdotH2, in float BdotH2, in float TdotL2, in float BdotL2, in float maxNdotV, in float TdotV2, in float BdotV2, in float NdotV_squared, in float NdotL2, in float nx, in float ny)
102+
float irr_glsl_blinn_phong_cos_eval_DG_wo_clamps(in float NdotH, in float NdotH2, in float TdotH2, in float BdotH2, in float TdotL2, in float BdotL2, in float TdotV2, in float BdotV2, in float NdotV_squared, in float NdotL2, in float nx, in float ny)
112103
{
113104
float ax2 = irr_glsl_phong_exp_to_alpha2(nx);
114105
float ay2 = irr_glsl_phong_exp_to_alpha2(ny);
115106

116-
return irr_glsl_blinn_phong_cos_eval_DG_wo_clamps(NdotH, NdotH2, TdotH2, BdotH2, TdotL2, BdotL2, maxNdotV, TdotV2, BdotV2, NdotV_squared, NdotL2, nx, ny, ax2, ay2);
107+
return irr_glsl_blinn_phong_cos_eval_DG_wo_clamps(NdotH, NdotH2, TdotH2, BdotH2, TdotL2, BdotL2, TdotV2, BdotV2, NdotV_squared, NdotL2, nx, ny, ax2, ay2);
117108
}
118109

119110
vec3 irr_glsl_blinn_phong_cos_eval_wo_clamps(in float NdotH, in float NdotH2, in float TdotH2, in float BdotH2, in float TdotL2, in float BdotL2, in float maxNdotV, in float TdotV2, in float BdotV2, in float NdotV_squared, in float NdotL2, in float VdotH, in float nx, in float ny, in mat2x3 ior, in float ax2, in float ay2)
120111
{
121112
float scalar_part = irr_glsl_blinn_phong_cos_eval_DG_wo_clamps(NdotH, NdotH2, TdotH2, BdotH2, TdotL2, BdotL2, maxNdotV, TdotV2, BdotV2, NdotV_squared, NdotL2, nx, ny, ax2, ay2);
122113

123-
return scalar_part*irr_glsl_fresnel_conductor(ior[0], ior[1], VdotH);
114+
return irr_glsl_fresnel_conductor(ior[0], ior[1], VdotH)*irr_glsl_microfacet_to_light_measure_transform(scalar_part,maxNdotV);
124115
}
125116
vec3 irr_glsl_blinn_phong_cos_eval_wo_clamps(in float NdotH, in float NdotH2, in float TdotH2, in float BdotH2, in float TdotL2, in float BdotL2, in float maxNdotV, in float TdotV2, in float BdotV2, in float NdotV_squared, in float NdotL2, in float VdotH, in float nx, in float ny, in mat2x3 ior)
126117
{

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)