7
7
#error "You need to define 'vec3 irr_glsl_MC_getNormalizedWorldSpaceV()', 'vec3 irr_glsl_MC_getNormalizedWorldSpaceN()' , 'irr_glsl_MC_getWorldSpacePosition()', 'instr_t irr_glsl_MC_fetchInstr(in uint )', 'prefetch_instr_t irr_glsl_MC_fetchPrefetchInstr(in uint )', 'bsdf_data_t irr_glsl_MC_fetchBSDFData(in uint )' functions above"
8
8
#endif
9
9
10
- #include < irr/ builtin/ glsl/ bxdf/ common.glsl>
11
10
#include < irr/ builtin/ glsl/ math/ functions.glsl>
12
11
#include < irr/ builtin/ glsl/ format/ decode.glsl>
13
12
@@ -201,28 +200,30 @@ bool op_isDiffuse(in uint op)
201
200
#include < irr/ builtin/ glsl/ bump_mapping/ utils.glsl>
202
201
203
202
// irr_glsl_BSDFAnisotropicParams currBSDFParams;
204
- irr_glsl_AnisotropicViewSurfaceInteraction currInteraction;
203
+ MC_interaction_t currInteraction;
205
204
reg_t registers[REG_COUNT];
206
205
207
206
void updateLightSampleAfterNormalChange(inout irr_glsl_LightSample out_s)
208
207
{
209
- out_s.TdotL = dot (currInteraction.T, out_s.L);
210
- out_s.BdotL = dot (currInteraction.B, out_s.L);
211
- out_s.NdotL = dot (currInteraction.isotropic.N, out_s.L);
208
+ out_s.TdotL = dot (currInteraction.inner. T, out_s.L);
209
+ out_s.BdotL = dot (currInteraction.inner. B, out_s.L);
210
+ out_s.NdotL = dot (currInteraction.inner. isotropic.N, out_s.L);
212
211
out_s.NdotL2 = out_s.NdotL* out_s.NdotL;
213
212
}
214
- void updateMicrofacetCacheAfterNormalChange(in irr_glsl_LightSample s, inout irr_glsl_AnisotropicMicrofacetCache out_microfacet)
213
+ void updateMicrofacetCacheAfterNormalChange(in irr_glsl_LightSample s, inout MC_microfacet_t out_microfacet)
215
214
{
216
215
const float NdotL = s.NdotL;
217
- const float NdotV = currInteraction.isotropic.NdotV;
216
+ const float NdotV = currInteraction.inner. isotropic.NdotV;
218
217
219
218
const float LplusV_rcplen = inversesqrt (2.0 + 2.0 * s.VdotL);
220
219
221
- out_microfacet.isotropic.NdotH = (NdotL + NdotV) * LplusV_rcplen;
222
- out_microfacet.isotropic.NdotH2 = out_microfacet.isotropic.NdotH * out_microfacet.isotropic.NdotH;
220
+ out_microfacet.inner.isotropic.NdotH = (NdotL + NdotV) * LplusV_rcplen;
221
+ out_microfacet.inner.isotropic.NdotH2 = out_microfacet.inner.isotropic.NdotH * out_microfacet.inner.isotropic.NdotH;
222
+
223
+ out_microfacet.inner.TdotH = (currInteraction.inner.TdotV + s.TdotL) * LplusV_rcplen;
224
+ out_microfacet.inner.BdotH = (currInteraction.inner.BdotV + s.BdotL) * LplusV_rcplen;
223
225
224
- out_microfacet.TdotH = (currInteraction.TdotV + s.TdotL) * LplusV_rcplen;
225
- out_microfacet.BdotH = (currInteraction.BdotV + s.BdotL) * LplusV_rcplen;
226
+ finalizeMicrofacet(out_microfacet);
226
227
}
227
228
228
229
vec3 textureOrRGBconst(in uvec2 data, in bool texPresenceFlag)
@@ -341,7 +342,8 @@ mat2x4 instr_fetchSrcRegs(in instr_t i)
341
342
void setCurrInteraction(in vec3 N, in vec3 V, in vec3 pos)
342
343
{
343
344
irr_glsl_IsotropicViewSurfaceInteraction interaction = irr_glsl_calcFragmentShaderSurfaceInteractionFromViewVector(V, pos, N);
344
- currInteraction = irr_glsl_calcAnisotropicInteraction(interaction);
345
+ currInteraction.inner = irr_glsl_calcAnisotropicInteraction(interaction);
346
+ finalizeInteraction(currInteraction);
345
347
}
346
348
void setCurrInteraction(in MC_precomputed_t precomp)
347
349
{
@@ -387,7 +389,7 @@ bxdf_eval_t instr_execute_cos_eval_COATING(in instr_t instr, in mat2x4 srcs, in
387
389
388
390
// TODO include thickness_sigma in diffuse weight computation: exp(sigma_thickness * freePath)
389
391
// freePath = ( sqrt(refract_compute_NdotT2(NdotL2, rcpOrientedEta2)) + sqrt(refract_compute_NdotT2(NdotV2, rcpOrientedEta2)) )
390
- vec3 fresnelNdotV = irr_glsl_fresnel_dielectric_frontface_only(eta, max (currInteraction.isotropic.NdotV, 0.0 ));
392
+ vec3 fresnelNdotV = irr_glsl_fresnel_dielectric_frontface_only(eta, max (currInteraction.inner. isotropic.NdotV, 0.0 ));
391
393
vec3 wd = irr_glsl_diffuseFresnelCorrectionFactor(eta, eta2) * (vec3 (1.0 ) - fresnelNdotV) * (vec3 (1.0 ) - irr_glsl_fresnel_dielectric_frontface_only(eta, s.NdotL));
392
394
393
395
bxdf_eval_t coat = srcs[0 ].xyz;
@@ -513,13 +515,13 @@ void runNormalPrecompStream(in instr_stream_t stream, in mat2 dUV, in MC_precomp
513
515
vec2 dh = readReg2(srcreg);
514
516
515
517
writeReg(dstreg,
516
- irr_glsl_perturbNormal_derivativeMap(currInteraction.isotropic.N, dh, currInteraction.isotropic.V.dPosdScreen, dUV)
518
+ irr_glsl_perturbNormal_derivativeMap(currInteraction.inner. isotropic.N, dh, currInteraction.inner .isotropic.V.dPosdScreen, dUV)
517
519
);
518
520
}
519
521
}
520
522
521
523
#ifdef GEN_CHOICE_STREAM
522
- void instr_eval_and_pdf_execute(in instr_t instr, in MC_precomputed_t precomp, in irr_glsl_LightSample s, in irr_glsl_AnisotropicMicrofacetCache _microfacet, in bool skip)
524
+ void instr_eval_and_pdf_execute(in instr_t instr, in MC_precomputed_t precomp, in irr_glsl_LightSample s, in MC_microfacet_t _microfacet, in bool skip)
523
525
{
524
526
const uint op = instr_getOpcode(instr);
525
527
const bool is_bxdf = op_isBXDF(op);
@@ -533,7 +535,7 @@ void instr_eval_and_pdf_execute(in instr_t instr, in MC_precomputed_t precomp, i
533
535
bsdf_data_t bsdf_data;
534
536
mat2x3 ior;
535
537
mat2x3 ior2;
536
- irr_glsl_AnisotropicMicrofacetCache microfacet;
538
+ MC_microfacet_t microfacet;
537
539
538
540
const bool run = ! skip;
539
541
@@ -545,7 +547,7 @@ void instr_eval_and_pdf_execute(in instr_t instr, in MC_precomputed_t precomp, i
545
547
params = instr_getParameters(instr, bsdf_data);
546
548
}
547
549
548
- const float NdotV = irr_glsl_conditionalAbsOrMax(is_bsdf, currInteraction.isotropic.NdotV, 0.0 );
550
+ const float NdotV = irr_glsl_conditionalAbsOrMax(is_bsdf, currInteraction.inner. isotropic.NdotV, 0.0 );
549
551
550
552
vec3 eval = vec3 (0.0 );
551
553
float pdf = 0.0 ;
@@ -584,29 +586,30 @@ void instr_eval_and_pdf_execute(in instr_t instr, in MC_precomputed_t precomp, i
584
586
bool is_valid = true;
585
587
bool refraction = false;
586
588
#ifdef OP_DIELECTRIC
587
- if (op == OP_DIELECTRIC && irr_glsl_isTransmissionPath(currInteraction.isotropic.NdotV, s.NdotL))
589
+ if (op == OP_DIELECTRIC && irr_glsl_isTransmissionPath(currInteraction.inner. isotropic.NdotV, s.NdotL))
588
590
{
589
- irr_glsl_calcAnisotropicMicrofacetCache(microfacet, true, currInteraction.isotropic.V.dir, s.L, currInteraction.T, currInteraction.B, currInteraction.isotropic.N, s.NdotL, s.VdotL, eta, rcp_eta);
591
+ irr_glsl_calcAnisotropicMicrofacetCache(microfacet.inner, true, currInteraction.inner.isotropic.V.dir, s.L, currInteraction.inner.T, currInteraction.inner.B, currInteraction.inner.isotropic.N, s.NdotL, s.VdotL, eta, rcp_eta);
592
+ finalizeMicrofacet(microfacet);
590
593
refraction = true;
591
594
}
592
595
else
593
596
#endif
594
597
microfacet = _microfacet;
595
598
596
599
#if defined(OP_DIELECTRIC) || defined(OP_CONDUCTOR)
597
- is_valid = irr_glsl_isValidVNDFMicrofacet(microfacet.isotropic, is_bsdf, refraction, s.VdotL, eta, rcp_eta);
600
+ is_valid = irr_glsl_isValidVNDFMicrofacet(microfacet.inner. isotropic, is_bsdf, refraction, s.VdotL, eta, rcp_eta);
598
601
#endif
599
602
600
603
if (is_valid && a > ALPHA_EPSILON)
601
604
{
602
- const float TdotV2 = currInteraction.TdotV * currInteraction.TdotV ;
603
- const float BdotV2 = currInteraction.BdotV * currInteraction.BdotV ;
604
- const float NdotV2 = currInteraction.isotropic.NdotV_squared;
605
+ const float TdotV2 = currInteraction.TdotV2 ;
606
+ const float BdotV2 = currInteraction.BdotV2 ;
607
+ const float NdotV2 = currInteraction.inner. isotropic.NdotV_squared;
605
608
const float NdotL2 = s.NdotL2;
606
609
607
- const float TdotH2 = microfacet.TdotH * microfacet.TdotH ;
608
- const float BdotH2 = microfacet.BdotH * microfacet.BdotH ;
609
- const float NdotH2 = microfacet.isotropic.NdotH2;
610
+ const float TdotH2 = microfacet.TdotH2 ;
611
+ const float BdotH2 = microfacet.BdotH2 ;
612
+ const float NdotH2 = microfacet.inner. isotropic.NdotH2;
610
613
611
614
float G1_over_2NdotV = 0.0 ;
612
615
float G2_over_G1 = 0.0 ;
@@ -665,7 +668,7 @@ void instr_eval_and_pdf_execute(in instr_t instr, in MC_precomputed_t precomp, i
665
668
pdf = irr_glsl_smith_VNDF_pdf_wo_clamps(ndf_val, G1_over_2NdotV);
666
669
float remainder_scalar_part = G2_over_G1;
667
670
668
- const float VdotH = is_bsdf ? microfacet.isotropic.VdotH : max (microfacet.isotropic.VdotH, 0.0 );
671
+ const float VdotH = is_bsdf ? microfacet.inner. isotropic.VdotH : max (microfacet.inner .isotropic.VdotH, 0.0 );
669
672
vec3 fr;
670
673
#ifdef OP_CONDUCTOR
671
674
if (op == OP_CONDUCTOR)
@@ -679,8 +682,8 @@ void instr_eval_and_pdf_execute(in instr_t instr, in MC_precomputed_t precomp, i
679
682
#ifndef NO_BSDF
680
683
if (is_bsdf)
681
684
{
682
- float LdotH = microfacet.isotropic.LdotH;
683
- float VdotHLdotH = microfacet.isotropic.VdotH * LdotH;
685
+ float LdotH = microfacet.inner. isotropic.LdotH;
686
+ float VdotHLdotH = microfacet.inner. isotropic.VdotH * LdotH;
684
687
LdotH = abs (LdotH);
685
688
#ifdef NDF_GGX
686
689
if (ndf == NDF_GGX)
@@ -734,7 +737,7 @@ void instr_eval_and_pdf_execute(in instr_t instr, in MC_precomputed_t precomp, i
734
737
writeReg(REG_DST(regs), result);
735
738
}
736
739
737
- eval_and_pdf_t irr_bsdf_eval_and_pdf(in MC_precomputed_t precomp, in instr_stream_t stream, in uint generator_offset, inout irr_glsl_LightSample s, inout irr_glsl_AnisotropicMicrofacetCache microfacet)
740
+ eval_and_pdf_t irr_bsdf_eval_and_pdf(in MC_precomputed_t precomp, in instr_stream_t stream, in uint generator_offset, inout irr_glsl_LightSample s, inout MC_microfacet_t microfacet)
738
741
{
739
742
setCurrInteraction(precomp);
740
743
for (uint i = 0u; i < stream.count; ++ i)
@@ -775,7 +778,7 @@ eval_and_pdf_t irr_bsdf_eval_and_pdf(in MC_precomputed_t precomp, in instr_strea
775
778
return eval_and_pdf;
776
779
}
777
780
778
- irr_glsl_LightSample irr_bsdf_cos_generate(in MC_precomputed_t precomp, in instr_stream_t stream, in vec3 rand, out vec3 out_remainder, out float out_pdf, out irr_glsl_AnisotropicMicrofacetCache out_microfacet, out uint out_gen_rnpOffset)
781
+ irr_glsl_LightSample irr_bsdf_cos_generate(in MC_precomputed_t precomp, in instr_stream_t stream, in vec3 rand, out vec3 out_remainder, out float out_pdf, out MC_microfacet_t out_microfacet, out uint out_gen_rnpOffset)
779
782
{
780
783
uint ix = 0u;
781
784
instr_t instr = irr_glsl_MC_fetchInstr(stream.offset);
@@ -803,7 +806,7 @@ irr_glsl_LightSample irr_bsdf_cos_generate(in MC_precomputed_t precomp, in instr
803
806
#endif
804
807
{
805
808
vec3 eta = bsdf_data_decodeIoR(bsdf_data, OP_COATING)[0 ];
806
- w_ = irr_glsl_fresnel_dielectric_frontface_only(eta, max (currInteraction.isotropic.NdotV, 0.0 ));
809
+ w_ = irr_glsl_fresnel_dielectric_frontface_only(eta, max (currInteraction.inner. isotropic.NdotV, 0.0 ));
807
810
}
808
811
809
812
float w = colorToScalar(w_);
@@ -854,22 +857,22 @@ irr_glsl_LightSample irr_bsdf_cos_generate(in MC_precomputed_t precomp, in instr
854
857
const bool is_bsdf = ! op_isBRDF(op) && ! is_coat;
855
858
const vec3 albedo = params_getReflectance(params);
856
859
857
- const float NdotV = irr_glsl_conditionalAbsOrMax(is_bsdf, currInteraction.isotropic.NdotV, 0.0 );
860
+ const float NdotV = irr_glsl_conditionalAbsOrMax(is_bsdf, currInteraction.inner. isotropic.NdotV, 0.0 );
858
861
const bool positiveNdotV = (NdotV > FLT_MIN);
859
862
860
863
float localPdf = positiveNdotV ? 1.0 : 0.0 ;
861
864
vec3 rem = positiveNdotV ? vec3 (1.0 ) : vec3 (0.0 );
862
865
uint ndf = instr_getNDF(instr);
863
866
irr_glsl_LightSample s;
864
867
865
- const vec3 localV = irr_glsl_getTangentSpaceV(currInteraction);
866
- const mat3 tangentFrame = irr_glsl_getTangentFrame(currInteraction);
868
+ const vec3 localV = irr_glsl_getTangentSpaceV(currInteraction.inner );
869
+ const mat3 tangentFrame = irr_glsl_getTangentFrame(currInteraction.inner );
867
870
868
871
869
872
#ifdef OP_DELTATRANS
870
873
if (op == OP_DELTATRANS)
871
874
{
872
- s = irr_glsl_createLightSample(- precomp.V, - 1.0 , currInteraction.T, currInteraction.B, currInteraction.isotropic.N);
875
+ s = irr_glsl_createLightSample(- precomp.V, - 1.0 , currInteraction.inner. T, currInteraction.inner. B, currInteraction.inner .isotropic.N);
873
876
// not computing microfacet cache since it's always transmission and it will be recomputed anyway
874
877
rem = vec3 (1.0 );
875
878
localPdf = irr_glsl_FLT_INF;
@@ -881,10 +884,11 @@ irr_glsl_LightSample irr_bsdf_cos_generate(in MC_precomputed_t precomp, in instr
881
884
const vec3 luminosityContributionHint = CIE_XYZ_Luma_Y_coeffs;
882
885
vec3 remMetadata;
883
886
s = irr_glsl_thin_smooth_dielectric_cos_generate_wo_clamps(
884
- currInteraction.isotropic.V.dir, currInteraction.T, currInteraction.B, currInteraction.isotropic.N,
885
- currInteraction.isotropic.NdotV, NdotV, u, ior2[0 ], luminosityContributionHint, remMetadata
887
+ currInteraction.inner. isotropic.V.dir, currInteraction.inner. T, currInteraction.inner. B, currInteraction.inner .isotropic.N,
888
+ currInteraction.inner. isotropic.NdotV, NdotV, u, ior2[0 ], luminosityContributionHint, remMetadata
886
889
);
887
- out_microfacet = irr_glsl_calcAnisotropicMicrofacetCache(currInteraction, s);
890
+ out_microfacet.inner = irr_glsl_calcAnisotropicMicrofacetCache(currInteraction.inner, s);
891
+ finalizeMicrofacet(out_microfacet);
888
892
rem = irr_glsl_thin_smooth_dielectric_cos_remainder_and_pdf_wo_clamps(localPdf, remMetadata);
889
893
} else
890
894
#endif
@@ -903,20 +907,21 @@ irr_glsl_LightSample irr_bsdf_cos_generate(in MC_precomputed_t precomp, in instr
903
907
}
904
908
#endif
905
909
s = irr_glsl_createLightSampleTangentSpace(localV, localL, tangentFrame);
906
- out_microfacet = irr_glsl_calcAnisotropicMicrofacetCache(currInteraction, s);
910
+ out_microfacet.inner = irr_glsl_calcAnisotropicMicrofacetCache(currInteraction.inner, s);
911
+ finalizeMicrofacet(out_microfacet);
907
912
908
- rem *= albedo* irr_glsl_oren_nayar_cos_remainder_and_pdf(localPdf, s, currInteraction.isotropic, ax2);
913
+ rem *= albedo* irr_glsl_oren_nayar_cos_remainder_and_pdf(localPdf, s, currInteraction.inner. isotropic, ax2);
909
914
localPdf *= is_bsdf ? 0.5 : 1.0 ;
910
915
} else
911
916
#endif
912
917
#if defined(OP_CONDUCTOR) || defined(OP_DIELECTRIC)
913
918
if (op_hasSpecular(op))
914
919
{
915
- const float TdotV2 = currInteraction.TdotV * currInteraction.TdotV;
916
- const float BdotV2 = currInteraction.BdotV * currInteraction.BdotV;
917
- const float NdotV2 = currInteraction.isotropic.NdotV_squared;
920
+ const float TdotV2 = currInteraction.inner. TdotV * currInteraction.inner .TdotV;
921
+ const float BdotV2 = currInteraction.inner. BdotV * currInteraction.inner .BdotV;
922
+ const float NdotV2 = currInteraction.inner. isotropic.NdotV_squared;
918
923
919
- const vec3 upperHemisphereLocalV = currInteraction.isotropic.NdotV < 0.0 ? - localV : localV;
924
+ const vec3 upperHemisphereLocalV = currInteraction.inner. isotropic.NdotV < 0.0 ? - localV : localV;
920
925
921
926
float G2_over_G1 = 0.0 ;
922
927
float G1_over_2NdotV = 0.0 ;
@@ -973,12 +978,13 @@ irr_glsl_LightSample irr_bsdf_cos_generate(in MC_precomputed_t precomp, in instr
973
978
float eta = colorToScalar(ior[0 ]);
974
979
float rcpEta = 1.0 / eta;
975
980
976
- out_microfacet = irr_glsl_calcAnisotropicMicrofacetCache(refraction, localV, localH, localL, rcpEta, rcpEta* rcpEta);
981
+ out_microfacet.inner = irr_glsl_calcAnisotropicMicrofacetCache(refraction, localV, localH, localL, rcpEta, rcpEta* rcpEta);
977
982
s = irr_glsl_createLightSampleTangentSpace(localV, localL, tangentFrame);
978
983
979
- const float TdotH2 = out_microfacet.TdotH * out_microfacet.TdotH;
980
- const float BdotH2 = out_microfacet.BdotH * out_microfacet.BdotH;
981
- const float NdotH2 = out_microfacet.isotropic.NdotH2;
984
+ finalizeMicrofacet(out_microfacet);
985
+ const float TdotH2 = out_microfacet.TdotH2;
986
+ const float BdotH2 = out_microfacet.BdotH2;
987
+ const float NdotH2 = out_microfacet.inner.isotropic.NdotH2;
982
988
const float NdotL = irr_glsl_conditionalAbsOrMax(is_bsdf, s.NdotL, 0.0 );
983
989
984
990
BEGIN_CASES(ndf)
@@ -1014,7 +1020,7 @@ irr_glsl_LightSample irr_bsdf_cos_generate(in MC_precomputed_t precomp, in instr
1014
1020
{}
1015
1021
END_CASES
1016
1022
1017
- const float LdotH = out_microfacet.isotropic.LdotH;
1023
+ const float LdotH = out_microfacet.inner. isotropic.LdotH;
1018
1024
const float VdotHLdotH = VdotH * LdotH;
1019
1025
// a trick, pdf was already multiplied by transmission/reflection choice probability above
1020
1026
const float reflectance = refraction ? 0.0 : 1.0 ;
@@ -1035,7 +1041,7 @@ vec3 runGenerateAndRemainderStream(in MC_precomputed_t precomp, in instr_stream_
1035
1041
{
1036
1042
vec3 generator_rem;
1037
1043
float generator_pdf;
1038
- irr_glsl_AnisotropicMicrofacetCache microfacet;
1044
+ MC_microfacet_t microfacet;
1039
1045
uint generator_rnpOffset;
1040
1046
irr_glsl_LightSample s = irr_bsdf_cos_generate(precomp, gcs, rand, generator_rem, generator_pdf, microfacet, generator_rnpOffset);
1041
1047
eval_and_pdf_t eval_pdf = irr_bsdf_eval_and_pdf(precomp, rnps, generator_rnpOffset, s, microfacet);
0 commit comments