Skip to content

Commit 23763e2

Browse files
committed
cache.isValid func, schlick fresnel reorient
1 parent 5765e87 commit 23763e2

File tree

3 files changed

+25
-11
lines changed

3 files changed

+25
-11
lines changed

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ struct check_TIR_helper<F, true>
8787
template<class MicrofacetCache>
8888
static bool __call(NBL_CONST_REF_ARG(F) fresnel, NBL_CONST_REF_ARG(MicrofacetCache) cache)
8989
{
90-
return ComputeMicrofacetNormal<typename F::scalar_type>::isValidMicrofacet(cache.isTransmission(), cache.getVdotL(), cache.getAbsNdotH(), fresnel.getRefractionOrientedEta());
90+
return cache.isValid(fresnel.getRefractionOrientedEta());
9191
}
9292
};
9393

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

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -468,8 +468,10 @@ struct SLightSample
468468
#define NBL_CONCEPT_TPLT_PRM_KINDS (typename)
469469
#define NBL_CONCEPT_TPLT_PRM_NAMES (T)
470470
#define NBL_CONCEPT_PARAM_0 (cache, T)
471-
NBL_CONCEPT_BEGIN(1)
471+
#define NBL_CONCEPT_PARAM_1 (eta, fresnel::OrientedEtas<vector<typename T::scalar_type,1> >)
472+
NBL_CONCEPT_BEGIN(2)
472473
#define cache NBL_CONCEPT_PARAM_T NBL_CONCEPT_PARAM_0
474+
#define eta NBL_CONCEPT_PARAM_T NBL_CONCEPT_PARAM_1
473475
NBL_CONCEPT_END(
474476
((NBL_CONCEPT_REQ_TYPE)(T::scalar_type))
475477
((NBL_CONCEPT_REQ_TYPE)(T::vector3_type))
@@ -480,7 +482,9 @@ NBL_CONCEPT_END(
480482
((NBL_CONCEPT_REQ_EXPR_RET_TYPE)((cache.getAbsNdotH()), ::nbl::hlsl::is_same_v, typename T::scalar_type))
481483
((NBL_CONCEPT_REQ_EXPR_RET_TYPE)((cache.getNdotH2()), ::nbl::hlsl::is_same_v, typename T::scalar_type))
482484
((NBL_CONCEPT_REQ_EXPR_RET_TYPE)((cache.isTransmission()), ::nbl::hlsl::is_same_v, bool))
485+
((NBL_CONCEPT_REQ_EXPR_RET_TYPE)((cache.isValid(eta)), ::nbl::hlsl::is_same_v, bool))
483486
);
487+
#undef eta
484488
#undef cache
485489
#include <nbl/builtin/hlsl/concepts/__end.hlsl>
486490

@@ -637,6 +641,11 @@ struct SIsotropicMicrofacetCache
637641
// similar with BSDF sampling, as fresnel can be high while reflection can be invalid, or low while refraction would be invalid too
638642
bool isTransmission() NBL_CONST_MEMBER_FUNC { return getVdotHLdotH() < scalar_type(0.0); }
639643

644+
bool isValid(NBL_CONST_REF_ARG(fresnel::OrientedEtas<monochrome_type>) orientedEta) NBL_CONST_MEMBER_FUNC
645+
{
646+
return ComputeMicrofacetNormal<scalar_type>::isValidMicrofacet(isTransmission(), VdotL, absNdotH, orientedEta);
647+
}
648+
640649
scalar_type getVdotL() NBL_CONST_MEMBER_FUNC { return VdotL; }
641650
scalar_type getVdotH() NBL_CONST_MEMBER_FUNC { return VdotH; }
642651
scalar_type getLdotH() NBL_CONST_MEMBER_FUNC { return LdotH; }
@@ -809,6 +818,11 @@ struct SAnisotropicMicrofacetCache
809818
scalar_type getNdotH2() NBL_CONST_MEMBER_FUNC { return iso_cache.getNdotH2(); }
810819
bool isTransmission() NBL_CONST_MEMBER_FUNC { return iso_cache.isTransmission(); }
811820

821+
bool isValid(NBL_CONST_REF_ARG(fresnel::OrientedEtas<monochrome_type>) orientedEta) NBL_CONST_MEMBER_FUNC
822+
{
823+
return iso_cache.isValid(orientedEta);
824+
}
825+
812826
scalar_type getTdotH() NBL_CONST_MEMBER_FUNC { return TdotH; }
813827
scalar_type getTdotH2() NBL_CONST_MEMBER_FUNC { const scalar_type t = getTdotH(); return t*t; }
814828
scalar_type getBdotH() NBL_CONST_MEMBER_FUNC { return BdotH; }

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

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -312,7 +312,6 @@ NBL_CONCEPT_END(
312312
((NBL_CONCEPT_REQ_TYPE)(T::scalar_type))
313313
((NBL_CONCEPT_REQ_TYPE)(T::vector_type))
314314
((NBL_CONCEPT_REQ_EXPR_RET_TYPE)((fresnel(cosTheta)), ::nbl::hlsl::is_same_v, typename T::vector_type))
315-
((NBL_CONCEPT_REQ_EXPR_RET_TYPE)((fresnel.getRefractionOrientedEta()), ::nbl::hlsl::is_same_v, OrientedEtas<typename T::vector_type>))
316315
((NBL_CONCEPT_REQ_EXPR_RET_TYPE)((fresnel.getOrientedEtaRcps()), ::nbl::hlsl::is_same_v, OrientedEtaRcps<typename T::vector_type>))
317316
);
318317
#undef cosTheta
@@ -329,6 +328,7 @@ NBL_CONCEPT_BEGIN(2)
329328
#define cosTheta NBL_CONCEPT_PARAM_T NBL_CONCEPT_PARAM_1
330329
NBL_CONCEPT_END(
331330
((NBL_CONCEPT_REQ_TYPE_ALIAS_CONCEPT)(Fresnel, T))
331+
((NBL_CONCEPT_REQ_EXPR_RET_TYPE)((fresnel.getRefractionOrientedEta()), ::nbl::hlsl::is_same_v, OrientedEtas<typename T::vector_type>))
332332
((NBL_CONCEPT_REQ_EXPR_RET_TYPE)((fresnel.getReorientedFresnel(cosTheta)), ::nbl::hlsl::is_same_v, T))
333333
);
334334
#undef cosTheta
@@ -374,6 +374,14 @@ struct Schlick
374374
return rcpEta;
375375
}
376376

