Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
42 commits
Select commit Hold shift + click to select a range
5def0b4
Fix checking valid jpeg file logic
Mar 14, 2026
f93f430
get opacity going!
devshgraphicsprogramming Mar 14, 2026
1a7bf02
really struggling with TWO_SIDED
devshgraphicsprogramming Mar 14, 2026
0dc31aa
add CFrontendIR node copying, stack reversal and individual BxDF expr…
devshgraphicsprogramming Mar 16, 2026
8aff0f7
Beer node needs a thickness unfortunately.
devshgraphicsprogramming Mar 16, 2026
1b0b6f3
quick hack around normalmaps and bumpmaps, sketch out the general ide…
devshgraphicsprogramming Mar 16, 2026
6a4e8df
Merge remote-tracking branch 'remotes/origin/hotfix_jpeg_loader' into…
devshgraphicsprogramming Mar 16, 2026
0c1e045
move UV transform to front of SParameterSet, keep variable length stu…
devshgraphicsprogramming Mar 16, 2026
850536c
implement BLEND_BSDF
devshgraphicsprogramming Mar 17, 2026
011e7f0
I forgot that for blends all layers need to be blended!
devshgraphicsprogramming Mar 17, 2026
2b34047
I don't want to admit how long it took me to debug this one
devshgraphicsprogramming Mar 17, 2026
2d3719f
fix the last thing in the material frontend
devshgraphicsprogramming Mar 18, 2026
ad0cf8d
fix TLAS export when Polygon Geometry can't be made into a BLAS
devshgraphicsprogramming Mar 18, 2026
5d2568b
merge master
devshgraphicsprogramming Mar 18, 2026
c86f8e1
Fix Wave include paths and failure dumps
AnastaZIuk Mar 19, 2026
4871e24
Clean up preprocess failure plumbing
AnastaZIuk Mar 19, 2026
1f73d6a
Backport Wave pragma fix and remove workaround
AnastaZIuk Mar 19, 2026
e4df2b2
Merge pull request #1025 from Devsh-Graphics-Programming/preprocessUp…
AnastaZIuk Mar 19, 2026
66da590
Use upstream gh-pages action for badges
AnastaZIuk Mar 19, 2026
f830a47
Promote NSC channel 66da590b3f06b586f69bdb522bad2f2eebf11b6f
github-actions[bot] Mar 19, 2026
00017ad
Merge pull request #1026 from Devsh-Graphics-Programming/ci/nsc-promo…
AnastaZIuk Mar 19, 2026
83e30e4
Merge branch 'master' into ris_bxdfs
keptsecret Mar 20, 2026
067d107
change concepts for bxdf to *_and_weight methods, make changes for co…
keptsecret Mar 20, 2026
fc6deb8
pdf method renamed to denominator, don't expect to be used
keptsecret Mar 20, 2026
c292f41
Merge remote-tracking branch 'remotes/origin/master' into mitsuba_xml…
devshgraphicsprogramming Mar 21, 2026
1a3d26a
Merge pull request #1021 from Devsh-Graphics-Programming/mitsuba_xml_…
devshgraphicsprogramming Mar 21, 2026
0afd2fa
fix MIS in the path tracer, dont make every ray that didn't miss go i…
devshgraphicsprogramming Mar 21, 2026
f2e2265
camelcase method names, no need for denominator method (pdf is pdf an…
keptsecret Mar 23, 2026
0708859
refactor cook torrance to fit concept
keptsecret Mar 23, 2026
b609179
znowu w zyciu mi nie wyszlo
devshgraphicsprogramming Mar 23, 2026
63cd4df
changes to method names in pt concept, use *_weight instead of pdf an…
keptsecret Mar 23, 2026
59e090e
record my discoveries
devshgraphicsprogramming Mar 23, 2026
a877934
renamed pdf to forwardPdf
keptsecret Mar 23, 2026
64ce3ba
add tractable pdf trait to bxdfs
keptsecret Mar 23, 2026
2539522
Merge remote-tracking branch 'remotes/origin/master' into mitsuba_xml…
devshgraphicsprogramming Mar 23, 2026
148b9bd
bxdf input random to generate has variable dimensions (brdf>=2; bsdf>…
keptsecret Mar 23, 2026
95a3862
merge master, fix conflicts
keptsecret Mar 24, 2026
946c9c7
pass ray to nee generate instead, store depth in ray
keptsecret Mar 24, 2026
4f4421d
nee deferredPdf is deferredWeight
keptsecret Mar 24, 2026
a70f420
all bxdfs have a cache type from generate to quotient_weight, microfa…
keptsecret Mar 24, 2026
dab4a18
eval should have its own cache type in concepts
keptsecret Mar 24, 2026
fb878a6
minor typo bug fixes
keptsecret Mar 25, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/build-nabla.yml
Original file line number Diff line number Diff line change
Expand Up @@ -569,7 +569,7 @@ jobs:
$imageBadge | Set-Content -Path "$imagePath/image-badge.json" -Encoding utf8

- name: Deploy Badges
uses: Devsh-Graphics-Programming/actions-gh-pages@v4.0.0-devsh.1
uses: peaceiris/actions-gh-pages@v3
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
publish_branch: badges
Expand Down
2 changes: 1 addition & 1 deletion 3rdparty/boost/superproject
Submodule superproject updated 1 files
+1 −1 libs/wave
2 changes: 1 addition & 1 deletion include/nbl/asset/ICPUScene.h
Original file line number Diff line number Diff line change
Expand Up @@ -276,7 +276,7 @@ class ICPUScene final : public IAsset, public IScene
instances.emplace_back().instance = std::move(inst);
}
// TODO: adjust BLAS geometry flags according to materials set opaqueness and NO_DUPLICATE_ANY_HIT_INVOCATION_BIT
SResult retval = {.instances=core::make_refctd_dynamic_array<decltype(SResult::instances)>(instanceCount),.allInstancesValid=allInstancesValid};
SResult retval = {.instances=core::make_refctd_dynamic_array<decltype(SResult::instances)>(instances.size()),.allInstancesValid=allInstancesValid};
std::move(instances.begin(),instances.end(),retval.instances->begin());
return retval;
}
Expand Down
265 changes: 221 additions & 44 deletions include/nbl/asset/material_compiler3/CFrontendIR.h

