Skip to content

Commit 971e140

Browse files
committed
precompute more stuff in quant query
1 parent 444b656 commit 971e140

File tree

4 files changed

+19
-24
lines changed

4 files changed

+19
-24
lines changed

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

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -149,9 +149,7 @@ struct SCookTorrance
149149
NBL_FUNC_REQUIRES(RequiredInteraction<Interaction> && RequiredMicrofacetCache<MicrofacetCache>)
150150
spectral_type eval(NBL_CONST_REF_ARG(sample_type) _sample, NBL_CONST_REF_ARG(Interaction) interaction, NBL_CONST_REF_ARG(MicrofacetCache) cache)
151151
{
152-
fresnel_type _f = fresnel;
153-
NBL_IF_CONSTEXPR(IsBSDF)
154-
_f = impl::getOrientedFresnel<fresnel_type, IsBSDF>::__call(fresnel, interaction.getNdotV());
152+
fresnel_type _f = impl::getOrientedFresnel<fresnel_type, IsBSDF>::__call(fresnel, interaction.getNdotV());
155153
if (!__checkValid<Interaction, MicrofacetCache>(_f, _sample, interaction, cache))
156154
return hlsl::promote<spectral_type>(0.0);
157155

include/nbl/builtin/hlsl/bxdf/ndf/beckmann.hlsl

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -269,7 +269,8 @@ struct Beckmann
269269
NBL_IF_CONSTEXPR(SupportsTransmission)
270270
{
271271
quant_query.VdotHLdotH = cache.getVdotHLdotH();
272-
quant_query.VdotH_etaLdotH = cache.getVdotH() + orientedEta * cache.getLdotH();
272+
const scalar_type VdotH_etaLdotH = cache.getVdotH() + orientedEta * cache.getLdotH();
273+
quant_query.neg_rcp2_VdotH_etaLdotH = scalar_type(-1.0) / (VdotH_etaLdotH * VdotH_etaLdotH);
273274
}
274275
return quant_query;
275276
}

