@@ -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