Large diffs are not rendered by default.

3 changes: 3 additions & 0 deletions include/nbl/asset/utils/IShaderCompiler.h
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@

#include "nbl/builtin/hlsl/enums.hlsl"

#include <functional>

namespace nbl::asset
{

Expand Down Expand Up @@ -136,6 +138,7 @@ class NBL_API2 IShaderCompiler : public core::IReferenceCounted
E_SPIRV_VERSION targetSpirvVersion = E_SPIRV_VERSION::ESV_1_6;
bool depfile = false;
system::path depfilePath = {};
std::function<void(std::string_view)> onPartialOutputOnFailure = {};
};

// https://github.com/microsoft/DirectXShaderCompiler/blob/main/docs/SPIR-V.rst#debugging
Expand Down
36 changes: 22 additions & 14 deletions include/nbl/builtin/hlsl/bxdf/base/cook_torrance_base.hlsl
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,9 @@ struct SCookTorrance

NBL_CONSTEXPR_STATIC_INLINE bool IsAnisotropic = ndf_type::IsAnisotropic;
NBL_CONSTEXPR_STATIC_INLINE bool IsBSDF = ndf_type::SupportedPaths != ndf::MTT_REFLECT;
using random_type = conditional_t<IsBSDF, vector3_type, vector2_type>;
NBL_HLSL_BXDF_ANISOTROPIC_COND_DECLS(IsAnisotropic);
using evalcache_type = conditional_t<IsAnisotropic,anisocache_type,isocache_type>;

