Skip to content

Commit 7a6a277

Browse files
Fix numerous sampling bugs.
1 parent ae9c586 commit 7a6a277

File tree

10 files changed

+87
-89
lines changed

10 files changed

+87
-89
lines changed

examples_tests/42.FragmentShaderPathTracer/common.glsl

Lines changed: 58 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
// basic settings
22
#define MAX_DEPTH 8
3-
#define SAMPLES 128
3+
#define SAMPLES 32
44

55
// firefly and variance reduction techniques
66
//#define KILL_DIFFUSE_SPECULAR_PATHS
@@ -158,10 +158,6 @@ float BSDFNode_getRoughness(in BSDFNode node)
158158
{
159159
return uintBitsToFloat(node.data[1].w);
160160
}
161-
vec3 BSDFNode_getReflectance(in BSDFNode node)
162-
{
163-
return uintBitsToFloat(node.data[0].rgb);
164-
}
165161
vec3 BSDFNode_getRealEta(in BSDFNode node)
166162
{
167163
return uintBitsToFloat(node.data[0].rgb);
@@ -174,6 +170,15 @@ mat2x3 BSDFNode_getEta(in BSDFNode node)
174170
{
175171
return mat2x3(BSDFNode_getRealEta(node),BSDFNode_getImaginaryEta(node));
176172
}
173+
#include <irr/builtin/glsl/bxdf/fresnel.glsl>
174+
vec3 BSDFNode_getReflectance(in BSDFNode node, in float VdotH)
175+
{
176+
const vec3 albedoOrRealIoR = uintBitsToFloat(node.data[0].rgb);
177+
if (BSDFNode_isNotDiffuse(node))
178+
return irr_glsl_fresnel_conductor(albedoOrRealIoR, BSDFNode_getImaginaryEta(node), VdotH);
179+
else
180+
return albedoOrRealIoR;
181+
}
177182

178183
float BSDFNode_getMISWeight(in BSDFNode bsdf)
179184
{
@@ -198,7 +203,7 @@ BSDFNode bsdfs[BSDF_COUNT] = {
198203
{{uvec4(floatBitsToUint(vec3(1.02,1.02,1.3)),CONDUCTOR_OP),floatBitsToUint(vec4(1.0,1.0,2.0,0.0))}},
199204
{{uvec4(floatBitsToUint(vec3(1.02,1.3,1.02)),CONDUCTOR_OP),floatBitsToUint(vec4(1.0,2.0,1.0,0.0))}},
200205
{{uvec4(floatBitsToUint(vec3(1.02,1.3,1.02)),CONDUCTOR_OP),floatBitsToUint(vec4(1.0,2.0,1.0,0.15))}},
201-
{{uvec4(floatBitsToUint(vec3(1.4,1.45,1.5)),DIELECTRIC_OP),floatBitsToUint(vec4(0.0,0.0,0.0,0.0))}}
206+
{{uvec4(floatBitsToUint(vec3(1.4,1.45,1.5)),DIELECTRIC_OP),floatBitsToUint(vec4(0.0,0.0,0.0,0.05))}}
202207
};
203208

204209

@@ -323,91 +328,82 @@ void missProgram()
323328
}
324329

325330
#include <irr/builtin/glsl/bxdf/brdf/diffuse/oren_nayar.glsl>
331+
#include <irr/builtin/glsl/bxdf/brdf/specular/beckmann.glsl>
326332
#include <irr/builtin/glsl/bxdf/brdf/specular/ggx.glsl>
327-
#include <irr/builtin/glsl/bxdf/bsdf/specular/dielectric.glsl>
328-
irr_glsl_BxDFSample irr_glsl_bsdf_cos_generate(in irr_glsl_AnisotropicViewSurfaceInteraction interaction, in vec3 u, in BSDFNode bsdf, in vec3 luminosityContributionHint)
333+
#include <irr/builtin/glsl/bxdf/bsdf/diffuse/lambert.glsl>
334+
//#include <irr/builtin/glsl/bxdf/bsdf/specular/dielectric.glsl>
335+
//#include <irr/builtin/glsl/bxdf/bsdf/specular/beckmann.glsl>
336+
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)
329337
{
330338
const float a = BSDFNode_getRoughness(bsdf);
331339
const mat2x3 ior = BSDFNode_getEta(bsdf);
332340

333-
irr_glsl_BxDFSample smpl;
341+
irr_glsl_LightSample smpl;
342+
irr_glsl_AnisotropicMicrofacetCache dummy;
334343
switch (BSDFNode_getType(bsdf))
335344
{
336345
case DIFFUSE_OP:
337346
smpl = irr_glsl_oren_nayar_cos_generate(interaction,u.xy,a*a);
338347
break;
339348
case CONDUCTOR_OP:
340-
smpl = irr_glsl_ggx_cos_generate(interaction,u.xy,a,a);
349+
smpl = irr_glsl_ggx_cos_generate(interaction,u.xy,a,a,_cache);
341350
break;
342351
default:
343-
{
344-
const float _eta = dot(ior[0],luminosityContributionHint);
345-
smpl = irr_glsl_smooth_dielectric_cos_generate(interaction,u,_eta);
346-
}
352+
smpl = irr_glsl_beckmann_cos_generate(interaction,u.xy,a,a,_cache);
353+
//smpl = irr_glsl_beckmann_dielectric_cos_generate(interaction,u,a,a,monochromeEta,_cache);
347354
break;
348355
}
349356
return smpl;
350357
}
351358

