@@ -188,11 +188,13 @@ NBL_CONCEPT_END(
188188 ((NBL_CONCEPT_REQ_TYPE)(T::ray_dir_info_type))
189189 ((NBL_CONCEPT_REQ_TYPE)(T::scalar_type))
190190 ((NBL_CONCEPT_REQ_TYPE)(T::vector3_type))
191+ ((NBL_CONCEPT_REQ_TYPE)(T::spectral_type))
191192 ((NBL_CONCEPT_REQ_EXPR_RET_TYPE)((iso.getV ()), ::nbl::hlsl::is_same_v, typename T::ray_dir_info_type))
192193 ((NBL_CONCEPT_REQ_EXPR_RET_TYPE)((iso.getN ()), ::nbl::hlsl::is_same_v, typename T::vector3_type))
193194 ((NBL_CONCEPT_REQ_EXPR_RET_TYPE)((iso.getNdotV (clampMode)), ::nbl::hlsl::is_same_v, typename T::scalar_type))
194195 ((NBL_CONCEPT_REQ_EXPR_RET_TYPE)((iso.getNdotV2 ()), ::nbl::hlsl::is_same_v, typename T::scalar_type))
195196 ((NBL_CONCEPT_REQ_EXPR_RET_TYPE)((iso.getPathOrigin ()), ::nbl::hlsl::is_same_v, PathOrigin))
197+ ((NBL_CONCEPT_REQ_EXPR_RET_TYPE)((iso.getLuminosityContributionHint ()), ::nbl::hlsl::is_same_v, typename T::spectral_type))
196198 ((NBL_CONCEPT_REQ_EXPR_RET_TYPE)((T::create (normV,normN)), ::nbl::hlsl::is_same_v, T))
197199 ((NBL_CONCEPT_REQ_TYPE_ALIAS_CONCEPT)(ray_dir_info::Basic, typename T::ray_dir_info_type))
198200);
@@ -202,21 +204,24 @@ NBL_CONCEPT_END(
202204#undef iso
203205#include <nbl/builtin/hlsl/concepts/__end.hlsl>
204206
205- template<class RayDirInfo NBL_PRIMARY_REQUIRES (ray_dir_info::Basic<RayDirInfo>)
207+ template<class RayDirInfo, class Spectrum NBL_PRIMARY_REQUIRES (ray_dir_info::Basic<RayDirInfo> && concepts::FloatingPointLikeVectorial<Spectrum >)
206208struct SIsotropic
207209{
210+ using this_t = SIsotropic<RayDirInfo, Spectrum>;
208211 using ray_dir_info_type = RayDirInfo;
209212 using scalar_type = typename RayDirInfo::scalar_type;
210213 using vector3_type = typename RayDirInfo::vector3_type;
214+ using spectral_type = vector3_type;
211215
212216 // WARNING: Changed since GLSL, now arguments need to be normalized!
213- static SIsotropic<RayDirInfo> create (NBL_CONST_REF_ARG (RayDirInfo) normalizedV, const vector3_type normalizedN)
217+ static this_t create (NBL_CONST_REF_ARG (RayDirInfo) normalizedV, const vector3_type normalizedN)
214218 {
215- SIsotropic<RayDirInfo> retval;
219+ this_t retval;
216220 retval.V = normalizedV;
217221 retval.N = normalizedN;
218222 retval.NdotV = nbl::hlsl::dot<vector3_type>(retval.N, retval.V.getDirection ());
219223 retval.NdotV2 = retval.NdotV * retval.NdotV;
224+ retval.luminosityContributionHint = hlsl::promote<spectral_type>(1.0 );
220225
221226 return retval;
222227 }
@@ -230,11 +235,14 @@ struct SIsotropic
230235 scalar_type getNdotV2 () NBL_CONST_MEMBER_FUNC { return NdotV2; }
231236
232237 PathOrigin getPathOrigin () NBL_CONST_MEMBER_FUNC { return PathOrigin::PO_SENSOR; }
238+ spectral_type getLuminosityContributionHint () NBL_CONST_MEMBER_FUNC { return luminosityContributionHint; }
233239
234240 RayDirInfo V;
235241 vector3_type N;
236242 scalar_type NdotV;
237243 scalar_type NdotV2;
244+
245+ spectral_type luminosityContributionHint;
238246};
239247
240248#define NBL_CONCEPT_NAME Anisotropic
@@ -278,6 +286,7 @@ struct SAnisotropic
278286 using scalar_type = typename ray_dir_info_type::scalar_type;
279287 using vector3_type = typename ray_dir_info_type::vector3_type;
280288 using matrix3x3_type = matrix <scalar_type, 3 , 3 >;
289+ using spectral_type = typename isotropic_interaction_type::spectral_type;
281290
282291 // WARNING: Changed since GLSL, now arguments need to be normalized!
283292 static this_t create (
@@ -319,6 +328,7 @@ struct SAnisotropic
319328 scalar_type getNdotV (BxDFClampMode _clamp = BxDFClampMode::BCM_NONE) NBL_CONST_MEMBER_FUNC { return isotropic.getNdotV (_clamp); }
320329 scalar_type getNdotV2 () NBL_CONST_MEMBER_FUNC { return isotropic.getNdotV2 (); }
321330 PathOrigin getPathOrigin () NBL_CONST_MEMBER_FUNC { return isotropic.getPathOrigin (); }
331+ spectral_type getLuminosityContributionHint () NBL_CONST_MEMBER_FUNC { return isotropic.getLuminosityContributionHint (); }
322332
323333 vector3_type getT () NBL_CONST_MEMBER_FUNC { return T; }
324334 vector3_type getB () NBL_CONST_MEMBER_FUNC { return B; }
@@ -345,7 +355,7 @@ struct SAnisotropic
345355#define NBL_CONCEPT_TPLT_PRM_KINDS (typename)
346356#define NBL_CONCEPT_TPLT_PRM_NAMES (T)
347357#define NBL_CONCEPT_PARAM_0 (_sample, T)
348- #define NBL_CONCEPT_PARAM_1 (inter, surface_interactions::SIsotropic<typename T::ray_dir_info_type>)
358+ #define NBL_CONCEPT_PARAM_1 (inter, surface_interactions::SIsotropic<typename T::ray_dir_info_type, typename T::vector3_type >)
349359#define NBL_CONCEPT_PARAM_2 (rdirinfo, typename T::ray_dir_info_type)
350360#define NBL_CONCEPT_PARAM_3 (pV, typename T::vector3_type)
351361#define NBL_CONCEPT_PARAM_4 (frame, typename T::matrix3x3_type)
@@ -376,7 +386,7 @@ NBL_CONCEPT_END(
376386 ((NBL_CONCEPT_REQ_EXPR_RET_TYPE)((T::create (rdirinfo,pV)), ::nbl::hlsl::is_same_v, T))
377387 ((NBL_CONCEPT_REQ_EXPR_RET_TYPE)((T::create (rdirinfo,pV,pV,pV)), ::nbl::hlsl::is_same_v, T))
378388 ((NBL_CONCEPT_REQ_EXPR_RET_TYPE)((T::create (rdirinfo,pV,pV,pNdotL)), ::nbl::hlsl::is_same_v, T))
379- // ((NBL_CONCEPT_REQ_EXPR_RET_TYPE)((T::template create<surface_interactions::SIsotropic<typename T::ray_dir_info_type> >(pV,inter)), ::nbl::hlsl::is_same_v, T)) // NOTE: temporarily commented out due to dxc bug https://github.com/microsoft/DirectXShaderCompiler/issues/7154
389+ // ((NBL_CONCEPT_REQ_EXPR_RET_TYPE)((T::template create<surface_interactions::SIsotropic<typename T::ray_dir_info_type, typename T::vector3_type > >(pV,inter)), ::nbl::hlsl::is_same_v, T)) // NOTE: temporarily commented out due to dxc bug https://github.com/microsoft/DirectXShaderCompiler/issues/7154
380390 ((NBL_CONCEPT_REQ_EXPR_RET_TYPE)((_sample.getTangentSpaceL ()), ::nbl::hlsl::is_same_v, typename T::vector3_type))
381391 ((NBL_CONCEPT_REQ_EXPR_RET_TYPE)((T::createInvalid ()), ::nbl::hlsl::is_same_v, T))
382392 ((NBL_CONCEPT_REQ_TYPE_ALIAS_CONCEPT)(ray_dir_info::Basic, typename T::ray_dir_info_type))
@@ -525,7 +535,7 @@ NBL_CONCEPT_END(
525535#define NBL_CONCEPT_TPLT_PRM_KINDS (typename)
526536#define NBL_CONCEPT_TPLT_PRM_NAMES (T)
527537#define NBL_CONCEPT_PARAM_0 (cache, T)
528- #define NBL_CONCEPT_PARAM_1 (iso, surface_interactions::SIsotropic<ray_dir_info::SBasic<typename T::scalar_type> >)
538+ #define NBL_CONCEPT_PARAM_1 (iso, surface_interactions::SIsotropic<ray_dir_info::SBasic<typename T::scalar_type>, typename T::vector3_type >)
529539#define NBL_CONCEPT_PARAM_2 (pNdotV, typename T::scalar_type)
530540#define NBL_CONCEPT_PARAM_3 (_sample, SLightSample<ray_dir_info::SBasic<typename T::scalar_type> >)
531541#define NBL_CONCEPT_PARAM_4 (V, typename T::vector3_type)
@@ -540,9 +550,9 @@ NBL_CONCEPT_BEGIN(6)
540550NBL_CONCEPT_END (
541551 ((NBL_CONCEPT_REQ_EXPR_RET_TYPE)((T::createForReflection (pNdotV,pNdotV,pNdotV,pNdotV)), ::nbl::hlsl::is_same_v, T))
542552 ((NBL_CONCEPT_REQ_EXPR_RET_TYPE)((T::createForReflection (pNdotV,pNdotV,pNdotV)), ::nbl::hlsl::is_same_v, T))
543- ((NBL_CONCEPT_REQ_EXPR_RET_TYPE)((T::template createForReflection<surface_interactions::SIsotropic<ray_dir_info::SBasic<typename T::scalar_type> >,SLightSample<ray_dir_info::SBasic<typename T::scalar_type> > >(iso,_sample)), ::nbl::hlsl::is_same_v, T))
553+ ((NBL_CONCEPT_REQ_EXPR_RET_TYPE)((T::template createForReflection<surface_interactions::SIsotropic<ray_dir_info::SBasic<typename T::scalar_type>, typename T::vector3_type >,SLightSample<ray_dir_info::SBasic<typename T::scalar_type> > >(iso,_sample)), ::nbl::hlsl::is_same_v, T))
544554 ((NBL_CONCEPT_REQ_EXPR_RET_TYPE)((T::create (V,V,V,eta,V)), ::nbl::hlsl::is_same_v, T))
545- ((NBL_CONCEPT_REQ_EXPR_RET_TYPE)((T::template create<surface_interactions::SIsotropic<ray_dir_info::SBasic<typename T::scalar_type> >,SLightSample<ray_dir_info::SBasic<typename T::scalar_type> > >(iso,_sample,eta,V)), ::nbl::hlsl::is_same_v, T))
555+ ((NBL_CONCEPT_REQ_EXPR_RET_TYPE)((T::template create<surface_interactions::SIsotropic<ray_dir_info::SBasic<typename T::scalar_type>, typename T::vector3_type >,SLightSample<ray_dir_info::SBasic<typename T::scalar_type> > >(iso,_sample,eta,V)), ::nbl::hlsl::is_same_v, T))
546556 ((NBL_CONCEPT_REQ_TYPE_ALIAS_CONCEPT)(ReadableIsotropicMicrofacetCache, T))
547557);
548558#undef eta
@@ -698,7 +708,7 @@ struct SIsotropicMicrofacetCache
698708#define NBL_CONCEPT_TPLT_PRM_KINDS (typename)
699709#define NBL_CONCEPT_TPLT_PRM_NAMES (T)
700710#define NBL_CONCEPT_PARAM_0 (cache, T)
701- #define NBL_CONCEPT_PARAM_1 (aniso, surface_interactions::SAnisotropic<surface_interactions::SIsotropic<ray_dir_info::SBasic<typename T::scalar_type> > >)
711+ #define NBL_CONCEPT_PARAM_1 (aniso, surface_interactions::SAnisotropic<surface_interactions::SIsotropic<ray_dir_info::SBasic<typename T::scalar_type>, typename T::vector3_type > >)
702712#define NBL_CONCEPT_PARAM_2 (pNdotL, typename T::scalar_type)
703713#define NBL_CONCEPT_PARAM_3 (_sample, SLightSample<ray_dir_info::SBasic<typename T::scalar_type> >)
704714#define NBL_CONCEPT_PARAM_4 (V, typename T::vector3_type)
@@ -724,9 +734,9 @@ NBL_CONCEPT_END(
724734 ((NBL_CONCEPT_REQ_EXPR_RET_TYPE)((T::createForReflection (V,V)), ::nbl::hlsl::is_same_v, T))
725735 // ((NBL_CONCEPT_REQ_EXPR_RET_TYPE)((T::create(V,V,b0,rcp_eta)), ::nbl::hlsl::is_same_v, T)) // TODO: refuses to compile when arg4 is rcp_eta for some reason, eta is fine
726736 ((NBL_CONCEPT_REQ_EXPR_RET_TYPE)((T::createForReflection (V,V,pNdotL)), ::nbl::hlsl::is_same_v, T))
727- ((NBL_CONCEPT_REQ_EXPR_RET_TYPE)((T::template createForReflection<surface_interactions::SAnisotropic<surface_interactions::SIsotropic<ray_dir_info::SBasic<typename T::scalar_type> > >,SLightSample<ray_dir_info::SBasic<typename T::scalar_type> > >(aniso,_sample)), ::nbl::hlsl::is_same_v, T))
737+ ((NBL_CONCEPT_REQ_EXPR_RET_TYPE)((T::template createForReflection<surface_interactions::SAnisotropic<surface_interactions::SIsotropic<ray_dir_info::SBasic<typename T::scalar_type>, typename T::vector3_type > >,SLightSample<ray_dir_info::SBasic<typename T::scalar_type> > >(aniso,_sample)), ::nbl::hlsl::is_same_v, T))
728738 ((NBL_CONCEPT_REQ_EXPR_RET_TYPE)((T::create (V,V,V,V,V,eta,V)), ::nbl::hlsl::is_same_v, T))
729- ((NBL_CONCEPT_REQ_EXPR_RET_TYPE)((T::template create<surface_interactions::SAnisotropic<surface_interactions::SIsotropic<ray_dir_info::SBasic<typename T::scalar_type> > >,SLightSample<ray_dir_info::SBasic<typename T::scalar_type> > >(aniso,_sample,eta)), ::nbl::hlsl::is_same_v, T))
739+ ((NBL_CONCEPT_REQ_EXPR_RET_TYPE)((T::template create<surface_interactions::SAnisotropic<surface_interactions::SIsotropic<ray_dir_info::SBasic<typename T::scalar_type>, typename T::vector3_type > >,SLightSample<ray_dir_info::SBasic<typename T::scalar_type> > >(aniso,_sample,eta)), ::nbl::hlsl::is_same_v, T))
730740 ((NBL_CONCEPT_REQ_EXPR_RET_TYPE)((T::createPartial (pNdotL,pNdotL,pNdotL,b0,rcp_eta)), ::nbl::hlsl::is_same_v, T))
731741 ((NBL_CONCEPT_REQ_EXPR)(cache.fillTangents (V,V,V)))
732742 ((NBL_CONCEPT_REQ_TYPE_ALIAS_CONCEPT)(CreatableIsotropicMicrofacetCache, typename T::isocache_type))
0 commit comments