Skip to content

Commit 55471ca

Browse files
committed
removed duplicate fresnel code, added creation params for iridescent
1 parent 5782a49 commit 55471ca

File tree

1 file changed

+48
-49
lines changed

1 file changed

+48
-49
lines changed

include/nbl/builtin/hlsl/bxdf/fresnel.hlsl

Lines changed: 48 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -397,20 +397,14 @@ struct Conductor
397397
return retval;
398398
}
399399

400-
// TODO: will probably merge with __call at some point
401-
static void __polarized(const T orientedEta, const T orientedEtak, const T cosTheta, NBL_REF_ARG(T) Rp, NBL_REF_ARG(T) Rs)
400+
static void __polarized(const T orientedEta, const T etaLen2, const T clampedCosTheta, NBL_REF_ARG(T) Rp, NBL_REF_ARG(T) Rs)
402401
{
403-
T cosTheta_2 = cosTheta * cosTheta;
404-
// T sinTheta2 = hlsl::promote<T>(1.0) - cosTheta_2;
402+
const T cosTheta_2 = clampedCosTheta * clampedCosTheta;
405403
const T eta = orientedEta;
406-
const T eta2 = eta*eta;
407-
const T etak = orientedEtak;
408-
const T etak2 = etak*etak;
409404

410-
const T etaLen2 = eta2 + etak2;
411405
assert(hlsl::all(etaLen2 > hlsl::promote<T>(hlsl::exp2<scalar_type>(-numeric_limits<scalar_type>::digits))));
412406
T t1 = etaLen2 * cosTheta_2;
413-
const T etaCosTwice = eta * cosTheta * scalar_type(2.0);
407+
const T etaCosTwice = eta * clampedCosTheta * hlsl::promote<T>(2.0);
414408

415409
const T rs_common = etaLen2 + cosTheta_2;
416410
Rs = (rs_common - etaCosTwice) / (rs_common + etaCosTwice);
@@ -420,17 +414,8 @@ struct Conductor
420414

421415
T operator()(const scalar_type clampedCosTheta)
422416
{
423-
const scalar_type cosTheta_2 = clampedCosTheta * clampedCosTheta;
424-
//const float sinTheta2 = 1.0 - cosTheta_2;
425-
426-
assert(hlsl::all(etaLen2 > hlsl::promote<T>(hlsl::exp2<scalar_type>(-numeric_limits<scalar_type>::digits))));
427-
const T etaCosTwice = eta * clampedCosTheta * hlsl::promote<T>(2.0);
428-
429-
const T rs_common = etaLen2 + hlsl::promote<T>(cosTheta_2);
430-
const T rs2 = (rs_common - etaCosTwice) / (rs_common + etaCosTwice);
431-
432-
const T rp_common = etaLen2 * cosTheta_2 + hlsl::promote<T>(1.0);
433-
const T rp2 = (rp_common - etaCosTwice) / (rp_common + etaCosTwice);
417+
T rs2, rp2;
418+
__polarized(eta, etaLen2, hlsl::promote<T>(clampedCosTheta), rp2, rs2);
434419

435420
return (rs2 + rp2) * hlsl::promote<T>(0.5);
436421
}
@@ -463,15 +448,13 @@ struct Dielectric
463448
return retval;
464449
}
465450

