Skip to content

Commit 2107be7

Browse files
committed
Implemented splatting
1 parent 3d206fd commit 2107be7

File tree

3 files changed

+65
-21
lines changed

3 files changed

+65
-21
lines changed

31_HLSLPathTracer/app_resources/hlsl/pathtracer.hlsl

Lines changed: 49 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -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;

31_HLSLPathTracer/app_resources/hlsl/render.comp.hlsl

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -226,7 +226,12 @@ void main(uint32_t3 threadID : SV_DispatchThreadID)
226226
}
227227
else
228228
{
229-
pathtracer.generateCascades(coords, pc.sampleCount, pc.depth, scene);
229+
pathtracer_type::RWMCCascadeSettings cascadeSettings;
230+
cascadeSettings.size = 6u;
231+
cascadeSettings.start = 1u;
232+
cascadeSettings.base = 8u;
233+
234+
pathtracer.generateCascade(coords, pc.sampleCount, pc.depth, cascadeSettings, scene);
230235
}
231236

232237
#ifdef PERSISTENT_WORKGROUPS

31_HLSLPathTracer/app_resources/hlsl/reweighting.hlsl

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -17,22 +17,21 @@ int32_t2 getCoordinates()
1717
return int32_t2(glsl::gl_GlobalInvocationID().x % width, glsl::gl_GlobalInvocationID().x / width);
1818
}
1919

20-
float calculateLumaRec709(float32_t4 color)
21-
{
22-
return 0.2126 * color.r + 0.7152 * color.g + 0.0722 * color.b;
23-
}
24-
2520
[numthreads(WorkgroupSize, 1, 1)]
2621
void main(uint32_t3 threadID : SV_DispatchThreadID)
2722
{
2823
const int32_t2 coords = getCoordinates();
2924

30-
float r = cascade.Load(uint3(coords, 0)).r;
31-
float g = cascade.Load(uint3(coords, 1)).g;
32-
float b = cascade.Load(uint3(coords, 2)).b;
33-
float32_t4 color = float32_t4(r, g, b, 1.0f);
34-
float luma = calculateLumaRec709(color);
35-
float32_t4 output = float32_t4(luma, luma, luma, 1.0f);
25+
float32_t3 accumulation = float32_t3(0.0f, 0.0f, 0.0f);
26+
27+
for (int i = 0; i < 6; ++i)
28+
{
29+
float32_t4 cascadeLevel = cascade.Load(uint3(coords, i));
30+
accumulation += float32_t3(cascadeLevel.r, cascadeLevel.g, cascadeLevel.b);
31+
}
32+
33+
//accumulation /= 32.0f;
34+
float32_t4 output = float32_t4(accumulation, 1.0f);
3635

3736
outImage[coords] = output;
3837
}

0 commit comments

Comments
 (0)