Skip to content

Commit 22bd816

Browse files
fix bugs
1 parent ca3bd3d commit 22bd816

File tree

4 files changed

+52
-45
lines changed

4 files changed

+52
-45
lines changed

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/bsdf/specular/ggx.glsl

Lines changed: 23 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -77,29 +77,42 @@ vec3 irr_glsl_ggx_height_correlated_cos_eval(in irr_glsl_LightSample _sample, in
7777

7878

7979

80-
// 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
81-
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)
80+
// TODO: unifty the two following functions into `irr_glsl_microfacet_BSDF_cos_generate_wo_clamps(vec3 H,...)` and `irr_glsl_microfacet_BSDF_cos_generate` or at least a auto declaration macro in lieu of a template
81+
irr_glsl_LightSample irr_glsl_ggx_dielectric_cos_generate_wo_clamps(in vec3 localV, in bool backside, in vec3 upperHemisphereLocalV, in mat3 m, in vec3 u, in float _ax, in float _ay, in float rcpOrientedEta, in float orientedEta2, in float rcpOrientedEta2, out irr_glsl_AnisotropicMicrofacetCache _cache)
8282
{
83-
const vec3 H = irr_glsl_ggx_cos_generate(localV,u,_ax,_ay);
83+
// thanks to this manouvre the H will always be in the upper hemisphere (NdotH>0.0)
84+
const vec3 H = irr_glsl_ggx_cos_generate(upperHemisphereLocalV,u.xy,_ax,_ay);
85+
86+
const float VdotH = dot(localV, H);
87+
const float reflectance = irr_glsl_fresnel_dielectric_common(orientedEta2, abs(VdotH));
88+
89+
float rcpChoiceProb;
90+
bool transmitted = irr_glsl_partitionRandVariable(reflectance, u.z, rcpChoiceProb);
8491

8592
vec3 localL;
86-
_cache = irr_glsl_calcAnisotropicMicrofacetCache(localV,H,localL);
93+
_cache = irr_glsl_calcAnisotropicMicrofacetCache(transmitted,localV,H,localL,rcpOrientedEta,rcpOrientedEta2);
8794

8895
return irr_glsl_createLightSampleTangentSpace(localV,localL,m);
8996
}
9097

91-
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)
98+
irr_glsl_LightSample irr_glsl_ggx_dielectric_cos_generate(in irr_glsl_AnisotropicViewSurfaceInteraction interaction, in vec3 u, in float ax, in float ay, in float eta, out irr_glsl_AnisotropicMicrofacetCache _cache)
9299
{
93100
const vec3 localV = irr_glsl_getTangentSpaceV(interaction);
101+
102+
float orientedEta, rcpOrientedEta;
103+
const bool backside = irr_glsl_getOrientedEtas(orientedEta, rcpOrientedEta, interaction.isotropic.NdotV, eta);
104+
105+
const vec3 upperHemisphereV = backside ? (-localV):localV;
106+
94107
const mat3 m = irr_glsl_getTangentFrame(interaction);
95-
return irr_glsl_ggx_cos_generate_wo_clamps(localV,m,u,_ax,_ay,_cache);
108+
return irr_glsl_ggx_dielectric_cos_generate_wo_clamps(localV,backside,upperHemisphereV,m, u,ax,ay, rcpOrientedEta,orientedEta*orientedEta,rcpOrientedEta*rcpOrientedEta,_cache);
96109
}
97110

98-
99-
111+
#if 0
112+
// TODO
100113
float irr_glsl_ggx_pdf_wo_clamps(in float ndf, in float devsh_v, in float maxNdotV)
101114
{
102-
return irr_glsl_smith_VNDF_pdf_wo_clamps(ndf,irr_glsl_GGXSmith_G1_wo_numerator(maxNdotV,devsh_v));
115+
return irr_glsl_smith_VNDF_pdf_wo_clamps(ndf,irr_glsl_GGXSmith_G1_wo_numerator(maxNdotV,devsh_v),);
103116
}
104117
float irr_glsl_ggx_pdf_wo_clamps(in float NdotH2, in float maxNdotV, in float NdotV2, in float a2)
105118
{
@@ -187,5 +200,6 @@ vec3 irr_glsl_ggx_aniso_cos_remainder_and_pdf(out float pdf, in irr_glsl_LightSa
187200
return vec3(0.0);
188201
}
189202
}
203+
#endif
190204

