-
Api changes:
Device
addednumThread
parameter (default = 0) to the constructor to set the number of threads used byOpen PGL
during training. The default value of0
uses all threads provided byTBB
. If the renderer usesTBB
as well and regulates the thread count this count is also used byOpen PGL
.SurfaceSamplingDistribution
andVolumeSamplingDistribution
:- Added
GetId
function to return the unique id of the spatial structure used to query the sampling distriubtion.
- Added
Field
andSampleStorage
, addedCompare
function to check if the data stored in different instances (e.g., generated by two separate runs) are similar (i.e., same spatial subdivisions and directional distributions).Field
:- The constructor of the
Field
class now takes aFieldConfig
instead of aPGLFieldArguments
object. (BREAKING API CHANGE) GetSurfaceStatistics
andGetVolumeStatistics
functions are added to query statistics about the surface and volume guiding field. The functions return aFieldStatistics
object. Note, querying the statistics of aField
introduces a small overhead.
- The constructor of the
FieldStatistics
:- This class store different statistics about a
Field
, such as, number and size of spatial nodes, statistics about the directional distributions, and the times spend for full and separate steps of the lastUpdate
step. The statistics can be queried as a full string (useful for logging) or as CSV strings (useful for analysis and plotting). ToString
: Returns a string printing all statistics.HeaderCSVString
: Returns the CSV header sting with the names of each statistic.ToCSVString
: Returns the CSV value sting of each statistic.
- This class store different statistics about a
FieldConfig
:- This class is added to replace the
PGLFieldArguments
struct when using the C++ API. -Init
: the function initializes the parameters of theFieldConfig
(i.e., similar topglFieldArgumentsSetDefaults
). Additional parameters (deterministic
andmaxSamplesPerLeaf
) are introduced to enable deterministic behavior and to control the spatial subdivision granularity. -SetSpatialStructureArgMaxDepth
: this function can be called afterInit
to the the maximum tree depth of the spatial structure.
- This class is added to replace the
pglFieldArgumentsSetDefaults
: Adding two additional parametersdeterministic
andmaxSamplesPerLeaf
. (BREAKING API CHANGE)
-
Tools:
- Added a set of command line tools which are build when enabling the
OPENPGL_BUILD_TOOLS
Cmake flag.openpgl_bench
: Tool to time different components ofOpen PGL
such as the full training of aField
or the querying (initialization) ofSamplingDistributions
.openpgl_debug
: Tool tovalidate
andcompare
storedSampleStorage
andField
objects or retrain aField
from scratch using multiple stored sets (iterations) of stored samples.
- Added a set of command line tools which are build when enabling the
-
Optimizations:
- Spatial structure (Kd-tree) build is now fully multithreaded. This improves training performance on machines with higher core counts, especially when using
deterministic
training. - Kd-tree switched to use cache-friendlier
TreeLets
instead of singleTreeNode
structures.
- Spatial structure (Kd-tree) build is now fully multithreaded. This improves training performance on machines with higher core counts, especially when using
-
Bugfixes:
Field
fixed some non-deterministic behavior when spatial cache does not receive any training data during a training iteration due to a large number of training iterations.- Removed legacy/broken support for
OpenMP
threading since there is a dependency toTBB
anyway. - Fixed build problems on (non-Mac)
ARM
systems.
-
Api changes:
-
PathSegmentStorage
:-
Removed support for splatting training samples due to the fact that knn-lookups have proven to be better. Therefore, the function attributes
splatSamples
andsampler
have been removed from thePrepareSamples
function. -
Added
PropagateSamples
method prepare and push samples to theSampleStorage
The goal is to replacePrepareSamples
,GetSamples
andAddSamples
.
-
-
Sampler
:- Removed since it is not used/needed anymore.
-
SurfaceSamplingDistribution
andVolumeSamplingDistribution
:- The usage of parallax-compensation is now connected to the guiding distribution type. Therefore the explicit
useParallaxCompensation
parameter is removed from theInit
functions of theSamplingDistributions
. - Added
IncomingRadiancePDF
function that returns an approximation of the incoming radiance distribution. This PDF does not need to be related to the actual sampling PDF but can be used for Resampled Importance Sampling (RIS).
- The usage of parallax-compensation is now connected to the guiding distribution type. Therefore the explicit
-
Field
:- Adding
UpdateSurface
andUpdateVolume
function to update/train the surface and volume field separately.
- Adding
-
SampleStorage
:- Adding
ClearSurface
andClearVolume
function to clear the surface and volume samples separately. This allows to wait until a specific number of samples is collected for the surface or volume cache before updating/fitting theField
.
- Adding
-
-
Deactivating/removing
OMP
threading support since it would still have a dependency onTBB
-
Bugfixes:
- Fixing bug causing crash during
Field::Update
when in previous iterations no volume or surface samples were present.
- Fixing bug causing crash during
- Bugfixes:
- Fixing bug introduced in
0.4.0
when usingApplySingleLobeHenyeyGreensteinProduct()
for VMM-based representations
- Fixing bug introduced in
-
Performance:
- Optimized KNN lookup of guiding caches (x3 speed-up).
- Optimized Cosine product for VMM based representations.
-
Dependencies:
- Removed the Embree library dependency for KNN lookups in favour of the header-only library nanoflann.
-
Adding ARM Neon support (e.g., Apple M1).
-
Fixing memory alignment bug for higher SIMD widths.
-
PathSegmentStorage
:- Fixing bug when multiple refracted/reflected events hit a distant source (i.e., environment map) by clamping to a max distance.
- Adding
GetMaxDistance
andSetMaxDistance
methods. - Adding
GetNumSegments
andGetNumSamples
methods.
-
Field
:- Stopped tracing a total number of spp statistic since it is not really
useful.
- Removed the
GetTotalSPP
function. - Removed the
numPerPixelSamples
parameter from theUpdate
function.
- Removed the
- Stopped tracing a total number of spp statistic since it is not really
useful.
-
Field
:- Added
Reset()
function to reset a guiding field (e.g., when the lighting or the scene geometry changed)
- Added
-
PathSegmentStorage
:- Fixed bug when using
AddSample()
- Fixed bug when using
-
Added CMake Superbuild script to build Open PGL, including all its dependencies.
The dependencies (e.g., TBB and Embree) are downloaded, built, and installed automatically. -
Added support for different SIMD optimizations (SSE, AVX2, AVX-512). The optimization type can be chosen when initializing the
Device
. -
Added support for directional quadtrees for the directional representation.
-
PathSegmentStorage
:- Added debug function
CalculatePixelEstimate
to validate if the stored path segment information represents the sampling behavior of the render (i.e., the resulting RGB value should match the pixel value the renderer adds to the framebuffer)
- Added debug function
-
SurfaceSamplingDistribution
:- Added support for guiding based on the product of a normal-oriented
cosine lobe and the incident radiance distribution:
(ApplyCosineProduct)
This feature is only supported for VMM-based directional distributions. Support can be checked withSupportsApplyCosineProduct()
.
- Added support for guiding based on the product of a normal-oriented
cosine lobe and the incident radiance distribution:
-
VolumeSamplingDistribution
:- Added support for guiding based on the product of a single lobe
HG phase function and the incident radiance distribution:
ApplySingleLobeHenyeyGreensteinProduct()
This feature is only supported for VMM-based directional distributions. Support can be checked withSupportsApplySingleLobeHenyeyGreensteinProduct()
.
- Added support for guiding based on the product of a single lobe
HG phase function and the incident radiance distribution:
-
Initial release of Open PGL Features:
- Incremental learning/updating of a 5D spatio-directional radiance field
from radiance samples (see
Field
). - Directional representation based on (parallax-aware) von Mises-Fisher mixtures.
PathSegmentStorage
is a utility class to help keep track of all path segment information and generate radiance samples when a path/random walk is finished/terminated.- Support for guided importance sampling of directions on surfaces (see
SurfaceSamplingDistribution
) and inside volumes (seeVolumeSamplingDistribution
)
- Incremental learning/updating of a 5D spatio-directional radiance field
from radiance samples (see
-
Added C-API and C++-API headers
- C-API:
#include <openpgl/openpgl.h>
- C++-API:
#include <openpgl/cpp/OpenPGL.h>
and the namespaceopenpgl::cpp::
- C-API: