@@ -89,7 +89,7 @@ Renderer::Renderer(IVideoDriver* _driver, IAssetManager* _assetManager, scene::I
89
89
}
90
90
{
91
91
#ifndef DISABLE_NEE
92
- constexpr auto additionalGlobalDescriptorCount = 7u ;
92
+ constexpr auto additionalGlobalDescriptorCount = 6u ;
93
93
#else
94
94
constexpr auto additionalGlobalDescriptorCount = 4u ;
95
95
#endif
@@ -410,7 +410,6 @@ Renderer::InitializationData Renderer::initSceneObjects(const SAssetBundle& mesh
410
410
continue ;
411
411
412
412
retval.lights .emplace_back (std::move (newLight));
413
- retval.lightRadiances .push_back (emitter.area .radiance );
414
413
retval.lightPDF .push_back (weight);
415
414
}
416
415
}
@@ -564,34 +563,24 @@ void Renderer::finalizeScene(Renderer::InitializationData& initData)
564
563
auto inPDF = initData.lightPDF .begin ();
565
564
double partialSum = *inPDF;
566
565
567
- auto radianceIn = initData.lightRadiances .begin ();
568
- core::vector<uint64_t > compressedRadiance (m_staticViewData.lightCount ,0ull );
569
- auto radianceOut = compressedRadiance.begin ();
570
- auto divideRadianceByPDF = [UINT_MAX_DOUBLE,weightSumRcp,&partialSum,&outCDF,&radianceIn,&radianceOut](uint32_t prevCDF) -> void
566
+ auto computeCDF = [UINT_MAX_DOUBLE,weightSumRcp,&partialSum,&outCDF](uint32_t prevCDF) -> void
571
567
{
572
- double inv_prob = NAN;
573
568
const double exactCDF = weightSumRcp*partialSum+double (FLT_MIN);
574
569
if (exactCDF<UINT_MAX_DOUBLE)
575
- {
576
- uint32_t thisCDF = *outCDF = static_cast <uint32_t >(exactCDF);
577
- inv_prob = UINT_MAX_DOUBLE/double (thisCDF-prevCDF);
578
- }
570
+ *outCDF = static_cast <uint32_t >(exactCDF);
579
571
else
580
572
{
581
573
assert (exactCDF<UINT_MAX_DOUBLE+1.0 );
582
574
*outCDF = 0xdeadbeefu ;
583
- inv_prob = 1.0 /(1.0 -double (prevCDF)/UINT_MAX_DOUBLE);
584
575
}
585
- auto tmp = (radianceIn++)->operator *(inv_prob);
586
- *(radianceOut++) = core::rgb32f_to_rgb19e7 (tmp.pointer );
587
576
};
588
577
589
- divideRadianceByPDF (0u );
578
+ computeCDF (0u );
590
579
for (auto prevCDF=outCDF++; outCDF!=initData.lightCDF .end (); prevCDF=outCDF++)
591
580
{
592
581
partialSum += double (*(++inPDF));
593
582
594
- divideRadianceByPDF (*prevCDF);
583
+ computeCDF (*prevCDF);
595
584
}
596
585
}
597
586
@@ -819,7 +808,7 @@ void Renderer::init(const SAssetBundle& meshes, core::smart_refctd_ptr<ICPUBuffe
819
808
820
809
//
821
810
constexpr uint32_t descriptorUpdates = 5 ;
822
- constexpr uint32_t descriptorUpdateCounts[descriptorUpdates] = {3u ,9u ,2u ,2u ,3u };
811
+ constexpr uint32_t descriptorUpdateCounts[descriptorUpdates] = {2u ,9u ,2u ,2u ,3u };
823
812
constexpr uint32_t descriptorUpdateMaxCount = *std::max_element (descriptorUpdateCounts,descriptorUpdateCounts+descriptorUpdates);
824
813
825
814
//
@@ -879,9 +868,8 @@ void Renderer::init(const SAssetBundle& meshes, core::smart_refctd_ptr<ICPUBuffe
879
868
{
880
869
createFilledBufferAndSetUpInfoFromVector (infos+0 ,initData.lightCDF );
881
870
createFilledBufferAndSetUpInfoFromVector (infos+1 ,initData.lights );
882
- createFilledBufferAndSetUpInfoFromVector (infos+2 ,initData.lightRadiances );
883
871
884
- setDstSetAndDescTypesOnWrites (m_additionalGlobalDS.get (),writes,infos,{EDT_STORAGE_BUFFER,EDT_STORAGE_BUFFER,EDT_STORAGE_BUFFER },4u );
872
+ setDstSetAndDescTypesOnWrites (m_additionalGlobalDS.get (),writes,infos,{EDT_STORAGE_BUFFER,EDT_STORAGE_BUFFER},4u );
885
873
}
886
874
m_driver->updateDescriptorSets (descriptorUpdateCounts[0 ],writes,0u ,nullptr );
887
875
#endif
0 commit comments