352-
vec3 irr_glsl_bsdf_cos_remainder_and_pdf(out float pdf, in irr_glsl_BxDFSample _sample, in irr_glsl_AnisotropicViewSurfaceInteraction interaction, in BSDFNode bsdf, in vec3 luminosityContributionHint)
359+
vec3 irr_glsl_bsdf_cos_remainder_and_pdf(out float pdf, in irr_glsl_LightSample _sample, in irr_glsl_AnisotropicViewSurfaceInteraction interaction, in BSDFNode bsdf, in float monochromeEta, in irr_glsl_AnisotropicMicrofacetCache _cache)
353360
{
354-
const vec3 reflectance = BSDFNode_getReflectance(bsdf);
355-
const float a = max(BSDFNode_getRoughness(bsdf),0.01); // TODO: @Crisspl 0-roughness still doesn't work! Also Beckmann has a weird dark rim instead as fresnel!?
356-
const float a2 = a*a;
357-
358-
const mat2x3 ior = BSDFNode_getEta(bsdf);
359-
360-
const float NdotH2 = _sample.NdotH*_sample.NdotH;
361-
const float NdotL2 = _sample.NdotL*_sample.NdotL;
362-
363-
const float VdotL = dot(interaction.isotropic.V.dir,_sample.L);
361+
// are V and L on opposite sides of the surface?
364362
const bool transmitted = irr_glsl_isTransmissionPath(interaction.isotropic.NdotV,_sample.NdotL);
365363

364+
// is the BSDF or BRDF, if it is then we make the dot products `abs` before `max(,0.0)`
366365
const bool transmissive = BSDFNode_isBSDF(bsdf);
367-
const float clampedNdotL = irr_glsl_conditionalAbsOrMax(transmissive,_sample.NdotL,0.0);
368-
const float clampedNdotV = irr_glsl_conditionalAbsOrMax(transmissive,interaction.isotropic.NdotV,0.0);
369366

370-
float rcpOrientedEta, orientedEta2, rcpOrientedEta2;
371-
const bool viewerInsideMedium = irr_glsl_getOrientedEtas(rcpOrientedEta,orientedEta2,rcpOrientedEta2,interaction.isotropic.NdotV,dot(ior[0],luminosityContributionHint));
367+
// obtain stuff for transmissive parts of BSDFs
368+
float orientedEta, rcpOrientedEta;
369+
const bool viewerInsideMedium = irr_glsl_getOrientedEtas(orientedEta,rcpOrientedEta,interaction.isotropic.NdotV,monochromeEta);
372370

373-
vec3 remainder; // TODO should just return a 0.0 remainder if NdotV<FLT_MIN and BSDF is not transmissive
374-
switch (BSDFNode_getType(bsdf))
371+
vec3 remainder;
372+
if (transmissive || !transmitted)
375373
{
376-
case DIFFUSE_OP:
377-
remainder = reflectance*irr_glsl_oren_nayar_cos_remainder_and_pdf_wo_clamps(pdf,a*a,VdotL,clampedNdotL,clampedNdotV);
378-
break;
379-
case CONDUCTOR_OP:
380-
remainder = irr_glsl_ggx_cos_remainder_and_pdf_wo_clamps(pdf,irr_glsl_ggx_trowbridge_reitz(a2,NdotH2),clampedNdotL,NdotL2,clampedNdotV,interaction.isotropic.NdotV_squared,_sample.VdotH,ior,a2);
381-
break;
382-
default:
383-
remainder = vec3(irr_glsl_smooth_dielectric_cos_remainder_and_pdf(pdf, transmitted, rcpOrientedEta2));
384-
break;
385-
}
386-
return remainder;
387-
}
374+
//
375+
const mat2x3 ior = BSDFNode_getEta(bsdf);
376+
const vec3 reflectance = BSDFNode_getReflectance(bsdf,_cache.isotropic.VdotH);
388377