include/nbl/builtin/hlsl/bxdf/ndf/ggx.hlsl

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ NBL_CONCEPT_BEGIN(1)
2727
#define query NBL_CONCEPT_PARAM_T NBL_CONCEPT_PARAM_0
2828
NBL_CONCEPT_END(
2929
((NBL_CONCEPT_REQ_TYPE)(T::scalar_type))
30-
((NBL_CONCEPT_REQ_EXPR_RET_TYPE)((query.getNdf()), ::nbl::hlsl::is_same_v, typename T::scalar_type))
30+
((NBL_CONCEPT_REQ_EXPR_RET_TYPE)((query.getNdfwoNumerator()), ::nbl::hlsl::is_same_v, typename T::scalar_type))
3131
((NBL_CONCEPT_REQ_EXPR_RET_TYPE)((query.getG1over2NdotV()), ::nbl::hlsl::is_same_v, typename T::scalar_type))
3232
);
3333
#undef query
@@ -56,7 +56,7 @@ struct SGGXDG1Query
5656
{
5757
using scalar_type = T;
5858

59-
scalar_type getNdf() NBL_CONST_MEMBER_FUNC { return ndf; }
59+
scalar_type getNdfwoNumerator() NBL_CONST_MEMBER_FUNC { return ndf; }
6060
scalar_type getG1over2NdotV() NBL_CONST_MEMBER_FUNC { return G1_over_2NdotV; }
6161

6262
scalar_type ndf;
@@ -211,7 +211,8 @@ struct GGX
211211
NBL_IF_CONSTEXPR (SupportsTransmission)
212212
{
213213
quant_query.VdotHLdotH = cache.getVdotHLdotH();
214-
quant_query.VdotH_etaLdotH = cache.getVdotH() + orientedEta * cache.getLdotH();
214+
const scalar_type VdotH_etaLdotH = cache.getVdotH() + orientedEta * cache.getLdotH();
215+
quant_query.neg_rcp2_VdotH_etaLdotH = scalar_type(-1.0) / (VdotH_etaLdotH * VdotH_etaLdotH);
215216
}
216217
return quant_query;
217218
}
@@ -260,16 +261,15 @@ struct GGX
260261
{
261262
scalar_type d = __ndf_base.template D<MicrofacetCache>(cache);
262263
quant_type dmq;
263-
dmq.microfacetMeasure = d; // note: microfacetMeasure/2NdotV
264+
dmq.microfacetMeasure = d;
264265

265266
NBL_IF_CONSTEXPR(SupportsTransmission)
266267
{
267268
const scalar_type VdotHLdotH = quant_query.getVdotHLdotH();
268-
const scalar_type VdotH_etaLdotH = quant_query.getVdotH_etaLdotH();
269269
const bool transmitted = reflect_refract==MTT_REFRACT || (reflect_refract!=MTT_REFLECT && VdotHLdotH < scalar_type(0.0));
270270
scalar_type NdotL_over_denominator = _sample.getNdotL(BxDFClampMode::BCM_ABS);
271271
if (transmitted)
272-
NdotL_over_denominator *= -scalar_type(4.0) * VdotHLdotH / (VdotH_etaLdotH * VdotH_etaLdotH);
272+
NdotL_over_denominator *= scalar_type(4.0) * VdotHLdotH * quant_query.getNeg_rcp2_VdotH_etaLdotH();
273273
dmq.projectedLightMeasure = d * NdotL_over_denominator;
274274
}
275275
else
@@ -280,18 +280,17 @@ struct GGX
280280
template<class LS, class Interaction NBL_FUNC_REQUIRES(LightSample<LS> && RequiredInteraction<Interaction>)
281281
quant_type DG1(NBL_CONST_REF_ARG(dg1_query_type) query, NBL_CONST_REF_ARG(quant_query_type) quant_query, NBL_CONST_REF_ARG(LS) _sample, NBL_CONST_REF_ARG(Interaction) interaction)
282282
{
283-
scalar_type dg1 = scalar_type(0.5) * query.getNdf() * query.getG1over2NdotV();
283+
scalar_type dg1 = scalar_type(0.5) * query.getNdfwoNumerator() * query.getG1over2NdotV();
284284
quant_type dmq;
285285
dmq.microfacetMeasure = dg1; // note: microfacetMeasure/2NdotV
286286

287287
NBL_IF_CONSTEXPR(SupportsTransmission)
288288
{
289289
const scalar_type VdotHLdotH = quant_query.getVdotHLdotH();
290-
const scalar_type VdotH_etaLdotH = quant_query.getVdotH_etaLdotH();
291290
const bool transmitted = reflect_refract==MTT_REFRACT || (reflect_refract!=MTT_REFLECT && VdotHLdotH < scalar_type(0.0));
292291
scalar_type NdotL_over_denominator = _sample.getNdotL(BxDFClampMode::BCM_ABS);
293292
if (transmitted)
294-
NdotL_over_denominator *= -scalar_type(4.0) * VdotHLdotH / (VdotH_etaLdotH * VdotH_etaLdotH);
293+
NdotL_over_denominator *= scalar_type(4.0) * VdotHLdotH * quant_query.getNeg_rcp2_VdotH_etaLdotH();
295294
dmq.projectedLightMeasure = dg1;// TODO: figure this out * NdotL_over_denominator;
296295
}
297296
else

include/nbl/builtin/hlsl/bxdf/ndf/microfacet_to_light_transform.hlsl

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -29,10 +29,10 @@ struct DualMeasureQuantQuery
2929
using scalar_type = T;
3030

3131
scalar_type getVdotHLdotH() NBL_CONST_MEMBER_FUNC { return VdotHLdotH; }
32-
scalar_type getVdotH_etaLdotH() NBL_CONST_MEMBER_FUNC { return VdotH_etaLdotH; }
32+
scalar_type getNeg_rcp2_VdotH_etaLdotH () NBL_CONST_MEMBER_FUNC { return neg_rcp2_VdotH_etaLdotH ; }
3333

3434
scalar_type VdotHLdotH;
35-
scalar_type VdotH_etaLdotH;
35+
scalar_type neg_rcp2_VdotH_etaLdotH;
3636
};
3737

3838

@@ -52,18 +52,15 @@ struct createDualMeasureQuantity_helper
5252
{
5353
using scalar_type = typename vector_traits<T>::scalar_type;
5454

55-
static SDualMeasureQuant<T> __call(const T microfacetMeasure, scalar_type clampedNdotV, scalar_type clampedNdotL, scalar_type VdotHLdotH, scalar_type VdotH_etaLdotH)
55+
static SDualMeasureQuant<T> __call(const T microfacetMeasure, scalar_type clampedNdotV, scalar_type clampedNdotL, scalar_type VdotHLdotH, scalar_type neg_rcp2_VdotH_etaLdotH)
5656
{
5757
assert(clampedNdotV >= scalar_type(0.0) && clampedNdotL >= scalar_type(0.0));
5858
SDualMeasureQuant<T> retval;
5959
retval.microfacetMeasure = microfacetMeasure;
6060
// do constexpr booleans first so optimizer picks up this and short circuits
6161
const bool transmitted = reflect_refract==MTT_REFRACT || (reflect_refract!=MTT_REFLECT && VdotHLdotH < scalar_type(0.0));
62-
retval.projectedLightMeasure = microfacetMeasure*mix<scalar_type>(scalar_type(0.25),VdotHLdotH,transmitted);
63-
scalar_type denominator = clampedNdotV;
64-
if (transmitted) // VdotHLdotH is negative under transmission, so thats denominator is negative
65-
denominator *= -VdotH_etaLdotH * VdotH_etaLdotH;
66-
retval.projectedLightMeasure /= denominator;
62+
retval.projectedLightMeasure = microfacetMeasure * hlsl::mix(scalar_type(0.25),VdotHLdotH*neg_rcp2_VdotH_etaLdotH,transmitted)/clampedNdotV;
63+
// VdotHLdotH is negative under transmission, so thats denominator is negative
6764
return retval;
6865
}
6966
};
@@ -77,14 +74,14 @@ SDualMeasureQuant<T> createDualMeasureQuantity(const T specialMeasure, typename
7774
return impl::createDualMeasureQuantity_helper<T,MTT_REFLECT>::__call(specialMeasure,clampedNdotV,clampedNdotL,dummy,dummy);
7875
}
7976
template<typename T, MicrofacetTransformTypes reflect_refract>
80-
SDualMeasureQuant<T> createDualMeasureQuantity(const T specialMeasure, typename vector_traits<T>::scalar_type clampedNdotV, typename vector_traits<T>::scalar_type clampedNdotL, typename vector_traits<T>::scalar_type VdotHLdotH, typename vector_traits<T>::scalar_type VdotH_etaLdotH)
77+
SDualMeasureQuant<T> createDualMeasureQuantity(const T specialMeasure, typename vector_traits<T>::scalar_type clampedNdotV, typename vector_traits<T>::scalar_type clampedNdotL, typename vector_traits<T>::scalar_type VdotHLdotH, typename vector_traits<T>::scalar_type neg_rcp2_VdotH_etaLdotH)
8178
{
82-
return impl::createDualMeasureQuantity_helper<T,reflect_refract>::__call(specialMeasure,clampedNdotV,clampedNdotL,VdotHLdotH,VdotH_etaLdotH);
79+
return impl::createDualMeasureQuantity_helper<T,reflect_refract>::__call(specialMeasure,clampedNdotV,clampedNdotL,VdotHLdotH,neg_rcp2_VdotH_etaLdotH);
8380
}
8481
template<typename T, MicrofacetTransformTypes reflect_refract, class Query>
8582
SDualMeasureQuant<T> createDualMeasureQuantity(const T specialMeasure, typename vector_traits<T>::scalar_type clampedNdotV, typename vector_traits<T>::scalar_type clampedNdotL, NBL_CONST_REF_ARG(Query) query)
8683
{
87-
return impl::createDualMeasureQuantity_helper<T,reflect_refract>::__call(specialMeasure,clampedNdotV,clampedNdotL,query.getVdotHLdotH(),query.getVdotH_etaLdotH());
84+
return impl::createDualMeasureQuantity_helper<T,reflect_refract>::__call(specialMeasure,clampedNdotV,clampedNdotL,query.getVdotHLdotH(),query.getNeg_rcp2_VdotH_etaLdotH());
8885
}
8986

9087
}

0 commit comments

Comments
 (0)