Skip to content

WIP: Volume Scattering Probability Guiding #21

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 6 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
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
1 change: 1 addition & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@ option(OPENPGL_BUILD_CHECK_TOOL "Build check tool application." OFF)
try_compile(COMPILER_SUPPORTS_ARM_NEON "${CMAKE_BINARY_DIR}" "${PROJECT_SOURCE_DIR}/cmake/check_arm_neon.cpp")

OPTION(OPENPGL_EF_RADIANCE_CACHES "Enables experimental feature (ir)radiance caches." OFF)
OPTION(OPENPGL_EF_VSP_GUIDING "Enables experimental feature volume scatter probability guiding." OFF)
OPTION(OPENPGL_EF_IMAGE_SPACE_GUIDING_BUFFER "Enables experimental feature ImageSpaceGuidignBuffer." OFF)

OPTION(OPENPGL_DIRECTION_COMPRESSION "Using 32-Bit compression to represent directions." OFF)
Expand Down
10 changes: 10 additions & 0 deletions openpgl/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,11 @@ if(OPENPGL_EF_RADIANCE_CACHES)
target_compile_definitions(${PROJECT_NAME} PRIVATE OPENPGL_RADIANCE_CACHES)
endif()

if(OPENPGL_EF_VSP_GUIDING)
target_compile_definitions(${PROJECT_NAME} PRIVATE OPENPGL_VSP_GUIDING)
endif()


if(OPENPGL_EF_IMAGE_SPACE_GUIDING_BUFFER)
target_compile_definitions(${PROJECT_NAME} PRIVATE OPENPGL_IMAGE_SPACE_GUIDING_BUFFER)
endif()
Expand Down Expand Up @@ -235,6 +240,11 @@ if(OPENPGL_EF_RADIANCE_CACHES)
set(OPENPGL_RADIANCE_CACHES ON)
endif()

if(OPENPGL_EF_VSP_GUIDING)
set(OPENPGL_VSP_GUIDING ON)
endif()


if(OPENPGL_EF_IMAGE_SPACE_GUIDING_BUFFER)
set(OPENPGL_IMAGE_SPACE_GUIDING_BUFFER ON)
endif()
Expand Down
30 changes: 27 additions & 3 deletions openpgl/api/api.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -602,6 +602,14 @@ extern "C" OPENPGL_DLLEXPORT uint32_t pglSurfaceSamplingDistributionGetId(PGLSur
return gSurfaceSamplingDistribution->getId();
}

#ifdef OPENPGL_VSP_GUIDING
extern "C" OPENPGL_DLLEXPORT float pglSurfaceSamplingDistributionVolumeScatterProbability(PGLSurfaceSamplingDistribution surfaceSamplingDistribution, pgl_vec3f direction)
{
ISurfaceSamplingDistribution *gSurfaceSamplingDistribution = (ISurfaceSamplingDistribution *)surfaceSamplingDistribution;
return gSurfaceSamplingDistribution->volumeScatterProbability(openpgl::Vector3(direction.x, direction.y, direction.z));
}
#endif

