@@ -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}
7976template<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}
8481template<typename T, MicrofacetTransformTypes reflect_refract, class Query>
8582SDualMeasureQuant<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