466-
// TODO: will probably merge with __call at some point
467-
static void __polarized(const T orientedEta, const T cosTheta, NBL_REF_ARG(T) Rp, NBL_REF_ARG(T) Rs)
451+
static void __polarized(const T orientedEta2, const T cosTheta, NBL_REF_ARG(T) Rp, NBL_REF_ARG(T) Rs)
468452
{
469-
T sinTheta2 = hlsl::promote<T>(1.0) - cosTheta * cosTheta;
470-
const T eta = orientedEta;
471-
const T eta2 = eta * eta;
453+
const T sinTheta2 = hlsl::promote<T>(1.0) - cosTheta * cosTheta;
472454

473-
T t0 = hlsl::sqrt(hlsl::max(eta2 - sinTheta2, hlsl::promote<T>(0.0)));
474-
T t2 = eta2 * cosTheta;
455+
// the max() clamping can handle TIR when orientedEta2<1.0
456+
T t0 = hlsl::sqrt(hlsl::max(orientedEta2 - sinTheta2, hlsl::promote<T>(0.0)));
457+
T t2 = orientedEta2 * cosTheta;
475458

476459
T rp = (t0 - t2) / (t0 + t2);
477460
Rp = rp * rp;
@@ -481,16 +464,10 @@ struct Dielectric
481464

482465
static T __call(NBL_CONST_REF_ARG(T) orientedEta2, const scalar_type clampedCosTheta)
483466
{
484-
const scalar_type sinTheta2 = scalar_type(1.0) - clampedCosTheta * clampedCosTheta;
485-
486-
// the max() clamping can handle TIR when orientedEta2<1.0
487-
const T t0 = hlsl::sqrt<T>(hlsl::max<T>(orientedEta2 - sinTheta2, hlsl::promote<T>(0.0)));
488-
const T rs = (hlsl::promote<T>(clampedCosTheta) - t0) / (hlsl::promote<T>(clampedCosTheta) + t0);
489-
490-
const T t2 = orientedEta2 * clampedCosTheta;
491-
const T rp = (t0 - t2) / (t0 + t2);
467+
T rs2, rp2;
468+
__polarized(orientedEta2, hlsl::promote<T>(clampedCosTheta), rp2, rs2);
492469

493-
return (rs * rs + rp * rp) * scalar_type(0.5);
470+
return (rs2 + rp2) * hlsl::promote<T>(0.5);
494471
}
495472

496473
T operator()(const scalar_type clampedCosTheta)
@@ -577,9 +554,12 @@ struct iridescent_helper
577554
// Reflected part by the base
578555
// if kappa==0, base material is dielectric
579556
NBL_IF_CONSTEXPR(SupportsTransmission)
580-
Dielectric<vector_type>::__polarized(eta23, cosTheta_2, R23p, R23s);
557+
Dielectric<vector_type>::__polarized(eta23 * eta23, cosTheta_2, R23p, R23s);
581558
else
582-
Conductor<vector_type>::__polarized(eta23, etak23, cosTheta_2, R23p, R23s);
559+
{
560+
vector_type etaLen2 = eta23 * eta23 + etak23 * etak23;
561+
Conductor<vector_type>::__polarized(eta23, etaLen2, cosTheta_2, R23p, R23s);
562+
}
583563

584564
// Check for total internal reflection
585565
R12s = hlsl::mix(R12s, hlsl::promote<vector_type>(1.0), cosTheta2_2 <= hlsl::promote<vector_type>(0.0));
@@ -660,14 +640,24 @@ struct Iridescent<T, false NBL_PARTIAL_REQ_BOT(concepts::FloatingPointLikeVector
660640
using vector_type = T; // assert dim==3?
661641
using eta_type = vector_type;
662642

663-
static this_t create(scalar_type Dinc, vector_type ior1, vector_type ior2, vector_type ior3, vector_type iork3)
643+
struct CreationParams
644+
{
645+
scalar_type Dinc;
646+
vector_type ior1;
647+
vector_type ior2;
648+
vector_type ior3;
649+
vector_type iork3;
650+
};
651+
using creation_params_type = CreationParams;
652+
653+
static this_t create(NBL_CONST_REF_ARG(creation_params_type) params)
664654
{
665655
this_t retval;
666-
retval.helper.Dinc = Dinc;
667-
retval.helper.thinFilmIor = ior2;
668-
retval.helper.eta12 = ior2/ior1;
669-
retval.helper.eta23 = ior3/ior2;
670-
retval.helper.etak23 = iork3/ior2;
656+
retval.helper.Dinc = params.Dinc;
657+
retval.helper.thinFilmIor = params.ior2;
658+
retval.helper.eta12 = params.ior2/params.ior1;
659+
retval.helper.eta23 = params.ior3/params.ior2;
660+
retval.helper.etak23 = params.iork3/params.ior2;
671661
return retval;
672662
}
673663

@@ -696,13 +686,22 @@ struct Iridescent<T, true NBL_PARTIAL_REQ_BOT(concepts::FloatingPointLikeVectori
696686
using vector_type = T; // assert dim==3?
697687
using eta_type = vector<scalar_type, 1>;
698688

699-
static this_t create(scalar_type Dinc, vector_type ior1, vector_type ior2, vector_type ior3)
689+
struct CreationParams
690+
{
691+
scalar_type Dinc;
692+
vector_type ior1;
693+
vector_type ior2;
694+
vector_type ior3;
695+
};
696+
using creation_params_type = CreationParams;
697+
698+
static this_t create(NBL_CONST_REF_ARG(creation_params_type) params)
700699
{
701700
this_t retval;
702-
retval.helper.Dinc = Dinc;
703-
retval.helper.thinFilmIor = ior2;
704-
retval.helper.eta12 = ior2/ior1;
705-
retval.helper.eta23 = ior3/ior2;
701+
retval.helper.Dinc = params.Dinc;
702+
retval.helper.thinFilmIor = params.ior2;
703+
retval.helper.eta12 = params.ior2/params.ior1;
704+
retval.helper.eta23 = params.ior3/params.ior2;
706705
retval.helper.etak23 = hlsl::promote<vector_type>(0.0);
707706
return retval;
708707
}

0 commit comments

Comments
 (0)