Skip to content

Commit bf74c4d

Browse files
[vsp] Considering the ZeroValueSamples when estimating the VSP
1 parent e7e4506 commit bf74c4d

9 files changed

+65
-28
lines changed

Diff for: openpgl/data/PathSegmentDataStorage.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -403,7 +403,7 @@ struct PathSegmentDataStorage
403403
pglDirection = {dirOut[0], dirOut[1], dirOut[2]};
404404
isd.directionOut = pglDirection;
405405
#endif
406-
isd.volume = insideVolume;
406+
isd.flags = flags;
407407
#if defined(OPENPGL_PATHSEGMENT_STORAGE_USE_ARRAY)
408408
if (m_zero_value_sample_idx + 1 <= m_max_zero_value_sample_size)
409409
{

Diff for: openpgl/data/SampleData.h

+10
Original file line numberDiff line numberDiff line change
@@ -192,6 +192,16 @@ inline bool ZeroValueSampleDataLess(const PGLZeroValueSampleData &compA, const P
192192
)))));
193193
}
194194

195+
inline bool isInsideVolume(const PGLZeroValueSampleData &zvsd)
196+
{
197+
return (zvsd.flags & EInsideVolume);
198+
}
199+
200+
inline bool isNextEventVolume(const PGLZeroValueSampleData &zvsd)
201+
{
202+
return (zvsd.flags & ENextEventVolume);
203+
}
204+
195205
inline SampleData *LoadSampleData(const std::string fileName, size_t &numData)
196206
{
197207
std::ifstream file;

Diff for: openpgl/data/SampleDataStorage.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ struct SampleDataStorage
104104

105105
inline void addZeroValueSample(const ZeroValueSampleData &sample)
106106
{
107-
if (sample.volume)
107+
if (isInsideVolume(sample))
108108
{
109109
m_volumeContainer.zeroValueSamples.push_back(sample);
110110
}

Diff for: openpgl/directional/dqt/DQTFactory.h

+3-1
Original file line numberDiff line numberDiff line change
@@ -180,7 +180,9 @@ class DirectionalQuadtreeFactory
180180
const SampleStatistics &sampleStatistics) const
181181
{}
182182

183-
void updateVolumeScatterProbability(Distribution &dist, Statistics &stats, const SampleData *samples, const size_t numSamples, const bool varianceBased) const {}
183+
void updateVolumeScatterProbability(Distribution &dist, Statistics &stats, const SampleData *samples, const size_t numSamples, const ZeroValueSampleData *zeroValueSamples,
184+
const size_t numZeroValueSamples, const bool varianceBased) const
185+
{}
184186

185187
void fit(Distribution &dist, Statistics &stats, const SampleData *samples, const size_t numSamples, const Configuration &cfg, FittingStatistics &fitStats)
186188
{

Diff for: openpgl/directional/vmm/AdaptiveSplitandMergeFactory.h

+6-3
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,8 @@ struct AdaptiveSplitAndMergeFactory
126126

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

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

131132
std::string toString() const
132133
{
@@ -470,10 +471,12 @@ void AdaptiveSplitAndMergeFactory<TVMMDistribution>::updateFluenceEstimate(VMM &
470471
}
471472

472473
template <class TVMMDistribution>
473-
void AdaptiveSplitAndMergeFactory<TVMMDistribution>::updateVolumeScatterProbability(VMM &vmm, Statistics &stats, const SampleData *samples, const size_t numSamples, const bool varianceBased) const
474+
void AdaptiveSplitAndMergeFactory<TVMMDistribution>::updateVolumeScatterProbability(VMM &vmm, Statistics &stats, const SampleData *samples, const size_t numSamples,
475+
const ZeroValueSampleData *zeroValueSamples, const size_t numZeroValueSamples,
476+
const bool varianceBased) const
474477
{
475478
WeightedEMFactory factory = WeightedEMFactory();
476-
factory.updateVolumeScatterProbability(vmm, stats.sufficientStatistics, samples, numSamples, varianceBased);
479+
factory.updateVolumeScatterProbability(vmm, stats.sufficientStatistics, samples, numSamples, zeroValueSamples, numZeroValueSamples, varianceBased);
477480
}
478481

479482
} // namespace openpgl

Diff for: openpgl/directional/vmm/ParallaxAwareVonMisesFisherMixture.h

-1
Original file line numberDiff line numberDiff line change
@@ -422,7 +422,6 @@ void ParallaxAwareVonMisesFisherMixture<VecSize, maxComponents, UseParallaxCompe
422422
const float volumeScatterFirstMomentProbability0 = _volumeScatterProbabilityWeights[tmpIdx0.quot][tmpIdx0.rem];
423423
const float volumeScatterFirstMomentProbability1 = _volumeScatterProbabilityWeights[tmpIdx1.quot][tmpIdx1.rem];
424424

425-
426425
float newVolumeFirstMomentScatterProbability = weight0 * volumeScatterFirstMomentProbability0 + weight1 * volumeScatterFirstMomentProbability1;
427426
newVolumeFirstMomentScatterProbability /= (weight0 + weight1);
428427
_volumeScatterProbabilityWeights[tmpIdx0.quot][tmpIdx0.rem] = newVolumeFirstMomentScatterProbability;

Diff for: openpgl/directional/vmm/ParallaxAwareVonMisesFisherWeightedEMFactory.h

+35-14
Original file line numberDiff line numberDiff line change
@@ -209,7 +209,8 @@ struct ParallaxAwareVonMisesFisherWeightedEMFactory
209209
void updateComponentDistances(VMM &vmm, SufficientStatistics &sufficientStats, const SampleData *samples, const size_t numSamples) const;
210210

211211
#ifdef OPENPGL_VSP_GUIDING
212-
void updateVolumeScatterProbability(VMM &vmm, SufficientStatistics &sufficientStats, const SampleData *samples, const size_t numSamples, const bool varianceBased) const;
212+
void updateVolumeScatterProbability(VMM &vmm, SufficientStatistics &sufficientStats, const SampleData *samples, const size_t numSamples,
213+
const ZeroValueSampleData *zeroValueSamples, const size_t numZeroValueSamples, const bool varianceBased) const;
213214
#endif
214215
private:
215216
void _initUniformDirections();
@@ -1700,11 +1701,12 @@ std::string ParallaxAwareVonMisesFisherWeightedEMFactory<TVMMDistribution>::Part
17001701
#ifdef OPENPGL_VSP_GUIDING
17011702
template <class TVMMDistribution>
17021703
void ParallaxAwareVonMisesFisherWeightedEMFactory<TVMMDistribution>::updateVolumeScatterProbability(VMM &vmm, SufficientStatistics &sufficientStats, const SampleData *samples,
1703-
const size_t numSamples, const bool varianceBased) const
1704+
const size_t numSamples, const ZeroValueSampleData *zeroValueSamples,
1705+
const size_t numZeroValueSamples, const bool varianceBased) const
17041706
{
17051707
// OPENPGL_ASSERT(vmm.isValid());
17061708

1707-
if (numSamples == 0)
1709+
if (numSamples + numZeroValueSamples == 0)
17081710
{
17091711
return;
17101712
}
@@ -1729,7 +1731,7 @@ void ParallaxAwareVonMisesFisherWeightedEMFactory<TVMMDistribution>::updateVolum
17291731
{
17301732
if (isNextEventVolume(samples[n]))
17311733
{
1732-
if(!varianceBased)
1734+
if (!varianceBased)
17331735
{
17341736
sufficientStats.volumeContributionWeights[k] += weight * softAssign.assignments[k];
17351737
OPENPGL_ASSERT(embree::isvalid(sufficientStats.volumeContributionWeights[k]));
@@ -1744,7 +1746,7 @@ void ParallaxAwareVonMisesFisherWeightedEMFactory<TVMMDistribution>::updateVolum
17441746
}
17451747
else
17461748
{
1747-
if(!varianceBased)
1749+
if (!varianceBased)
17481750
{
17491751
sufficientStats.surfaceContributionWeights[k] += weight * softAssign.assignments[k];
17501752
OPENPGL_ASSERT(embree::isvalid(sufficientStats.surfaceContributionWeights[k]));
@@ -1761,6 +1763,29 @@ void ParallaxAwareVonMisesFisherWeightedEMFactory<TVMMDistribution>::updateVolum
17611763
}
17621764
}
17631765

1766+
for (size_t n = 0; n < numZeroValueSamples; n++)
1767+
{
1768+
pgl_vec3f direction = zeroValueSamples[n].direction;
1769+
const Vector3 sampleDirection(direction.x, direction.y, direction.z);
1770+
1771+
if (vmm.softAssignment(sampleDirection, softAssign))
1772+
{
1773+
for (size_t k = 0; k < cnt; k++)
1774+
{
1775+
if (isNextEventVolume(zeroValueSamples[n]))
1776+
{
1777+
sufficientStats.volumeSampleNumberWeights[k] += softAssign.assignments[k];
1778+
OPENPGL_ASSERT(embree::isvalid(sufficientStats.volumeSampleNumberWeights[k]));
1779+
}
1780+
else
1781+
{
1782+
sufficientStats.surfaceSampleNumberWeights[k] += softAssign.assignments[k];
1783+
OPENPGL_ASSERT(embree::isvalid(sufficientStats.surfaceSampleNumberWeights[k]));
1784+
}
1785+
}
1786+
}
1787+
}
1788+
17641789
if (rem > 0)
17651790
{
17661791
for (size_t i = rem; i < VMM::VectorSize; i++)
@@ -1780,16 +1805,12 @@ void ParallaxAwareVonMisesFisherWeightedEMFactory<TVMMDistribution>::updateVolum
17801805
embree::vfloat<VMM::VectorSize> numSurfVolSamples = numVolSamples + numSurfSamples;
17811806
embree::vfloat<VMM::VectorSize> estPVol = select(numSurfVolSamples > FLT_EPSILON, numVolSamples / numSurfVolSamples, zeros);
17821807

1783-
if(!varianceBased)
1808+
if (!varianceBased)
17841809
{
1785-
embree::vfloat<VMM::VectorSize> volumeContributionWeight =
1786-
select(numVolSamples > FLT_EPSILON, sufficientStats.volumeContributionWeights[k] / numVolSamples, zeros);
1787-
embree::vfloat<VMM::VectorSize> surfaceContributionWeight =
1788-
select(numSurfSamples > FLT_EPSILON, sufficientStats.surfaceContributionWeights[k] / numSurfSamples, zeros);
1789-
embree::vfloat<VMM::VectorSize> sumContributionWeight =
1790-
(surfaceContributionWeight * (ones - estPVol)) + (volumeContributionWeight * estPVol);
1791-
vmm._volumeScatterProbabilityWeights[k] =
1792-
select(sumContributionWeight > FLT_EPSILON, (volumeContributionWeight * estPVol) / sumContributionWeight, zeros);
1810+
embree::vfloat<VMM::VectorSize> volumeContributionWeight = select(numVolSamples > FLT_EPSILON, sufficientStats.volumeContributionWeights[k] / numVolSamples, zeros);
1811+
embree::vfloat<VMM::VectorSize> surfaceContributionWeight = select(numSurfSamples > FLT_EPSILON, sufficientStats.surfaceContributionWeights[k] / numSurfSamples, zeros);
1812+
embree::vfloat<VMM::VectorSize> sumContributionWeight = (surfaceContributionWeight * (ones - estPVol)) + (volumeContributionWeight * estPVol);
1813+
vmm._volumeScatterProbabilityWeights[k] = select(sumContributionWeight > FLT_EPSILON, (volumeContributionWeight * estPVol) / sumContributionWeight, zeros);
17931814
}
17941815
else
17951816
{

Diff for: openpgl/field/Field.h

+8-6
Original file line numberDiff line numberDiff line change
@@ -473,9 +473,10 @@ struct Field
473473
regionStorage.second.m_is_end - regionStorage.second.m_is_begin);
474474
#endif
475475
#ifdef OPENPGL_VSP_GUIDING
476-
m_distributionFactory.updateVolumeScatterProbability(regionStorage.first.distribution, regionStorage.first.trainingStatistics,
477-
samples.data() + regionStorage.second.m_begin,
478-
regionStorage.second.m_end - regionStorage.second.m_begin, m_vspVarianceBased);
476+
m_distributionFactory.updateVolumeScatterProbability(
477+
regionStorage.first.distribution, regionStorage.first.trainingStatistics, samples.data() + regionStorage.second.m_begin,
478+
regionStorage.second.m_end - regionStorage.second.m_begin, zeroValueSamples.data() + regionStorage.second.m_is_begin,
479+
regionStorage.second.m_is_end - regionStorage.second.m_is_begin, m_vspVarianceBased);
479480
#endif
480481
// TODO: we should move setting the pivot to the factory
481482
regionStorage.first.distribution._pivotPosition = sampleMean;
@@ -562,9 +563,10 @@ struct Field
562563
regionStorage.second.m_is_end - regionStorage.second.m_is_begin);
563564
#endif
564565
#ifdef OPENPGL_VSP_GUIDING
565-
m_distributionFactory.updateVolumeScatterProbability(regionStorage.first.distribution, regionStorage.first.trainingStatistics,
566-
samples.data() + regionStorage.second.m_begin,
567-
regionStorage.second.m_end - regionStorage.second.m_begin, m_vspVarianceBased);
566+
m_distributionFactory.updateVolumeScatterProbability(
567+
regionStorage.first.distribution, regionStorage.first.trainingStatistics, samples.data() + regionStorage.second.m_begin,
568+
regionStorage.second.m_end - regionStorage.second.m_begin, zeroValueSamples.data() + regionStorage.second.m_is_begin,
569+
regionStorage.second.m_is_end - regionStorage.second.m_is_begin, m_vspVarianceBased);
568570
#endif
569571
regionStorage.first.valid = regionStorage.first.isValid();
570572
#ifdef OPENPGL_DEBUG_MODE

Diff for: openpgl/include/openpgl/data.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ struct PGLZeroValueSampleData
7777
pgl_direction directionOut;
7878
#endif
7979
/// if the position is inside a volume
80-
bool volume;
80+
uint32_t flags;
8181
};
8282

8383
/**

0 commit comments

Comments
 (0)