Foundation
Loading...
Searching...
No Matches
Precompute.hpp
Go to the documentation of this file.
1#pragma once
2#include <Core/Container.hpp>
3#include <Math/Math.hpp>
4using namespace Foundation;
5using namespace Core;
6using namespace Math;
7// https://www.pbr-book.org/4ed/Sampling_Algorithms/The_Alias_Method#AliasTable
8struct GSAlias
9{
10 float prob, select;
11 uint alias;
12};
13
15{
18 // Index into mBins
19 uint Sample(float u, float& pdf) const;
20 float PDF(uint sample) const { return mBins[sample].prob; }
21};
22
23// https://www.pbr-book.org/4ed/Sampling_Algorithms/Sampling_1D_Functions#eq:piecewise-step-integral
25{
27 float mInt;
29
30 float Int() const { return mInt; }
31 // Uniform location in [0,1]
32 float Sample(float u, float& pdf, uint& offset) const;
33 float PDF(float sample) const {
34 uint offset = clamp(static_cast<uint>(sample * mF.size()), 0u, static_cast<uint>(mF.size() - 1));
35 return mInt > 0.0f ? mF[offset] / mInt : 0.0f;
36 }
37};
38// https://www.pbr-book.org/4ed/Sampling_Algorithms/Sampling_Multidimensional_Functions#PiecewiseConstant2D
40{
44
45 PiecewiseConstant2D(Span<const float> f, uint nu, uint nv, Allocator* alloc);
46
47 uint2 Domain() const { return { mConditional[0]->mF.size(), mConditional.size() }; }
48
49 float Int() const { return mMarginal->Int(); }
50 float2 Sample(float2 u, float& pdf, uint2& offset) const;
51 float PDF(float2 sample) const;
52};
General Purpose Allocator (GPA) interface.
Definition Allocator.hpp:24
std::vector< T, StlAllocator< T > > Vector
std::vector with explicit Foundation::Core::StlAllocator constructor
Definition Container.hpp:130
std::unique_ptr< T, Deleter > UniquePtr
std::unique_ptr with custom deleter that uses a Foundation::Core::Allocator to deallocate memory.
Definition Allocator.hpp:170
std::span< T > Span
Alias for std::span
Definition Container.hpp:60
Definition Allocator.hpp:5
Definition Precompute.hpp:15
Vector< GSAlias > mBins
Definition Precompute.hpp:16
uint Sample(float u, float &pdf) const
Definition Precompute.cpp:49
float PDF(uint sample) const
Definition Precompute.hpp:20
Definition Precompute.hpp:9
float select
Definition Precompute.hpp:10
float prob
Definition Precompute.hpp:10
uint alias
Definition Precompute.hpp:11
Definition Precompute.hpp:25
float Int() const
Definition Precompute.hpp:30
Vector< float > mF
Definition Precompute.hpp:26
float PDF(float sample) const
Definition Precompute.hpp:33
float Sample(float u, float &pdf, uint &offset) const
Definition Precompute.cpp:80
float mInt
Definition Precompute.hpp:27
Vector< float > mCDF
Definition Precompute.hpp:26
Definition Precompute.hpp:40
UniquePtr< PiecewiseConstant1D > mMarginal
Definition Precompute.hpp:42
uint2 Domain() const
Definition Precompute.hpp:47
float PDF(float2 sample) const
Definition Precompute.cpp:113
Vector< float > mF
Definition Precompute.hpp:41
float Int() const
Definition Precompute.hpp:49
Vector< UniquePtr< PiecewiseConstant1D > > mConditional
Definition Precompute.hpp:43
float2 Sample(float2 u, float &pdf, uint2 &offset) const
Definition Precompute.cpp:105