377+
Schlick<T> getReorientedFresnel(const scalar_type NdotI) NBL_CONST_MEMBER_FUNC
378+
{
379+
// correct? but also sclick works best between eta 1.4-2.2
380+
OrientedEtaRcps<T> rcpEta = getOrientedEtaRcps();
381+
T sqrt_newF0 = (hlsl::promote<T>(1.0) - rcpEta.value) / (hlsl::promote<T>(1.0) + rcpEta.value);
382+
return Schlick<T>::create(sqrt_newF0 * sqrt_newF0);
383+
}
384+
377385
T F0;
378386
};
379387

@@ -418,14 +426,6 @@ struct Conductor
418426
return (rs2 + rp2) * 0.5f;
419427
}
420428

421-
OrientedEtas<T> getRefractionOrientedEta() NBL_CONST_MEMBER_FUNC
422-
{
423-
OrientedEtas<T> orientedEta;
424-
orientedEta.value = eta;
425-
orientedEta.rcp = hlsl::promote<T>(1.0) / eta;
426-
return orientedEta;
427-
}
428-
429429
OrientedEtaRcps<T> getOrientedEtaRcps() NBL_CONST_MEMBER_FUNC
430430
{
431431
OrientedEtaRcps<T> rcpEta;

0 commit comments

Comments
 (0)