@@ -304,13 +304,16 @@ namespace fresnel
304304#define NBL_CONCEPT_TPLT_PRM_KINDS (typename)
305305#define NBL_CONCEPT_TPLT_PRM_NAMES (T)
306306#define NBL_CONCEPT_PARAM_0 (fresnel, T)
307- NBL_CONCEPT_BEGIN (1 )
307+ #define NBL_CONCEPT_PARAM_1 (cosTheta, typename T::scalar_type)
308+ NBL_CONCEPT_BEGIN (2 )
308309#define fresnel NBL_CONCEPT_PARAM_T NBL_CONCEPT_PARAM_0
310+ #define cosTheta NBL_CONCEPT_PARAM_T NBL_CONCEPT_PARAM_1
309311NBL_CONCEPT_END (
310312 ((NBL_CONCEPT_REQ_TYPE)(T::scalar_type))
311313 ((NBL_CONCEPT_REQ_TYPE)(T::vector_type))
312- ((NBL_CONCEPT_REQ_EXPR_RET_TYPE)((fresnel ()), ::nbl::hlsl::is_same_v, typename T::vector_type))
314+ ((NBL_CONCEPT_REQ_EXPR_RET_TYPE)((fresnel (cosTheta )), ::nbl::hlsl::is_same_v, typename T::vector_type))
313315);
316+ #undef cosTheta
314317#undef fresnel
315318#include <nbl/builtin/hlsl/concepts/__end.hlsl>
316319
@@ -320,15 +323,14 @@ struct Schlick
320323 using scalar_type = typename vector_traits<T>::scalar_type;
321324 using vector_type = T;
322325
323- static Schlick<T> create (NBL_CONST_REF_ARG (T) F0, scalar_type clampedCosTheta )
326+ static Schlick<T> create (NBL_CONST_REF_ARG (T) F0)
324327 {
325328 Schlick<T> retval;
326329 retval.F0 = F0;
327- retval.clampedCosTheta = clampedCosTheta;
328330 return retval;
329331 }
330332
331- T operator ()()
333+ T operator ()(const scalar_type clampedCosTheta )
332334 {
333335 assert (clampedCosTheta > scalar_type (0.0 ));
334336 assert (hlsl::all (hlsl::promote<T>(0.02 ) < F0 && F0 <= hlsl::promote<T>(1.0 )));
@@ -337,7 +339,6 @@ struct Schlick
337339 }
338340
339341 T F0;
340- scalar_type clampedCosTheta;
341342};
342343
343344template<typename T NBL_PRIMARY_REQUIRES (concepts::FloatingPointLikeVectorial<T>)
@@ -346,27 +347,25 @@ struct Conductor
346347 using scalar_type = typename vector_traits<T>::scalar_type;
347348 using vector_type = T;
348349
349- static Conductor<T> create (NBL_CONST_REF_ARG (T) eta, NBL_CONST_REF_ARG (T) etak, scalar_type clampedCosTheta )
350+ static Conductor<T> create (NBL_CONST_REF_ARG (T) eta, NBL_CONST_REF_ARG (T) etak)
350351 {
351352 Conductor<T> retval;
352353 retval.eta = eta;
353354 retval.etak = etak;
354355 retval.etak2 = etak*etak;
355- retval.clampedCosTheta = clampedCosTheta;
356356 return retval;
357357 }
358358
359- static Conductor<T> create (NBL_CONST_REF_ARG (complex_t<T>) eta, scalar_type clampedCosTheta )
359+ static Conductor<T> create (NBL_CONST_REF_ARG (complex_t<T>) eta)
360360 {
361361 Conductor<T> retval;
362362 retval.eta = eta.real ();
363363 retval.etak = eta.imag ();
364364 retval.etak2 = eta.imag ()*eta.imag ();
365- retval.clampedCosTheta = clampedCosTheta;
366365 return retval;
367366 }
368367
369- T operator ()()
368+ T operator ()(const scalar_type clampedCosTheta )
370369 {
371370 const scalar_type cosTheta2 = clampedCosTheta * clampedCosTheta;
372371 //const float sinTheta2 = 1.0 - cosTheta2;
@@ -387,7 +386,6 @@ struct Conductor
387386 T eta;
388387 T etak;
389388 T etak2;
390- scalar_type clampedCosTheta;
391389};
392390
393391template<typename T NBL_PRIMARY_REQUIRES (concepts::FloatingPointLikeVectorial<T>)
@@ -396,36 +394,33 @@ struct Dielectric
396394 using scalar_type = typename vector_traits<T>::scalar_type;
397395 using vector_type = T;
398396
399- static Dielectric<T> create (NBL_CONST_REF_ARG (T) eta, scalar_type cosTheta )
397+ static Dielectric<T> create (NBL_CONST_REF_ARG (T) eta)
400398 {
401399 Dielectric<T> retval;
402- scalar_type absCosTheta = hlsl::abs (cosTheta);
403- retval.orientedEta = OrientedEtas<T>::create (absCosTheta, eta);
404- retval.absCosTheta = absCosTheta;
400+ retval.orientedEta = OrientedEtas<T>::create (1.0 , eta);
405401 return retval;
406402 }
407403
408- static T __call (NBL_CONST_REF_ARG (T) orientedEta2, scalar_type absCosTheta )
404+ static T __call (NBL_CONST_REF_ARG (T) orientedEta2, const scalar_type clampedCosTheta )
409405 {
410- const scalar_type sinTheta2 = 1.0 - absCosTheta * absCosTheta ;
406+ const scalar_type sinTheta2 = 1.0 - clampedCosTheta * clampedCosTheta ;
411407
412408 // the max() clamping can handle TIR when orientedEta2<1.0
413409 const T t0 = hlsl::sqrt<T>(hlsl::max <T>(orientedEta2 - sinTheta2, hlsl::promote<T>(0.0 )));
414- const T rs = (hlsl::promote<T>(absCosTheta ) - t0) / (hlsl::promote<T>(absCosTheta ) + t0);
410+ const T rs = (hlsl::promote<T>(clampedCosTheta ) - t0) / (hlsl::promote<T>(clampedCosTheta ) + t0);
415411
416- const T t2 = orientedEta2 * absCosTheta ;
412+ const T t2 = orientedEta2 * clampedCosTheta ;
417413 const T rp = (t0 - t2) / (t0 + t2);
418414
419415 return (rs * rs + rp * rp) * 0.5f ;
420416 }
421417
422- T operator ()()
418+ T operator ()(const scalar_type clampedCosTheta )
423419 {
424- return __call (orientedEta.value * orientedEta.value, absCosTheta );
420+ return __call (orientedEta.value * orientedEta.value, clampedCosTheta );
425421 }
426422
427423 OrientedEtas<T> orientedEta;
428- scalar_type absCosTheta;
429424};
430425
431426template<typename T NBL_PRIMARY_REQUIRES (concepts::FloatingPointLikeVectorial<T>)
@@ -434,21 +429,19 @@ struct DielectricFrontFaceOnly
434429 using scalar_type = typename vector_traits<T>::scalar_type;
435430 using vector_type = T;
436431
437- static DielectricFrontFaceOnly<T> create (NBL_CONST_REF_ARG (T) eta, scalar_type absCosTheta )
432+ static DielectricFrontFaceOnly<T> create (NBL_CONST_REF_ARG (T) eta)
438433 {
439434 Dielectric<T> retval;
440- retval.orientedEta = OrientedEtas<T>::create (absCosTheta, eta);
441- retval.absCosTheta = hlsl::abs<T>(absCosTheta);
435+ retval.orientedEta = OrientedEtas<T>::create (1.0 , eta);
442436 return retval;
443437 }
444438
445- T operator ()()
439+ T operator ()(const scalar_type clampedCosTheta )
446440 {
447- return Dielectric<T>::__call (orientedEta.value * orientedEta.value, absCosTheta );
441+ return Dielectric<T>::__call (orientedEta.value * orientedEta.value, clampedCosTheta );
448442 }
449443
450444 OrientedEtas<T> orientedEta;
451- scalar_type absCosTheta;
452445};
453446
454447
0 commit comments