@@ -307,20 +307,60 @@ struct Unidirectional
307307 return Li;
308308 }
309309
310- void generateCascades (int32_t2 coords, uint32_t numSamples, uint32_t depth, NBL_CONST_REF_ARG (scene_type) scene)
310+ struct RWMCCascadeSettings
311311 {
312- measure_type Li = (measure_type)0.0 ;
313- scalar_type meanLumaSq = 0.0 ;
312+ uint32_t size;
313+ uint32_t start;
314+ uint32_t base;
315+ };
316+
317+ // tmp
318+ float calculateLumaRec709 (float32_t4 color)
319+ {
320+ return 0.2126 * color.r + 0.7152 * color.g + 0.0722 * color.b;
321+ }
322+
323+ void generateCascade (int32_t2 coords, uint32_t numSamples, uint32_t depth, NBL_CONST_REF_ARG (RWMCCascadeSettings) cascadeSettings, NBL_CONST_REF_ARG (scene_type) scene)
324+ {
325+ float lowerScale = cascadeSettings.start;
326+ float upperScale = lowerScale * cascadeSettings.base;
327+
328+ // most of this code is stolen from https://cg.ivd.kit.edu/publications/2018/rwmc/tool/split.cpp
314329 for (uint32_t i = 0 ; i < numSamples; i++)
315330 {
316- measure_type accumulation = getSingleSampleMeasure (i, depth, scene);
317- scalar_type rcpSampleSize = 1.0 / (i + 1 );
318- Li += (accumulation - Li) * rcpSampleSize;
331+ const float luma = getLuma (accumulation);
332+ //const float luma = calculateLumaRec709(float32_t4(accumulation, 1.0f));
333+
334+ uint32_t lowerCascadeIndex = 0u;
335+ while (!(luma < upperScale) && lowerCascadeIndex < cascadeSettings.size - 2 )
336+ {
337+ lowerScale = upperScale;
338+ upperScale *= cascadeSettings.base;
339+ ++lowerCascadeIndex;
340+ }
341+
342+ float lowerCascadeLevelWeight;
343+ float higherCascadeLevelWeight;
344+
345+ if (luma <= lowerScale)
346+ lowerCascadeLevelWeight = 1.0f ;
347+ else if (luma < upperScale)
348+ lowerCascadeLevelWeight = max (0.0f , (lowerScale / luma - lowerScale / upperScale) / (1.0f - lowerScale / upperScale));
349+ else // Inf, NaN ...
350+ lowerCascadeLevelWeight = 0.0f ;
351+
352+ if (luma < upperScale)
353+ higherCascadeLevelWeight = max (0.0f , 1.0f - lowerCascadeLevelWeight);
354+ else
355+ higherCascadeLevelWeight = upperScale / luma;
356+
357+ cascade[uint3 (coords.x, coords.y, lowerCascadeIndex)] = float32_t4 (accumulation * lowerCascadeLevelWeight, 1.0f );
358+ cascade[uint3 (coords.x, coords.y, lowerCascadeIndex + 1u)] = float32_t4 (accumulation * higherCascadeLevelWeight, 1.0f );
319359 }
320360
321- cascade[uint3 (coords.x, coords.y, 0 )] = float4 (Li.r, 0.0f , 0.0f , 0.0f );
322- cascade[uint3 (coords.x, coords.y, 1 )] = float4 (0.0f , Li.g, 0.0f , 0.0f );
323- cascade[uint3 (coords.x, coords.y, 2 )] = float4 (0.0f , 0.0f , Li.b, 0.0f );
361+ cascade[uint3 (coords.x, coords.y, 0 )] = float32_t4 (Li.r, 0.0f , 0.0f , 0.0f );
362+ cascade[uint3 (coords.x, coords.y, 1 )] = float32_t4 (0.0f , Li.g, 0.0f , 0.0f );
363+ cascade[uint3 (coords.x, coords.y, 2 )] = float32_t4 (0.0f , 0.0f , Li.b, 0.0f );
324364 }
325365
326366 NBL_CONSTEXPR_STATIC_INLINE uint32_t MAX_DEPTH_LOG2 = 4u;
0 commit comments