// utility functions
template<class Interaction=conditional_t<IsAnisotropic,anisotropic_interaction_type,isotropic_interaction_type>,
Expand Down Expand Up @@ -156,19 +158,21 @@ struct SCookTorrance
template<class Interaction=conditional_t<IsAnisotropic,anisotropic_interaction_type,isotropic_interaction_type>,
class MicrofacetCache=conditional_t<IsAnisotropic,anisocache_type,isocache_type>
NBL_FUNC_REQUIRES(RequiredInteraction<Interaction> && RequiredMicrofacetCache<MicrofacetCache>)
spectral_type eval(NBL_CONST_REF_ARG(sample_type) _sample, NBL_CONST_REF_ARG(Interaction) interaction, NBL_CONST_REF_ARG(MicrofacetCache) cache) NBL_CONST_MEMBER_FUNC
quotient_pdf_type evalAndWeight(NBL_CONST_REF_ARG(sample_type) _sample, NBL_CONST_REF_ARG(Interaction) interaction, NBL_CONST_REF_ARG(MicrofacetCache) cache) NBL_CONST_MEMBER_FUNC
{
fresnel_type _f = __getOrientedFresnel(fresnel, interaction.getNdotV());
if (!__checkValid<Interaction, MicrofacetCache>(_f, _sample, interaction, cache))
return hlsl::promote<spectral_type>(0.0);
return quotient_pdf_type::create(scalar_type(0.0), scalar_type(0.0));

bool isInfinity;
scalar_type _pdf = __forwardPdf<Interaction, MicrofacetCache>(_sample, interaction, cache, isInfinity);

using quant_query_type = typename ndf_type::quant_query_type;
quant_query_type qq = impl::quant_query_helper<ndf_type, fresnel_type, IsBSDF>::template __call<Interaction, MicrofacetCache>(ndf, _f, interaction, cache);
Comment on lines 170 to 171
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

you've already computed this in __forwardPdf

Copy link
Member Author

@devshgraphicsprogramming devshgraphicsprogramming Mar 23, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

any way to making __forwardPdf spit this out for you?
Make make __forwardPdf<bool FromGenerator> returna struct

scalar_type pdf;
frensel_type orientedFresenel;
quant_query_type quantQuery;
[optional only when `IsBSDF && not fresnel_type::ReturnsMonochrome`] spectral_type reflectance;
[optional only when `IsBSDF && not fresnel_type::ReturnsMonochrome`] scalar_type scaled_reflectance ;

and doesn't abuse NBL_REF_ARG to return extra things

Also this way this whole block of code

retval.pdf = 0.f;
retval.orientedFresenel = __getOrientedFresnel(fresnel, interaction.getNdotV());
const bool cacheIsValid = __checkValid<Interaction, MicrofacetCache>(retval.orientedFresenel, _sample, interaction, cache);
assert(!FromGenerator || cacheIsValid);
if (FromGenerator ? _sample.isValid():cacheIsValid)
{
... fill the members with the old function body
}
return retval;

can replace the preludes in quotientAndWeight and evalAndWeight with just

if (pdfQuery.pdf==0.f)
   return ...;

up until the G2_over_G1 computation

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

or the __overwriteDG

Copy link
Member Author

@devshgraphicsprogramming devshgraphicsprogramming Mar 23, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

the quotient... function can just not use quantQueryits the same as using a dummy on a NBL_REF_ARG


using g2g1_query_type = typename ndf_type::g2g1_query_type;
g2g1_query_type gq = ndf.template createG2G1Query<sample_type, Interaction>(_sample, interaction);

bool isInfinity;
quant_type D = ndf.template D<sample_type, Interaction, MicrofacetCache>(qq, _sample, interaction, cache, isInfinity);
scalar_type DG = D.projectedLightMeasure;
if (!isInfinity)
Expand All @@ -179,19 +183,22 @@ struct SCookTorrance
// immediately return only after all calls setting DG
// allows compiler to throw away calls to ndf.D if using __overwriteDG, before that we only avoid computation for G2(correlated)
if (isInfinity)
return hlsl::promote<spectral_type>(0.0);
return quotient_pdf_type::create(scalar_type(0.0), scalar_type(0.0));

scalar_type clampedVdotH = cache.getVdotH();
NBL_IF_CONSTEXPR(IsBSDF)
clampedVdotH = hlsl::abs(clampedVdotH);
Comment on lines 188 to 190
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

you only need this to call const spectral_type reflectance = impl::__implicit_promote<spectral_type, typename fresnel_type::vector_type>::__call(_f(clampedVdotH));

which we already would have had __forwardPdf return to us because it needed to compute it

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

it doesn't compute it for you in the BRDF case, but you don't ened to have this whole tempvar and clamp it then


spectral_type quo;
NBL_IF_CONSTEXPR(IsBSDF)
{
const spectral_type reflectance = impl::__implicit_promote<spectral_type, typename fresnel_type::vector_type>::__call(_f(clampedVdotH));
return hlsl::mix(reflectance, hlsl::promote<spectral_type>(1.0) - reflectance, cache.isTransmission()) * DG;
quo = hlsl::mix(reflectance, hlsl::promote<spectral_type>(1.0) - reflectance, cache.isTransmission()) * DG;
}
else
return impl::__implicit_promote<spectral_type, typename fresnel_type::vector_type>::__call(_f(clampedVdotH)) * DG;
quo = impl::__implicit_promote<spectral_type, typename fresnel_type::vector_type>::__call(_f(clampedVdotH)) * DG;

return quotient_pdf_type::create(quo, _pdf);
}