378+
//
379+
const float VdotL = dot(interaction.isotropic.V.dir,_sample.L);
389380

390-
#define GeneratorSample irr_glsl_BxDFSample
391-
#define irr_glsl_LightSample irr_glsl_BxDFSample
392-
irr_glsl_LightSample irr_glsl_createLightSample(in vec3 L, in irr_glsl_AnisotropicViewSurfaceInteraction interaction)
393-
{
394-
irr_glsl_BxDFSample s;
395-
s.L = L;
381+
// is the BSDF or BRDF, if it is then we make the dot products `abs` before `max(,0.0)`
382+
const float clampedNdotL = irr_glsl_conditionalAbsOrMax(transmissive,_sample.NdotL,0.0);
383+
const float clampedNdotV = irr_glsl_conditionalAbsOrMax(transmissive,interaction.isotropic.NdotV,0.0);
396384

397-
s.TdotL = dot(interaction.T,L);
398-
s.BdotL = dot(interaction.B,L);
399-
s.NdotL = dot(interaction.isotropic.N,L);
400-
401-
float VdotL = dot(interaction.isotropic.V.dir,L);
402-
float LplusV_rcpLen = inversesqrt(2.0+2.0*VdotL);
385+
//
386+
const float a = max(BSDFNode_getRoughness(bsdf),0.01); // TODO: @Crisspl 0-roughness still doesn't work! Also Beckmann has a weird dark rim instead as fresnel!?
387+
const float a2 = a*a;
403388

404-
s.TdotH = (interaction.TdotV+s.TdotL)*LplusV_rcpLen;
405-
s.BdotH = (interaction.BdotV+s.BdotL)*LplusV_rcpLen;
406-
s.NdotH = (interaction.isotropic.NdotV+s.NdotL)*LplusV_rcpLen;
407-
408-
s.VdotH = LplusV_rcpLen+LplusV_rcpLen*VdotL;
409-
410-
return s;
389+
switch (BSDFNode_getType(bsdf))
390+
{
391+
case DIFFUSE_OP:
392+
remainder = reflectance*irr_glsl_oren_nayar_cos_remainder_and_pdf_wo_clamps(pdf,a*a,VdotL,clampedNdotL,clampedNdotV);
393+
break;
394+
case CONDUCTOR_OP:
395+
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);
396+
break;
397+
default:
398+
remainder = irr_glsl_beckmann_cos_remainder_and_pdf_wo_clamps(pdf,irr_glsl_beckmann(a2,_cache.isotropic.NdotH2),_sample.NdotL2,clampedNdotV,interaction.isotropic.NdotV_squared,reflectance,a2);
399+
//remainder = vec3(irr_glsl_lambertian_transmitter_cos_remainder_and_pdf(pdf,_sample));
400+
//remainder = vec3(irr_glsl_beckmann_dielectric_cos_remainder_and_pdf(pdf, _sample, interaction.isotropic, monochromeEta, a2));
401+
break;
402+
}
403+
}
404+
else
405+
remainder = vec3(0.0);
406+
return remainder;
411407
}
412408

413409
layout (constant_id = 0) const int MAX_DEPTH_LOG2 = 0;

