Foundation
Loading...
Searching...
No Matches
Precompute.hpp
Go to the documentation of this file.
1#pragma once
2#include <Core/Container.hpp>
3#include <Core/JobSystem.hpp>
4#include <Math/Math.hpp>
5#include "Texture.hpp"
6using namespace Foundation;
7using namespace Core;
8using namespace Math;
9// https://www.pbr-book.org/4ed/Sampling_Algorithms/The_Alias_Method#AliasTable
10struct GSAlias
11{
12 float prob, select;
13 uint alias;
14};
15static_assert(sizeof(GSAlias) == 12);
16
18{
21 // Index into mBins
22 uint Sample(float u, float& pdf) const;
23 float PDF(uint sample) const { return mBins[sample].prob; }
24};
25[[nodiscard]] bool AliasTableRunSelfTests(Allocator* alloc, String* outError = nullptr);
26// https://www.pbr-book.org/4ed/Sampling_Algorithms/Sampling_1D_Functions#eq:piecewise-step-integral
28{
30 float mInt;
32
33 float Int() const { return mInt; }
34 // Uniform location in [0,1]
35 float Sample(float u, float& pdf, uint& offset) const;
36 float PDF(float sample) const {
37 uint offset = clamp(static_cast<uint>(sample * mF.size()), 0u, static_cast<uint>(mF.size() - 1));
38 return mInt > 0.0f ? mF[offset] / mInt : 0.0f;
39 }
40};
41// https://www.pbr-book.org/4ed/Sampling_Algorithms/Sampling_Multidimensional_Functions#PiecewiseConstant2D
43{
47
48 PiecewiseConstant2D(Span<const float> f, uint nu, uint nv, Allocator* alloc);
49
50 uint2 Domain() const { return { mConditional[0]->mF.size(), mConditional.size() }; }
51
52 float Int() const { return mMarginal->Int(); }
53 float2 Sample(float2 u, float& pdf, uint2& offset) const;
54 float PDF(float2 sample) const;
55};
56void PrefilterEnvmapSH9(const FTexture& source, Span<float3> sh9, JobSystem* jobs, Allocator* alloc);
57FTexture PrefilterEnvmapSpecular(const FTexture& source, JobSystem* jobs, Allocator* alloc);
58float ReflectionRoughnessFromMip(uint32_t mip, uint32_t numMips);
59float ReflectionMipFromRoughness(float roughness, uint32_t numMips);
float ReflectionRoughnessFromMip(uint32_t mip, uint32_t numMips)
Definition Precompute.cpp:210
FTexture PrefilterEnvmapSpecular(const FTexture &source, JobSystem *jobs, Allocator *alloc)
Definition Precompute.cpp:264
void PrefilterEnvmapSH9(const FTexture &source, Span< float3 > sh9, JobSystem *jobs, Allocator *alloc)
Definition Precompute.cpp:220
bool AliasTableRunSelfTests(Allocator *alloc, String *outError=nullptr)
Definition Precompute.cpp:65
float ReflectionMipFromRoughness(float roughness, uint32_t numMips)
Definition Precompute.cpp:215
Allocator interface (noexcept)
Definition Allocator.hpp:29
Definition JobSystem.hpp:135
std::vector< T, StlAllocator< T > > Vector
std::vector with explicit Foundation::Core::StlAllocator constructor
Definition Container.hpp:149
std::basic_string< char, std::char_traits< char >, StlDefaultAllocator< char > > String
Alias for std::basic_string<char>, without an explicit allocator constructor.
Definition Container.hpp:120
std::unique_ptr< T, Deleter > UniquePtr
std::unique_ptr with custom deleter that uses a Foundation::Core::Allocator to deallocate memory.
Definition Allocator.hpp:180
std::span< T > Span
Alias for std::span
Definition Container.hpp:62
Definition Allocator.hpp:6
Definition Precompute.hpp:18
Vector< GSAlias > mBins
Definition Precompute.hpp:19
uint Sample(float u, float &pdf) const
Definition Precompute.cpp:53
float PDF(uint sample) const
Definition Precompute.hpp:23
Definition Texture.hpp:79
Definition Precompute.hpp:11
float select
Definition Precompute.hpp:12
float prob
Definition Precompute.hpp:12
uint alias
Definition Precompute.hpp:13
Definition Precompute.hpp:28
float Int() const
Definition Precompute.hpp:33
Vector< float > mF
Definition Precompute.hpp:29
float PDF(float sample) const
Definition Precompute.hpp:36
float Sample(float u, float &pdf, uint &offset) const
Definition Precompute.cpp:121
float mInt
Definition Precompute.hpp:30
Vector< float > mCDF
Definition Precompute.hpp:29
Definition Precompute.hpp:43
UniquePtr< PiecewiseConstant1D > mMarginal
Definition Precompute.hpp:45
uint2 Domain() const
Definition Precompute.hpp:50
float PDF(float2 sample) const
Definition Precompute.cpp:154
Vector< float > mF
Definition Precompute.hpp:44
float Int() const
Definition Precompute.hpp:52
Vector< UniquePtr< PiecewiseConstant1D > > mConditional
Definition Precompute.hpp:46
float2 Sample(float2 u, float &pdf, uint2 &offset) const
Definition Precompute.cpp:146