191205
#endif

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

Lines changed: 16 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,6 @@ float irr_glsl_smith_G1(in float lambda)
99
}
1010

1111

12-
float irr_glsl_smith_VNDF_pdf_wo_clamps(in float ndf, in float G1_over_2NdotV)
13-
{
14-
return ndf*0.5*G1_over_2NdotV;
15-
}
1612

1713
float irr_glsl_smith_VNDF_pdf_wo_clamps(in float ndf, in float lambda_V, in float maxNdotV, out float onePlusLambda_V)
1814
{
@@ -21,24 +17,30 @@ float irr_glsl_smith_VNDF_pdf_wo_clamps(in float ndf, in float lambda_V, in floa
2117
return irr_glsl_microfacet_to_light_measure_transform(ndf/onePlusLambda_V,maxNdotV);
2218
}
2319

20+
float irr_glsl_smith_VNDF_pdf_wo_clamps(in float ndf, in float lambda_V, in float absNdotV, in bool transmitted, in float VdotH, in float LdotH, in float VdotHLdotH, in float orientedEta, in float reflectance, out float onePlusLambda_V)
21+
{
22+
onePlusLambda_V = 1.0+lambda_V;
23+
24+
return irr_glsl_microfacet_to_light_measure_transform((transmitted ? (1.0-reflectance):reflectance)*ndf/onePlusLambda_V,absNdotV,transmitted,VdotH,LdotH,VdotHLdotH,orientedEta);
25+
}
26+
27+
28+
float irr_glsl_smith_VNDF_pdf_wo_clamps(in float ndf, in float G1_over_2NdotV)
29+
{
30+
return ndf*0.5*G1_over_2NdotV;
31+
}
2432

2533
float irr_glsl_smith_VNDF_pdf_wo_clamps(in float ndf, in float G1_over_2NdotV, in float absNdotV, in bool transmitted, in float VdotH, in float LdotH, in float VdotHLdotH, in float orientedEta, in float reflectance)
2634
{
27-
const float FNG = (transmitted ? (1.0-reflectance):reflectance)*ndf*G1_over_2NdotV;
35+
float FNG = (transmitted ? (1.0-reflectance):reflectance)*ndf*G1_over_2NdotV;
36+
float factor = 0.5;
2837
if (transmitted)
2938
{
3039
const float VdotH_etaLdotH = (VdotH+orientedEta*LdotH);
3140
// VdotHLdotH is negative under transmission, so this factor is negative
32-
FNG *= -absNdotV*VdotHLdotH/(VdotH_etaLdotH*VdotH_etaLdotH);
41+
factor *= -2.0*VdotHLdotH/(VdotH_etaLdotH*VdotH_etaLdotH);
3342
}
34-
return FNG*(transmitted ? 2.0:0.5);
35-
}
36-
37-
float irr_glsl_smith_VNDF_pdf_wo_clamps(in float ndf, in float lambda_V, in float absNdotV, in bool transmitted, in float VdotH, in float LdotH, in float VdotHLdotH, in float orientedEta, in float reflectance, out float onePlusLambda_V)
38-
{
39-
onePlusLambda_V = 1.0+lambda_V;
40-
41-
return irr_glsl_microfacet_to_light_measure_transform((transmitted ? (1.0-reflectance):reflectance)*ndf/onePlusLambda_V,absNdotV,transmitted,VdotH,LdotH,VdotHLdotH,orientedEta);
43+
return FNG*factor;
4244
}
4345

4446
#endif

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ float irr_glsl_ggx_microfacet_to_light_measure_transform(in float NDFcos_already
3030
}
3131
return NDFcos_already_in_reflective_dL_measure*factor;
3232
}
33-
float irr_glsl_microfacet_to_light_measure_transform(in float ndf, in float maxNdotL)
33+
float irr_glsl_ggx_microfacet_to_light_measure_transform(in float NDFcos_already_in_reflective_dL_measure, in float maxNdotL)
3434
{
3535
return NDFcos_already_in_reflective_dL_measure*maxNdotL;
3636
}

0 commit comments

Comments
 (0)