Comment on lines 191 to 196
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

in combination with previous comment it would simplify to

NBL_IF_CONSTEXPR(fresnel_type::IsBSDF)
{
   NBL_IF_CONSTEXPR(fresnel_type::ReturnsMonochrome)
   {
      quo =  pdfRetval.reflectance;
   }
   else
   {
      quo = mix(pdfRetval.reflectance,hlsl::promote<spectral_type>(1.0) - pdfRetval.reflectance, cache.isTransmission();
   }
}
else
   quo =impl::__implicit_promote<spectral_type, typename fresnel_type::vector_type>::__call( _f(cache.getVdotH()));
quo *= DG;

with DG mul done outside

sample_type __generate_common(NBL_CONST_REF_ARG(anisotropic_interaction_type) interaction, const vector3_type localH,
Expand Down Expand Up @@ -245,7 +252,7 @@ struct SCookTorrance
return sample_type::create(L, T, B, NdotL);
}
template<typename C=bool_constant<!IsBSDF> NBL_FUNC_REQUIRES(C::value && !IsBSDF)
sample_type generate(NBL_CONST_REF_ARG(anisotropic_interaction_type) interaction, const vector2_type u, NBL_REF_ARG(anisocache_type) cache) NBL_CONST_MEMBER_FUNC
sample_type generate(NBL_CONST_REF_ARG(anisotropic_interaction_type) interaction, const random_type u, NBL_REF_ARG(anisocache_type) cache) NBL_CONST_MEMBER_FUNC
{
const scalar_type NdotV = interaction.getNdotV();
if (NdotV < numeric_limits<scalar_type>::min)
Expand Down Expand Up @@ -275,7 +282,7 @@ struct SCookTorrance
return s;
}
template<typename C=bool_constant<IsBSDF> NBL_FUNC_REQUIRES(C::value && IsBSDF)
sample_type generate(NBL_CONST_REF_ARG(anisotropic_interaction_type) interaction, const vector3_type u, NBL_REF_ARG(anisocache_type) cache) NBL_CONST_MEMBER_FUNC
sample_type generate(NBL_CONST_REF_ARG(anisotropic_interaction_type) interaction, const random_type u, NBL_REF_ARG(anisocache_type) cache) NBL_CONST_MEMBER_FUNC
{
const vector3_type localV = interaction.getTangentSpaceV();
const scalar_type NdotV = localV.z;
Expand Down Expand Up @@ -332,7 +339,7 @@ struct SCookTorrance
return s;
}
template<typename C=bool_constant<!IsAnisotropic> NBL_FUNC_REQUIRES(C::value && !IsAnisotropic)
sample_type generate(NBL_CONST_REF_ARG(isotropic_interaction_type) interaction, const conditional_t<IsBSDF, vector3_type, vector2_type> u, NBL_REF_ARG(isocache_type) cache) NBL_CONST_MEMBER_FUNC
sample_type generate(NBL_CONST_REF_ARG(isotropic_interaction_type) interaction, const random_type u, NBL_REF_ARG(isocache_type) cache) NBL_CONST_MEMBER_FUNC
{
anisocache_type aniso_cache;
sample_type s = generate(anisotropic_interaction_type::create(interaction), u, aniso_cache);
Expand All @@ -341,7 +348,7 @@ struct SCookTorrance
}

template<class Interaction, class MicrofacetCache>
scalar_type __pdf(NBL_CONST_REF_ARG(sample_type) _sample, NBL_CONST_REF_ARG(Interaction) interaction, NBL_CONST_REF_ARG(MicrofacetCache) cache, NBL_REF_ARG(bool) isInfinity) NBL_CONST_MEMBER_FUNC
scalar_type __forwardPdf(NBL_CONST_REF_ARG(sample_type) _sample, NBL_CONST_REF_ARG(Interaction) interaction, NBL_CONST_REF_ARG(MicrofacetCache) cache, NBL_REF_ARG(bool) isInfinity) NBL_CONST_MEMBER_FUNC
{
using quant_query_type = typename ndf_type::quant_query_type;
using dg1_query_type = typename ndf_type::dg1_query_type;
Expand All @@ -366,27 +373,27 @@ struct SCookTorrance
template<class Interaction=conditional_t<IsAnisotropic,anisotropic_interaction_type,isotropic_interaction_type>,
class MicrofacetCache=conditional_t<IsAnisotropic,anisocache_type,isocache_type>
NBL_FUNC_REQUIRES(RequiredInteraction<Interaction> && RequiredMicrofacetCache<MicrofacetCache>)
scalar_type pdf(NBL_CONST_REF_ARG(sample_type) _sample, NBL_CONST_REF_ARG(Interaction) interaction, NBL_CONST_REF_ARG(MicrofacetCache) cache) NBL_CONST_MEMBER_FUNC
scalar_type forwardPdf(NBL_CONST_REF_ARG(sample_type) _sample, NBL_CONST_REF_ARG(Interaction) interaction, NBL_CONST_REF_ARG(MicrofacetCache) cache) NBL_CONST_MEMBER_FUNC
{
fresnel_type _f = __getOrientedFresnel(fresnel, interaction.getNdotV());
if (!__checkValid<Interaction, MicrofacetCache>(_f, _sample, interaction, cache))
return scalar_type(0.0);

bool isInfinity;
scalar_type _pdf = __pdf<Interaction, MicrofacetCache>(_sample, interaction, cache, isInfinity);
scalar_type _pdf = __forwardPdf<Interaction, MicrofacetCache>(_sample, interaction, cache, isInfinity);
return hlsl::mix(_pdf, scalar_type(0.0), isInfinity);
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this is incorrect, it should return INF for forward, it was only backward when it was not meant to (hence why I asked for the distinction)

}

template<class Interaction=conditional_t<IsAnisotropic,anisotropic_interaction_type,isotropic_interaction_type>,
class MicrofacetCache=conditional_t<IsAnisotropic,anisocache_type,isocache_type>
NBL_FUNC_REQUIRES(RequiredInteraction<Interaction> && RequiredMicrofacetCache<MicrofacetCache>)
quotient_pdf_type quotient_and_pdf(NBL_CONST_REF_ARG(sample_type) _sample, NBL_CONST_REF_ARG(Interaction) interaction, NBL_CONST_REF_ARG(MicrofacetCache) cache) NBL_CONST_MEMBER_FUNC
quotient_pdf_type quotientAndWeight(NBL_CONST_REF_ARG(sample_type) _sample, NBL_CONST_REF_ARG(Interaction) interaction, NBL_CONST_REF_ARG(MicrofacetCache) cache) NBL_CONST_MEMBER_FUNC
{
if (!_sample.isValid())
return quotient_pdf_type::create(scalar_type(0.0), scalar_type(0.0)); // set pdf=0 when quo=0 because we don't want to give high weight to sampling strategy that yields 0 contribution

bool isInfinity;
scalar_type _pdf = __pdf<Interaction, MicrofacetCache>(_sample, interaction, cache, isInfinity);
scalar_type _pdf = __forwardPdf<Interaction, MicrofacetCache>(_sample, interaction, cache, isInfinity);
fresnel_type _f = __getOrientedFresnel(fresnel, interaction.getNdotV());

const bool valid = __checkValid<Interaction, MicrofacetCache>(_f, _sample, interaction, cache);
Expand Down Expand Up @@ -436,6 +443,7 @@ struct traits<SCookTorrance<Config,N,F> >
NBL_CONSTEXPR_STATIC_INLINE bool IsMicrofacet = true;
NBL_CONSTEXPR_STATIC_INLINE bool clampNdotV = !__type::IsBSDF;
NBL_CONSTEXPR_STATIC_INLINE bool clampNdotL = !__type::IsBSDF;
NBL_CONSTEXPR_STATIC_INLINE bool TractablePdf = true;
};

}
Expand Down
41 changes: 21 additions & 20 deletions include/nbl/builtin/hlsl/bxdf/base/lambertian.hlsl
Original file line number Diff line number Diff line change
Expand Up @@ -23,58 +23,59 @@ struct SLambertianBase
using this_t = SLambertianBase<Config, IsBSDF>;
BXDF_CONFIG_TYPE_ALIASES(Config);

using random_type = conditional_t<IsBSDF, vector3_type, vector2_type>;
struct Cache {};
using isocache_type = Cache;
using anisocache_type = Cache;
using evalcache_type = Cache;
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

there should be no evalcache_type, its still same cache as for quotient and generate

But having an evalAndWeight with an overload that takes it should be a Cook Torrance / Microfacet thing only


NBL_CONSTEXPR_STATIC_INLINE BxDFClampMode _clamp = conditional_value<IsBSDF, BxDFClampMode, BxDFClampMode::BCM_ABS, BxDFClampMode::BCM_MAX>::value;

spectral_type eval(NBL_CONST_REF_ARG(sample_type) _sample, NBL_CONST_REF_ARG(isotropic_interaction_type) interaction) NBL_CONST_MEMBER_FUNC
quotient_pdf_type evalAndWeight(NBL_CONST_REF_ARG(sample_type) _sample, NBL_CONST_REF_ARG(isotropic_interaction_type) interaction, NBL_CONST_REF_ARG(evalcache_type) _cache) NBL_CONST_MEMBER_FUNC
{
return hlsl::promote<spectral_type>(_sample.getNdotL(_clamp) * numbers::inv_pi<scalar_type> * hlsl::mix(1.0, 0.5, IsBSDF));
const spectral_type quo = hlsl::promote<spectral_type>(_sample.getNdotL(_clamp) * numbers::inv_pi<scalar_type> * hlsl::mix(1.0, 0.5, IsBSDF));
return quotient_pdf_type::create(quo, forwardPdf(_sample, interaction));
}
spectral_type eval(NBL_CONST_REF_ARG(sample_type) _sample, NBL_CONST_REF_ARG(anisotropic_interaction_type) interaction) NBL_CONST_MEMBER_FUNC
quotient_pdf_type evalAndWeight(NBL_CONST_REF_ARG(sample_type) _sample, NBL_CONST_REF_ARG(anisotropic_interaction_type) interaction, NBL_CONST_REF_ARG(evalcache_type) _cache) NBL_CONST_MEMBER_FUNC
{
return eval(_sample, interaction.isotropic);
return evalAndWeight(_sample, interaction.isotropic, _cache);
}

template<typename C=bool_constant<!IsBSDF> >
enable_if_t<C::value && !IsBSDF, sample_type> generate(NBL_CONST_REF_ARG(anisotropic_interaction_type) interaction, const vector2_type u) NBL_CONST_MEMBER_FUNC
enable_if_t<C::value && !IsBSDF, sample_type> generate(NBL_CONST_REF_ARG(anisotropic_interaction_type) interaction, const random_type u, NBL_CONST_REF_ARG(anisocache_type) _cache) NBL_CONST_MEMBER_FUNC
{
typename sampling::ProjectedHemisphere<scalar_type>::cache_type cache;
ray_dir_info_type L;
L.setDirection(sampling::ProjectedHemisphere<scalar_type>::generate(u, cache));
return sample_type::createFromTangentSpace(L, interaction.getFromTangentSpace());
}
template<typename C=bool_constant<IsBSDF> >
enable_if_t<C::value && IsBSDF, sample_type> generate(NBL_CONST_REF_ARG(anisotropic_interaction_type) interaction, const vector3_type u) NBL_CONST_MEMBER_FUNC
enable_if_t<C::value && IsBSDF, sample_type> generate(NBL_CONST_REF_ARG(anisotropic_interaction_type) interaction, const random_type u, NBL_REF_ARG(anisocache_type) _cache) NBL_CONST_MEMBER_FUNC
{
typename sampling::ProjectedSphere<scalar_type>::cache_type cache;
vector3_type _u = u;
ray_dir_info_type L;
L.setDirection(sampling::ProjectedSphere<scalar_type>::generate(_u, cache));
return sample_type::createFromTangentSpace(L, interaction.getFromTangentSpace());
}
template<typename C=bool_constant<!IsBSDF> >
enable_if_t<C::value && !IsBSDF, sample_type> generate(NBL_CONST_REF_ARG(isotropic_interaction_type) interaction, const vector2_type u) NBL_CONST_MEMBER_FUNC
{
return generate(anisotropic_interaction_type::create(interaction), u);
}
template<typename C=bool_constant<IsBSDF> >
enable_if_t<C::value && IsBSDF, sample_type> generate(NBL_CONST_REF_ARG(isotropic_interaction_type) interaction, const vector3_type u) NBL_CONST_MEMBER_FUNC
sample_type generate(NBL_CONST_REF_ARG(isotropic_interaction_type) interaction, const random_type u, NBL_REF_ARG(isocache_type) _cache) NBL_CONST_MEMBER_FUNC
{
return generate(anisotropic_interaction_type::create(interaction), u);
return generate(anisotropic_interaction_type::create(interaction), u, _cache);
}

scalar_type pdf(NBL_CONST_REF_ARG(sample_type) _sample, NBL_CONST_REF_ARG(isotropic_interaction_type) interaction) NBL_CONST_MEMBER_FUNC
scalar_type forwardPdf(NBL_CONST_REF_ARG(sample_type) _sample, NBL_CONST_REF_ARG(isotropic_interaction_type) interaction) NBL_CONST_MEMBER_FUNC
{
NBL_IF_CONSTEXPR (IsBSDF)
return sampling::ProjectedSphere<scalar_type>::pdf(_sample.getNdotL(_clamp));
else
return sampling::ProjectedHemisphere<scalar_type>::pdf(_sample.getNdotL(_clamp));
}
scalar_type pdf(NBL_CONST_REF_ARG(sample_type) _sample, NBL_CONST_REF_ARG(anisotropic_interaction_type) interaction) NBL_CONST_MEMBER_FUNC
scalar_type forwardPdf(NBL_CONST_REF_ARG(sample_type) _sample, NBL_CONST_REF_ARG(anisotropic_interaction_type) interaction) NBL_CONST_MEMBER_FUNC
{
return pdf(_sample, interaction.isotropic);
return forwardPdf(_sample, interaction.isotropic);
}

quotient_pdf_type quotient_and_pdf(NBL_CONST_REF_ARG(sample_type) _sample, NBL_CONST_REF_ARG(isotropic_interaction_type) interaction) NBL_CONST_MEMBER_FUNC
quotient_pdf_type quotientAndWeight(NBL_CONST_REF_ARG(sample_type) _sample, NBL_CONST_REF_ARG(isotropic_interaction_type) interaction, NBL_CONST_REF_ARG(isocache_type) _cache) NBL_CONST_MEMBER_FUNC
{
sampling::quotient_and_pdf<monochrome_type, scalar_type> qp;
NBL_IF_CONSTEXPR (IsBSDF)
Expand All @@ -83,9 +84,9 @@ struct SLambertianBase
qp = sampling::ProjectedHemisphere<scalar_type>::template quotientAndPdf(_sample.getNdotL(_clamp));
return quotient_pdf_type::create(qp.quotient()[0], qp.pdf());
}
quotient_pdf_type quotient_and_pdf(NBL_CONST_REF_ARG(sample_type) _sample, NBL_CONST_REF_ARG(anisotropic_interaction_type) interaction) NBL_CONST_MEMBER_FUNC
quotient_pdf_type quotientAndWeight(NBL_CONST_REF_ARG(sample_type) _sample, NBL_CONST_REF_ARG(anisotropic_interaction_type) interaction, NBL_CONST_REF_ARG(anisocache_type) _cache) NBL_CONST_MEMBER_FUNC
{
return quotient_and_pdf(_sample, interaction.isotropic);
return quotientAndWeight(_sample, interaction.isotropic, _cache);
}
};

Expand Down
Loading
Loading