2
2
#define _IRR_BSDF_DIELECTRIC_INCLUDED_
3
3
4
4
#include < irr/ builtin/ glsl/ math/ functions.glsl>
5
+ #include < irr/ builtin/ glsl/ bxdf/ common.glsl>
5
6
#include < irr/ builtin/ glsl/ bxdf/ common_samples.glsl>
6
7
#include < irr/ builtin/ glsl/ bxdf/ fresnel.glsl>
7
8
8
9
// usually `luminosityContributionHint` would be the Rec.709 luma coefficients (the Y row of the RGB to CIE XYZ matrix)
9
10
// its basically a set of weights that determine
10
11
// assert(1.0==luminosityContributionHint.r+luminosityContributionHint.g+luminosityContributionHint.b);
11
12
// `remainderMetadata` is a variable in which the generator function returns byproducts of sample generation that would otherwise have to be redundantly calculated in `remainder_and_pdf`
12
- irr_glsl_LightSample irr_glsl_thin_smooth_dielectric_cos_generate_wo_clamps(in vec3 V, in vec3 N, in float NdotV, in float absNdotV, vec3 u, in vec3 eta2, in vec3 luminosityContributionHint, out vec3 remainderMetadata)
13
+ irr_glsl_LightSample irr_glsl_thin_smooth_dielectric_cos_generate_wo_clamps(in vec3 V, in vec3 T, in vec3 B, in vec3 N, in float NdotV, in float absNdotV, vec3 u, in vec3 eta2, in vec3 luminosityContributionHint, out vec3 remainderMetadata)
13
14
{
14
15
// we will only ever intersect from the outside
15
16
const vec3 reflectance = irr_glsl_thindielectric_infinite_scatter(irr_glsl_fresnel_dielectric_common(eta2,absNdotV));
@@ -20,34 +21,22 @@ irr_glsl_LightSample irr_glsl_thin_smooth_dielectric_cos_generate_wo_clamps(in v
20
21
float rcpChoiceProb;
21
22
const bool transmitted = irr_glsl_partitionRandVariable(reflectionProb, u.z, rcpChoiceProb);
22
23
remainderMetadata = (transmitted ? (vec3 (1.0 )- reflectance): reflectance)* rcpChoiceProb;
23
-
24
- irr_glsl_BxDFSample smpl;
25
- smpl.L = (transmitted ? vec3 (0.0 ): N* 2.0 * NdotV)- V;
26
- /* Undefined
27
- s.TdotL = L.x;
28
- s.BdotL = L.y;
29
- s.NdotL = L.z;
30
- s.TdotH = H.x;
31
- s.BdotH = H.y;
32
- s.NdotH = H.z;
33
- s.VdotH = VdotH;
34
- s.LdotH = LdotH;*/
35
- return smpl;
24
+
25
+ const vec3 L = (transmitted ? vec3 (0.0 ): N* 2.0 * NdotV)- V;
26
+ return irr_glsl_createLightSample(L,dot (V,L),T,B,N);
36
27
}
37
28
38
29
39
30
40
- irr_glsl_LightSample irr_glsl_thin_smooth_dielectric_cos_generate_wo_clamps(in vec3 V, in vec3 N, in float NdotV, in float absNdotV, vec3 u, in vec3 eta2, in vec3 luminosityContributionHint)
31
+ irr_glsl_LightSample irr_glsl_thin_smooth_dielectric_cos_generate_wo_clamps(in vec3 V, in vec3 T, in vec3 B, in vec3 N, in float NdotV, in float absNdotV, vec3 u, in vec3 eta2, in vec3 luminosityContributionHint)
41
32
{
42
33
vec3 dummy;
43
- irr_glsl_BxDFSample smpl = irr_glsl_thin_smooth_dielectric_cos_generate_wo_clamps(V,N,NdotV,absNdotV,u,eta2,luminosityContributionHint,dummy);
44
- smpl.NdotL = dot (N,smpl.L);
45
- return smpl;
34
+ return irr_glsl_thin_smooth_dielectric_cos_generate_wo_clamps(V,T,B,N,NdotV,absNdotV,u,eta2,luminosityContributionHint,dummy);
46
35
}
47
36
48
37
irr_glsl_LightSample irr_glsl_thin_smooth_dielectric_cos_generate(in irr_glsl_AnisotropicViewSurfaceInteraction interaction, vec3 u, in vec3 eta2, in vec3 luminosityContributionHint)
49
38
{
50
- return irr_glsl_thin_smooth_dielectric_cos_generate_wo_clamps(interaction.isotropic.V.dir,interaction.isotropic.N,interaction.isotropic.NdotV,abs (interaction.isotropic.NdotV),u,eta2,luminosityContributionHint);
39
+ return irr_glsl_thin_smooth_dielectric_cos_generate_wo_clamps(interaction.isotropic.V.dir,interaction.T,interaction.B,interaction. isotropic.N,interaction.isotropic.NdotV,abs (interaction.isotropic.NdotV),u,eta2,luminosityContributionHint);
51
40
}
52
41
53
42
@@ -69,7 +58,7 @@ vec3 irr_glsl_thin_smooth_dielectric_cos_remainder_and_pdf_wo_clamps(out float p
69
58
return irr_glsl_thin_smooth_dielectric_cos_remainder_and_pdf_wo_clamps(pdf, sampleValue / sampleProb);
70
59
}
71
60
72
- vec3 irr_glsl_thin_smooth_dielectric_cos_remainder_and_pdf(out float pdf, in irr_glsl_BxDFSample _sample, in irr_glsl_IsotropicViewSurfaceInteraction interaction, in vec3 eta2, in vec3 luminosityContributionHint)
61
+ vec3 irr_glsl_thin_smooth_dielectric_cos_remainder_and_pdf(out float pdf, in irr_glsl_LightSample _sample, in irr_glsl_IsotropicViewSurfaceInteraction interaction, in vec3 eta2, in vec3 luminosityContributionHint)
73
62
{
74
63
const bool transmitted = irr_glsl_isTransmissionPath(interaction.NdotV,_sample.NdotL);
75
64
return irr_glsl_thin_smooth_dielectric_cos_remainder_and_pdf_wo_clamps(pdf,transmitted,abs (interaction.NdotV),eta2,luminosityContributionHint);
@@ -78,45 +67,34 @@ vec3 irr_glsl_thin_smooth_dielectric_cos_remainder_and_pdf(out float pdf, in irr
78
67
79
68
80
69
81
- irr_glsl_LightSample irr_glsl_smooth_dielectric_cos_generate_wo_clamps(in vec3 V, in vec3 N, in bool backside, in float NdotV, in float absNdotV, in float NdotV2, vec3 u, in float rcpOrientedEta, in float orientedEta2, in float rcpOrientedEta2, out bool transmitted)
70
+ irr_glsl_LightSample irr_glsl_smooth_dielectric_cos_generate_wo_clamps(in vec3 V, in vec3 T, in vec3 B, in vec3 N, in bool backside, in float NdotV, in float absNdotV, in float NdotV2, vec3 u, in float rcpOrientedEta, in float orientedEta2, in float rcpOrientedEta2, out bool transmitted)
82
71
{
83
72
const float reflectance = irr_glsl_fresnel_dielectric_common(orientedEta2,absNdotV);
84
73
85
74
float rcpChoiceProb;
86
75
transmitted = irr_glsl_partitionRandVariable(reflectance, u.z, rcpChoiceProb);
87
76
88
- irr_glsl_BxDFSample smpl;
89
- smpl.L = irr_glsl_reflect_refract(transmitted, V, N, backside, NdotV, NdotV2, rcpOrientedEta, rcpOrientedEta2);
90
- /* Undefined
91
- s.TdotL = L.x;
92
- s.BdotL = L.y;
93
- s.NdotL = L.z;
94
- s.TdotH = H.x;
95
- s.BdotH = H.y;
96
- s.NdotH = H.z;
97
- s.VdotH = VdotH;*/
98
- return smpl;
77
+ const vec3 L = irr_glsl_reflect_refract(transmitted, V, N, backside, NdotV, NdotV2, rcpOrientedEta, rcpOrientedEta2);
78
+ return irr_glsl_createLightSample(L,dot (V,L),T,B,N);
99
79
}
100
80
101
- irr_glsl_BxDFSample irr_glsl_smooth_dielectric_cos_generate(in irr_glsl_AnisotropicViewSurfaceInteraction interaction, vec3 u, in float eta)
81
+ irr_glsl_LightSample irr_glsl_smooth_dielectric_cos_generate(in irr_glsl_AnisotropicViewSurfaceInteraction interaction, vec3 u, in float eta)
102
82
{
103
- float rcpOrientedEta, orientedEta2, rcpOrientedEta2 ;
104
- const bool backside = irr_glsl_getOrientedEtas(rcpOrientedEta, orientedEta2, rcpOrientedEta2 , interaction.isotropic.NdotV, eta);
83
+ float orientedEta, rcpOrientedEta ;
84
+ const bool backside = irr_glsl_getOrientedEtas(orientedEta, rcpOrientedEta , interaction.isotropic.NdotV, eta);
105
85
106
86
bool dummy;
107
- irr_glsl_BxDFSample smpl = irr_glsl_smooth_dielectric_cos_generate_wo_clamps(
87
+ return irr_glsl_smooth_dielectric_cos_generate_wo_clamps(
108
88
interaction.isotropic.V.dir,
109
- interaction.isotropic.N,
89
+ interaction.T,interaction.B,interaction. isotropic.N,
110
90
backside,
111
91
interaction.isotropic.NdotV,
112
92
abs (interaction.isotropic.NdotV),
113
93
interaction.isotropic.NdotV* interaction.isotropic.NdotV,
114
94
u,
115
- rcpOrientedEta, orientedEta2, rcpOrientedEta2 ,
95
+ rcpOrientedEta, orientedEta * orientedEta, rcpOrientedEta * rcpOrientedEta ,
116
96
dummy
117
97
);
118
- smpl.NdotL = dot (interaction.isotropic.N,smpl.L);
119
- return smpl;
120
98
}
121
99
122
100
@@ -126,46 +104,14 @@ float irr_glsl_smooth_dielectric_cos_remainder_and_pdf(out float pdf, in bool tr
126
104
return transmitted ? rcpOrientedEta2: 1.0 ;
127
105
}
128
106
129
- float irr_glsl_smooth_dielectric_cos_remainder_and_pdf(out float pdf, in irr_glsl_BxDFSample _sample, in irr_glsl_IsotropicViewSurfaceInteraction interaction, in float eta)
107
+ float irr_glsl_smooth_dielectric_cos_remainder_and_pdf(out float pdf, in irr_glsl_LightSample _sample, in irr_glsl_IsotropicViewSurfaceInteraction interaction, in float eta)
130
108
{
131
109
const bool transmitted = irr_glsl_isTransmissionPath(interaction.NdotV,_sample.NdotL);
132
- float dummy0,dummy1,rcpOrientedEta2;
133
- irr_glsl_getOrientedEtas(dummy0,dummy1,rcpOrientedEta2,interaction.NdotV,eta);
134
- return irr_glsl_smooth_dielectric_cos_remainder_and_pdf(pdf,transmitted,rcpOrientedEta2);
135
- }
136
-
137
-
138
-
139
- #if 0 // TODO: Pseudo-spectral rendering.
140
- // this is probably wrong so not touching it
141
- vec3 wavelen;
142
- irr_glsl_BSDFSample irr_glsl_smooth_dielectric_cos_generate(in irr_glsl_AnisotropicViewSurfaceInteraction interaction, vec3 u, in vec3 eta, )
143
- {
144
- float NdotV = interaction.isotropic.NdotV;
145
- vec3 Fr = irr_glsl_fresnel_dielectric(eta, NdotV);
146
- float reflectionProb = dot (vec3 (1.0 / 3.0 ),Fr);// dot(Fr, luminosityContributionHint);
147
-
148
- const bool refracted = irr_glsl_partitionRandVariable(reflectionProb, u.z, throuhgput);
149
-
150
- float _eta = u.z < 0.5 ? mix (eta.r, eta.g, u.z * 2.0 ) : mix (eta.g, eta.b, u.z * 2.0 - 1.0 );
151
- wavelen = u.z< 0.5 ? mix (vec3 (4.0 ,0.0 ,0.0 ),vec3 (0.0 ,2.0 ,0.0 ),u.z* 2.0 ): mix (vec3 (0.0 ,2.0 ,0.0 ),vec3 (0.0 ,0.0 ,4.0 ),u.z* 2.0 - 1.0 );
152
-
153
- irr_glsl_BSDFSample smpl;
154
- smpl.L = irr_glsl_reflect_refract(refracted, interaction.isotropic.V.dir, interaction.isotropic.N, NdotV, NdotV* NdotV, _eta);
155
- return smpl;
156
- }
110
+
111
+ float dummy, rcpOrientedEta;
112
+ const bool backside = irr_glsl_getOrientedEtas(dummy, rcpOrientedEta, interaction.NdotV, eta);
157
113
158
- vec3 irr_glsl_smooth_dielectric_cos_remainder_and_pdf(out float pdf, in irr_glsl_BSDFSample _sample, in irr_glsl_IsotropicViewSurfaceInteraction interaction, in vec3 eta)
159
- {
160
- pdf = 1.0 / 0.0 ; // should be reciprocal probability of the fresnel choice divided by 0.0, but still an INF.
161
- vec3 retval = vec3 (1.0 );
162
- return wavelen;
114
+ return irr_glsl_smooth_dielectric_cos_remainder_and_pdf(pdf,transmitted,rcpOrientedEta);
163
115
}
164
- vec3 irr_glsl_smooth_dielectric_cos_remainder_and_pdf(out float pdf, in irr_glsl_BSDFSample _sample, in irr_glsl_IsotropicViewSurfaceInteraction interaction, in vec3 eta, in float throughput)
165
- {
166
- return irr_glsl_smooth_dielectric_cos_remainder_and_pdf(pdf,_sample,interaction,eta);
167
- }
168
- #endif
169
-
170
116
171
117
#endif
0 commit comments