Skip to content

Commit 08ad78a

Browse files
Merge pull request #918 from Devsh-Graphics-Programming/iridescence_bxdf
Iridescent fresnel, bxdfs
2 parents b7f3dfb + 1908749 commit 08ad78a

File tree

18 files changed

+841
-288
lines changed

18 files changed

+841
-288
lines changed

include/nbl/builtin/hlsl/bxdf/base/cook_torrance_base.hlsl

Lines changed: 162 additions & 146 deletions
Large diffs are not rendered by default.

include/nbl/builtin/hlsl/bxdf/common.hlsl

Lines changed: 21 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -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>)
206208
struct 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)
540550
NBL_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

Comments
 (0)