examples_tests/42.FragmentShaderPathTracer/litBySphere.frag

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -160,7 +160,8 @@ void closestHitProgram(in ImmutableRay_t _immutable, inout irr_glsl_xoroshiro64s
160160
float maxT;
161161
// the probability of generating a sample w.r.t. the light generator only possible and used when it was generated with it!
162162
float lightPdf;
163-
GeneratorSample _sample;
163+
irr_glsl_LightSample _sample;
164+
irr_glsl_AnisotropicMicrofacetCache _cache;
164165
if (doNEE)
165166
{
166167
vec3 lightRemainder;
@@ -172,17 +173,22 @@ void closestHitProgram(in ImmutableRay_t _immutable, inout irr_glsl_xoroshiro64s
172173
throughput *= lightRemainder;
173174
}
174175
const vec3 throughputCIE_Y = transpose(irr_glsl_sRGBtoXYZ)[1]*throughput;
175-
const vec3 luminosityContributionHint = throughputCIE_Y/(throughputCIE_Y.r+throughputCIE_Y.g+throughputCIE_Y.b);
176-
if (!doNEE)
176+
const float monochromeEta = dot(throughputCIE_Y,BSDFNode_getEta(bsdf)[0])/(throughputCIE_Y.r+throughputCIE_Y.g+throughputCIE_Y.b);
177+
if (doNEE)
178+
{
179+
const bool validPath = irr_glsl_calcAnisotropicMicrofacetCache(_cache,interaction,_sample,monochromeEta);
180+
throughput = validPath ? throughput:vec3(0.0);
181+
}
182+
else
177183
{
178184
maxT = FLT_MAX;
179-
_sample = irr_glsl_bsdf_cos_generate(interaction,epsilon,bsdf,luminosityContributionHint);
185+
_sample = irr_glsl_bsdf_cos_generate(interaction,epsilon,bsdf,monochromeEta,_cache);
180186
}
181187

182188
// do a cool trick and always compute the bsdf parts this way! (no divergence)
183189
float bsdfPdf;
184190
// the value of the bsdf divided by the probability of the sample being generated
185-
throughput *= irr_glsl_bsdf_cos_remainder_and_pdf(bsdfPdf,_sample,interaction,bsdf,luminosityContributionHint);
191+
throughput *= irr_glsl_bsdf_cos_remainder_and_pdf(bsdfPdf,_sample,interaction,bsdf,monochromeEta,_cache);
186192

187193
// OETF smallest perceptible value
188194
const float bsdfPdfThreshold = getLuma(irr_glsl_eotf_sRGB(vec3(1.0)/255.0));

examples_tests/42.FragmentShaderPathTracer/litByTriangle.frag

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -445,7 +445,7 @@ void closestHitProgram(in ImmutableRay_t _immutable, inout irr_glsl_xoroshiro64s
445445
float maxT;
446446
// the probability of generating a sample w.r.t. the light generator only possible and used when it was generated with it!
447447
float lightPdf;
448-
GeneratorSample _sample;
448+
irr_glsl_LightSample _sample;
449449
const bool isBSDF = BSDFNode_isBSDF(bsdf);
450450
if (doNEE)
451451
{

include/irr/builtin/glsl/bxdf/brdf/diffuse/lambert.glsl

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,15 +26,15 @@ float irr_glsl_lambertian_cos_eval(in irr_glsl_LightSample _sample)
2626
return irr_glsl_lambertian_cos_eval_rec_pi_factored_out(_sample.NdotL)*irr_glsl_lambertian();
2727
}
2828

29-
irr_glsl_LightSample irr_glsl_lambertian_cos_generate_wo_clamps(in vec3 V, in mat3 m, in vec2 u)
29+
irr_glsl_LightSample irr_glsl_lambertian_cos_generate_wo_clamps(in vec3 tangentSpaceV, in mat3 m, in vec2 u)
3030
{
3131
vec3 L = irr_glsl_projected_hemisphere_generate(u);
3232

33-
return irr_glsl_createLightSampleTangentSpaceL(V,L,m);
33+
return irr_glsl_createLightSampleTangentSpace(tangentSpaceV,L,m);
3434
}
3535
irr_glsl_LightSample irr_glsl_lambertian_cos_generate(in irr_glsl_AnisotropicViewSurfaceInteraction interaction, in vec2 u)
3636
{
37-
return irr_glsl_lambertian_cos_generate_wo_clamps(interaction.isotropic.V.dir,irr_glsl_getTangentFrame(interaction),u);
37+
return irr_glsl_lambertian_cos_generate_wo_clamps(irr_glsl_getTangentSpaceV(interaction),irr_glsl_getTangentFrame(interaction),u);
3838
}
3939

4040

include/irr/builtin/glsl/bxdf/brdf/diffuse/oren_nayar.glsl

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,14 +31,14 @@ float irr_glsl_oren_nayar_cos_eval(in irr_glsl_LightSample _sample, in irr_glsl_
3131
}
3232

3333

34-
irr_glsl_LightSample irr_glsl_oren_nayar_cos_generate_wo_clamps(in vec3 V, in mat3 m, in vec2 u)
34+
irr_glsl_LightSample irr_glsl_oren_nayar_cos_generate_wo_clamps(in vec3 tangentSpaceV, in mat3 m, in vec2 u)
3535
{
3636
// until we find something better
37-
return irr_glsl_lambertian_cos_generate_wo_clamps(V, m, u);
37+
return irr_glsl_lambertian_cos_generate_wo_clamps(tangentSpaceV, m, u);
3838
}
3939
irr_glsl_LightSample irr_glsl_oren_nayar_cos_generate(in irr_glsl_AnisotropicViewSurfaceInteraction interaction, in vec2 u, in float a2)
4040
{
41-
return irr_glsl_oren_nayar_cos_generate_wo_clamps(interaction.isotropic.V.dir,irr_glsl_getTangentFrame(interaction),u);
41+
return irr_glsl_oren_nayar_cos_generate_wo_clamps(irr_glsl_getTangentSpaceV(interaction),irr_glsl_getTangentFrame(interaction),u);
4242
}
4343

4444

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ irr_glsl_LightSample irr_glsl_beckmann_cos_generate_wo_clamps(in vec3 localV, in
8484
vec3 localL;
8585
_cache = irr_glsl_calcAnisotropicMicrofacetCache(localV,H,localL);
8686

87-
return irr_glsl_createLightSampleTangentSpaceL(localV,localL,m);
87+
return irr_glsl_createLightSampleTangentSpace(localV,localL,m);
8888
}
8989

9090
irr_glsl_LightSample irr_glsl_beckmann_cos_generate(in irr_glsl_AnisotropicViewSurfaceInteraction interaction, in vec2 u, in float ax, in float ay, out irr_glsl_AnisotropicMicrofacetCache _cache)

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ irr_glsl_LightSample irr_glsl_blinn_phong_cos_generate(in irr_glsl_AnisotropicVi
3939
_cache = irr_glsl_calcAnisotropicMicrofacetCache(localV,H,localL);
4040

4141
const mat3 m = irr_glsl_getTangentFrame(interaction);
42-
return irr_glsl_createLightSampleTangentSpaceL(localV, localL, m);
42+
return irr_glsl_createLightSampleTangentSpace(localV, localL, m);
4343
}
4444

4545
/*

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

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,7 @@ irr_glsl_LightSample irr_glsl_ggx_cos_generate_wo_clamps(in vec3 localV, in mat3
123123
vec3 localL;
124124
_cache = irr_glsl_calcAnisotropicMicrofacetCache(localV,H,localL);
125125

126-
return irr_glsl_createLightSampleTangentSpaceL(localV,localL,m);
126+
return irr_glsl_createLightSampleTangentSpace(localV,localL,m);
127127
}
128128

129129
irr_glsl_LightSample irr_glsl_ggx_cos_generate(in irr_glsl_AnisotropicViewSurfaceInteraction interaction, in vec2 u, in float _ax, in float _ay, out irr_glsl_AnisotropicMicrofacetCache _cache)
@@ -157,7 +157,7 @@ float irr_glsl_ggx_pdf_wo_clamps(in float NdotH2, in float TdotH2, in float Bdot
157157

158158

159159

160-
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 float VdotH, in vec3 reflectance, in float a2)
160+
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)
161161
{
162162
float one_minus_a2 = 1.0 - a2;
163163
float devsh_v = irr_glsl_smith_ggx_devsh_part(NdotV2, a2, one_minus_a2);
@@ -175,7 +175,7 @@ vec3 irr_glsl_ggx_cos_remainder_and_pdf(out float pdf, in irr_glsl_LightSample _
175175
const float ndf = irr_glsl_ggx_trowbridge_reitz(a2, _cache.NdotH2);
176176
const vec3 reflectance = irr_glsl_fresnel_conductor(ior[0], ior[1], _cache.VdotH);
177177

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, _cache.VdotH, reflectance, a2);
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);
179179
}
180180
else
181181
{
@@ -185,7 +185,7 @@ vec3 irr_glsl_ggx_cos_remainder_and_pdf(out float pdf, in irr_glsl_LightSample _
185185
}
186186

187187

188-
vec3 irr_glsl_ggx_aniso_cos_remainder_and_pdf_wo_clamps(out float pdf, in float ndf, in float maxNdotL, in float NdotL2, in float TdotL2, in float BdotL2, in float maxNdotV, in float TdotV2, in float BdotV2, in float NdotV2, in float VdotH, in vec3 reflectance, in float ax2,in float ay2)
188+
vec3 irr_glsl_ggx_aniso_cos_remainder_and_pdf_wo_clamps(out float pdf, in float ndf, in float maxNdotL, in float NdotL2, in float TdotL2, in float BdotL2, in float maxNdotV, in float TdotV2, in float BdotV2, in float NdotV2, in vec3 reflectance, in float ax2,in float ay2)
189189
{
190190
const float devsh_v = irr_glsl_smith_ggx_devsh_part(TdotV2, BdotV2, NdotV2, ax2, ay2);
191191
pdf = irr_glsl_ggx_pdf_wo_clamps(ndf, devsh_v, maxNdotV);
@@ -217,7 +217,7 @@ vec3 irr_glsl_ggx_aniso_cos_remainder_and_pdf(out float pdf, in irr_glsl_LightSa
217217
const float ndf = irr_glsl_ggx_aniso(TdotH2,BdotH2,_cache.isotropic.NdotH2, ax, ay, ax2, ay2);
218218

219219
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, _cache.isotropic.VdotH, reflectance, ax2, ay2);
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);
221221
}
222222
else
223223
{

include/irr/builtin/glsl/bxdf/bsdf/diffuse/lambert.glsl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,11 +30,11 @@ irr_glsl_LightSample irr_glsl_lambertian_transmitter_cos_generate_wo_clamps(in v
3030
{
3131
vec3 L = irr_glsl_projected_sphere_generate(u);
3232

33-
return irr_glsl_createLightSampleTangentSpaceL(tangentSpaceV,L,m);
33+
return irr_glsl_createLightSampleTangentSpace(tangentSpaceV,L,m);
3434
}
3535
irr_glsl_LightSample irr_glsl_lambertian_transmitter_cos_generate(in irr_glsl_AnisotropicViewSurfaceInteraction interaction, in vec3 u)
3636
{
37-
return irr_glsl_lambertian_transmitter_cos_generate_wo_clamps(interaction.isotropic.V.dir,irr_glsl_getTangentFrame(interaction),u);
37+
return irr_glsl_lambertian_transmitter_cos_generate_wo_clamps(irr_glsl_getTangentSpaceV(interaction),irr_glsl_getTangentFrame(interaction),u);
3838
}
3939

4040

include/irr/builtin/glsl/bxdf/common.glsl

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -55,12 +55,12 @@ struct irr_glsl_LightSample
5555
};
5656

5757
// require tangentSpaceL already be normalized and in tangent space (tangentSpaceL==vec3(TdotL,BdotL,NdotL))
58-
irr_glsl_LightSample irr_glsl_createLightSampleTangentSpaceL(in vec3 V, in vec3 tangentSpaceL, in mat3 tangentFrame)
58+
irr_glsl_LightSample irr_glsl_createLightSampleTangentSpace(in vec3 tangentSpaceV, in vec3 tangentSpaceL, in mat3 tangentFrame)
5959
{
6060
irr_glsl_LightSample s;
6161

6262
s.L = tangentFrame*tangentSpaceL; // m must be an orthonormal matrix
63-
s.VdotL = dot(V,s.L);
63+
s.VdotL = dot(tangentSpaceV,tangentSpaceL);
6464

6565
s.TdotL = tangentSpaceL.x;
6666
s.BdotL = tangentSpaceL.y;
@@ -69,10 +69,6 @@ irr_glsl_LightSample irr_glsl_createLightSampleTangentSpaceL(in vec3 V, in vec3
6969

7070
return s;
7171
}
72-
irr_glsl_LightSample irr_glsl_createLightSampleTangentSpaceL(in vec3 tangentSpaceL, in irr_glsl_AnisotropicViewSurfaceInteraction interaction)
73-
{
74-
return irr_glsl_createLightSampleTangentSpaceL(interaction.isotropic.V.dir,tangentSpaceL,irr_glsl_getTangentFrame(interaction));
75-
}
7672

7773
//
7874
irr_glsl_LightSample irr_glsl_createLightSample(in vec3 L, in float VdotL, in irr_glsl_IsotropicViewSurfaceInteraction interaction)

0 commit comments

Comments
 (0)