extern "C" OPENPGL_DLLEXPORT bool pglSurfaceSamplingDistributionValidate(PGLSurfaceSamplingDistribution surfaceSamplingDistribution)
{
ISurfaceSamplingDistribution *gSurfaceSamplingDistribution = (ISurfaceSamplingDistribution *)surfaceSamplingDistribution;
Expand Down Expand Up @@ -700,6 +708,14 @@ extern "C" OPENPGL_DLLEXPORT uint32_t pglVolumeSamplingDistributionGetId(PGLVolu
return gVolumeSamplingDistribution->getId();
}

#ifdef OPENPGL_VSP_GUIDING
extern "C" OPENPGL_DLLEXPORT float pglVolumeSamplingDistributionVolumeScatterProbability(PGLVolumeSamplingDistribution volumeSamplingDistribution, pgl_vec3f direction)
{
IVolumeSamplingDistribution *gVolumeSamplingDistribution = (IVolumeSamplingDistribution *)volumeSamplingDistribution;
return gVolumeSamplingDistribution->volumeScatterProbability(openpgl::Vector3(direction.x, direction.y, direction.z));
}
#endif

extern "C" OPENPGL_DLLEXPORT bool pglVolumeSamplingDistributionValidate(PGLVolumeSamplingDistribution volumeSamplingDistribution)
{
IVolumeSamplingDistribution *gVolumeSamplingDistribution = (IVolumeSamplingDistribution *)volumeSamplingDistribution;
Expand Down Expand Up @@ -867,9 +883,9 @@ extern "C" OPENPGL_DLLEXPORT void pglReleaseString(PGLString str)
// ImageSpaceGuidingBuffer ///////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////

extern "C" OPENPGL_DLLEXPORT PGLImageSpaceGuidingBuffer pglFieldNewImageSpaceGuidingBuffer(const pgl_point2i resolution)
extern "C" OPENPGL_DLLEXPORT PGLImageSpaceGuidingBuffer pglFieldNewImageSpaceGuidingBuffer(const PGLImageSpaceGuidingBufferConfig cfg)
{
return (PGLImageSpaceGuidingBuffer) new openpgl::ImageSpaceGuidingBuffer(resolution, false);
return (PGLImageSpaceGuidingBuffer) new openpgl::ImageSpaceGuidingBuffer(cfg);
}

extern "C" OPENPGL_DLLEXPORT PGLImageSpaceGuidingBuffer pglFieldNewImageSpaceGuidingBufferFromFile(const char *fileName)
Expand Down Expand Up @@ -901,12 +917,20 @@ extern "C" OPENPGL_DLLEXPORT void pglImageSpaceGuidingBufferStore(PGLImageSpaceG
gImageSpaceGuidingBuffer->store(fileName);
}

extern "C" OPENPGL_DLLEXPORT pgl_vec3f pglImageSpaceGuidingBufferGetPixelContributionEstimate(PGLImageSpaceGuidingBuffer imageSpaceGuidingBuffer, const pgl_point2i pixel)
extern "C" OPENPGL_DLLEXPORT pgl_vec3f pglImageSpaceGuidingBufferGetContributionEstimate(PGLImageSpaceGuidingBuffer imageSpaceGuidingBuffer, const pgl_point2i pixel)
{
auto *gImageSpaceGuidingBuffer = (openpgl::ImageSpaceGuidingBuffer *)imageSpaceGuidingBuffer;
return gImageSpaceGuidingBuffer->getContributionEstimate(pixel);
}

#if defined(OPENPGL_VSP_GUIDING)
extern "C" OPENPGL_DLLEXPORT float pglImageSpaceGuidingBufferGetVolumeScatterProbabilityEstimate(PGLImageSpaceGuidingBuffer imageSpaceGuidingBuffer, const pgl_point2i pixel)
{
auto *gImageSpaceGuidingBuffer = (openpgl::ImageSpaceGuidingBuffer *)imageSpaceGuidingBuffer;
return gImageSpaceGuidingBuffer->getVolumeScatterProbabilityEstimate(pixel);
}
#endif

extern "C" OPENPGL_DLLEXPORT bool pglImageSpaceGuidingBufferIsReady(PGLImageSpaceGuidingBuffer imageSpaceGuidingBuffer)
{
auto *gImageSpaceGuidingBuffer = (openpgl::ImageSpaceGuidingBuffer *)imageSpaceGuidingBuffer;
Expand Down
7 changes: 6 additions & 1 deletion openpgl/data/PathSegmentDataStorage.h
Original file line number Diff line number Diff line change
Expand Up @@ -260,6 +260,11 @@ struct PathSegmentDataStorage
flags |= SampleData::EInsideVolume;
}

if (m_segmentStorage[i + 1].volumeScatter)
{
flags |= SampleData::ENextEventVolume;
}

bool directLightSample = false;
#ifdef OPENPGL_RADIANCE_CACHES
float misWeight = 1.f;
Expand Down Expand Up @@ -398,7 +403,7 @@ struct PathSegmentDataStorage
pglDirection = {dirOut[0], dirOut[1], dirOut[2]};
isd.directionOut = pglDirection;
#endif
isd.volume = insideVolume;
isd.flags = flags;
#if defined(OPENPGL_PATHSEGMENT_STORAGE_USE_ARRAY)
if (m_zero_value_sample_idx + 1 <= m_max_zero_value_sample_size)
{
Expand Down
12 changes: 6 additions & 6 deletions openpgl/data/Range.h
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ struct Range
size_t m_begin{0};
size_t m_end{0};

#ifdef OPENPGL_RADIANCE_CACHES
#if defined(OPENPGL_RADIANCE_CACHES) || defined(OPENPGL_VSP_GUIDING)
size_t m_is_begin{0};
size_t m_is_end{0};
#endif
Expand All @@ -25,7 +25,7 @@ struct Range
OPENPGL_ASSERT(int(m_end) - int(m_begin) >= 0);
return m_end - m_begin;
}
#ifdef OPENPGL_RADIANCE_CACHES
#if defined(OPENPGL_RADIANCE_CACHES) || defined(OPENPGL_VSP_GUIDING)
inline size_t sizeZeroValueSamples() const
{
OPENPGL_ASSERT(int(m_is_end) - int(m_is_begin) >= 0);
Expand All @@ -36,7 +36,7 @@ struct Range
{
m_begin = 0;
m_end = 0;
#ifdef OPENPGL_RADIANCE_CACHES
#if defined(OPENPGL_RADIANCE_CACHES) || defined(OPENPGL_VSP_GUIDING)
m_is_begin = 0;
m_is_end = 0;
#endif
Expand All @@ -46,7 +46,7 @@ struct Range
{
os.write(reinterpret_cast<const char *>(&m_begin), sizeof(m_begin));
os.write(reinterpret_cast<const char *>(&m_end), sizeof(m_end));
#ifdef OPENPGL_RADIANCE_CACHES
#if defined(OPENPGL_RADIANCE_CACHES) || defined(OPENPGL_VSP_GUIDING)
os.write(reinterpret_cast<const char *>(&m_is_begin), sizeof(m_is_begin));
os.write(reinterpret_cast<const char *>(&m_is_end), sizeof(m_is_end));
#endif
Expand All @@ -56,7 +56,7 @@ struct Range
{
is.read(reinterpret_cast<char *>(&m_begin), sizeof(m_begin));
is.read(reinterpret_cast<char *>(&m_end), sizeof(m_end));
#ifdef OPENPGL_RADIANCE_CACHES
#if defined(OPENPGL_RADIANCE_CACHES) || defined(OPENPGL_VSP_GUIDING)
is.read(reinterpret_cast<char *>(&m_is_begin), sizeof(m_is_begin));
is.read(reinterpret_cast<char *>(&m_is_end), sizeof(m_is_end));
#endif
Expand All @@ -66,7 +66,7 @@ struct Range
{
bool equal = true;
if (m_begin != b.m_begin || m_end != b.m_end
#ifdef OPENPGL_RADIANCE_CACHES
#if defined(OPENPGL_RADIANCE_CACHES) || defined(OPENPGL_VSP_GUIDING)
|| m_is_begin != b.m_is_begin || m_is_end != b.m_is_end
#endif
)
Expand Down
18 changes: 17 additions & 1 deletion openpgl/data/SampleData.h
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,8 @@ typedef PGLSampleData SampleData;
enum SampleData_Flags
{
EInsideVolume = 1 << 0, // point does not represent any real scene intersection point
EDirectLight = 1 << 1 // if the samples represents direct light from a light source
EDirectLight = 1 << 1, // if the samples represents direct light from a light source
ENextEventVolume = 1 << 2
};

inline bool isValid(const SampleData &dsd)
Expand Down Expand Up @@ -86,6 +87,11 @@ inline bool isDirectLight(const SampleData &sd)
return (sd.flags & EDirectLight);
}

inline bool isNextEventVolume(const SampleData &sd)
{
return (sd.flags & ENextEventVolume);
}

inline std::string toString(const SampleData &sd)
{
std::stringstream ss;
Expand Down Expand Up @@ -186,6 +192,16 @@ inline bool ZeroValueSampleDataLess(const PGLZeroValueSampleData &compA, const P
)))));
}

inline bool isInsideVolume(const PGLZeroValueSampleData &zvsd)
{
return (zvsd.flags & EInsideVolume);
}

inline bool isNextEventVolume(const PGLZeroValueSampleData &zvsd)
{
return (zvsd.flags & ENextEventVolume);
}

inline SampleData *LoadSampleData(const std::string fileName, size_t &numData)
{
std::ifstream file;
Expand Down
2 changes: 1 addition & 1 deletion openpgl/data/SampleDataStorage.h
Original file line number Diff line number Diff line change
Expand Up @@ -104,7 +104,7 @@ struct SampleDataStorage

inline void addZeroValueSample(const ZeroValueSampleData &sample)
{
if (sample.volume)
if (isInsideVolume(sample))
{
m_volumeContainer.zeroValueSamples.push_back(sample);
}
Expand Down
9 changes: 9 additions & 0 deletions openpgl/device/Device.h
Original file line number Diff line number Diff line change
Expand Up @@ -99,6 +99,9 @@ struct Device : public IDevice
typename GuidingField::Settings gFieldSettings;
gFieldSettings.settings.decayOnSpatialSplit = 0.25f;
gFieldSettings.settings.deterministic = args.deterministic;
#ifdef OPENPGL_VSP_GUIDING
gFieldSettings.settings.varianceBasedVSP = args.varianceBasedVSP;
#endif
gFieldSettings.debugSettings.fitRegions = args.debugArguments.fitRegions;

PGLKDTreeArguments *spatialSturctureArguments = (PGLKDTreeArguments *)args.spatialSturctureArguments;
Expand Down Expand Up @@ -148,6 +151,9 @@ struct Device : public IDevice
typename GuidingField::Settings gFieldSettings;
gFieldSettings.settings.decayOnSpatialSplit = 0.25f;
gFieldSettings.settings.deterministic = args.deterministic;
#ifdef OPENPGL_VSP_GUIDING
gFieldSettings.settings.varianceBasedVSP = args.varianceBasedVSP;
#endif
gFieldSettings.debugSettings.fitRegions = args.debugArguments.fitRegions;

PGLKDTreeArguments *spatialSturctureArguments = (PGLKDTreeArguments *)args.spatialSturctureArguments;
Expand Down Expand Up @@ -197,6 +203,9 @@ struct Device : public IDevice
typename GuidingField::Settings gFieldSettings;
gFieldSettings.settings.decayOnSpatialSplit = 0.25f;
gFieldSettings.settings.deterministic = args.deterministic;
#ifdef OPENPGL_VSP_GUIDING
gFieldSettings.settings.varianceBasedVSP = args.varianceBasedVSP;
#endif
gFieldSettings.debugSettings.fitRegions = args.debugArguments.fitRegions;

PGLKDTreeArguments *spatialSturctureArguments = (PGLKDTreeArguments *)args.spatialSturctureArguments;
Expand Down
4 changes: 4 additions & 0 deletions openpgl/directional/ISurfaceSamplingDistribution.h
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,10 @@ struct ISurfaceSamplingDistribution

virtual const IRegion *getRegion() const = 0;

#ifdef OPENPGL_VSP_GUIDING
virtual float volumeScatterProbability(Vector3 dir) const = 0;
#endif

protected:
// const IRegion* m_region {nullptr};
uint32_t m_id{0};
Expand Down
4 changes: 4 additions & 0 deletions openpgl/directional/IVolumeSamplingDistribution.h
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,10 @@ struct IVolumeSamplingDistribution

virtual const IRegion *getRegion() const = 0;

#ifdef OPENPGL_VSP_GUIDING
virtual float volumeScatterProbability(Vector3 dir) const = 0;
#endif

protected:
// const IRegion* m_region {nullptr};
uint32_t m_id{0};
Expand Down
9 changes: 9 additions & 0 deletions openpgl/directional/dqt/DQTFactory.h
Original file line number Diff line number Diff line change
Expand Up @@ -154,6 +154,11 @@ class DirectionalQuadtreeFactory
is.read(reinterpret_cast<char *>(nodes.data()), size * sizeof(nodes[0]));
};

float getNumSamples() const
{
return numSamples;
};

// TODO: Needs to be implmented
bool operator==(const Statistics &b) const
{
Expand All @@ -175,6 +180,10 @@ class DirectionalQuadtreeFactory
const SampleStatistics &sampleStatistics) const
{}

void updateVolumeScatterProbability(Distribution &dist, Statistics &stats, const SampleData *samples, const size_t numSamples, const ZeroValueSampleData *zeroValueSamples,
const size_t numZeroValueSamples, const bool varianceBased) const
{}

void fit(Distribution &dist, Statistics &stats, const SampleData *samples, const size_t numSamples, const Configuration &cfg, FittingStatistics &fitStats)
{
for (uint32_t i = 0; i < 5; i++)
Expand Down
7 changes: 7 additions & 0 deletions openpgl/directional/dqt/DQTSurfaceSamplingDistribution.h
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,13 @@ struct DQTSurfaceSamplingDistribution : public ISurfaceSamplingDistribution
m_region = region;
}

#ifdef OPENPGL_VSP_GUIDING
float volumeScatterProbability(Vector3 dir) const override
{
return 0.f;
}
#endif

private:
TDirectionalQuadtree distribution;
const IRegion *m_region{nullptr};
Expand Down
7 changes: 7 additions & 0 deletions openpgl/directional/dqt/DQTVolumeSamplingDistribution.h
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,13 @@ struct DQTVolumeSamplingDistribution : public IVolumeSamplingDistribution
m_region = region;
}

#ifdef OPENPGL_VSP_GUIDING
float volumeScatterProbability(Vector3 dir) const override
{
return 0.f;
}
#endif

private:
TDirectionalQuadtree distribution;
const IRegion *m_region{nullptr};
Expand Down
16 changes: 16 additions & 0 deletions openpgl/directional/vmm/AdaptiveSplitandMergeFactory.h
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,10 @@ struct AdaptiveSplitAndMergeFactory
return sufficientStatistics.getNumComponents();
}

inline float getNumSamples() const
{
return sufficientStatistics.getNumSamples();
};
std::string toString() const;

bool operator==(const Statistics &b) const;
Expand Down Expand Up @@ -122,6 +126,9 @@ struct AdaptiveSplitAndMergeFactory

void updateFluenceEstimate(VMM &vmm, const SampleData *samples, const size_t numSamples, const size_t numZeroValueSamples, const SampleStatistics &sampleStatistics) const;

void updateVolumeScatterProbability(VMM &vmm, Statistics &stats, const SampleData *samples, const size_t numSamples, const ZeroValueSampleData *zeroValueSamples,
const size_t numZeroValueSamples, const bool varianceBased) const;

std::string toString() const
{
std::ostringstream oss;
Expand Down Expand Up @@ -463,4 +470,13 @@ void AdaptiveSplitAndMergeFactory<TVMMDistribution>::updateFluenceEstimate(VMM &
factory.updateFluenceEstimate(vmm, samples, numSamples, numZeroValueSamples, sampleStatistics);
}

template <class TVMMDistribution>
void AdaptiveSplitAndMergeFactory<TVMMDistribution>::updateVolumeScatterProbability(VMM &vmm, Statistics &stats, const SampleData *samples, const size_t numSamples,
const ZeroValueSampleData *zeroValueSamples, const size_t numZeroValueSamples,
const bool varianceBased) const
{
WeightedEMFactory factory = WeightedEMFactory();
factory.updateVolumeScatterProbability(vmm, stats.sufficientStatistics, samples, numSamples, zeroValueSamples, numZeroValueSamples, varianceBased);
}

} // namespace openpgl
Loading
Loading