Skip to content

Commit 99fc650

Browse files
author
devsh
committed
how on earth did RWMC even work before !?
1 parent 8d9a94e commit 99fc650

File tree

5 files changed

+18
-9
lines changed

5 files changed

+18
-9
lines changed

22.RaytracedAO/Renderer.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1254,6 +1254,8 @@ void Renderer::initScreenSizedResources(
12541254
const bool baseIsKnown = cascadeLuminanceBase>std::numeric_limits<float>::min();
12551255
if (core::isnan<float>(cascadeLuminanceStart))
12561256
cascadeLuminanceStart = baseIsKnown ? (maxEmitterRadianceLuma*std::pow(cascadeLuminanceBase,-cascadeSegmentCount)):Emin;
1257+
// rationale, we don't have NEE and BRDF importance sampling samples with throughput <= 1.0
1258+
// However we have RIS, and that can complicate this assumption a bit
12571259
if (!baseIsKnown)
12581260
cascadeLuminanceBase = core::max(std::pow(maxEmitterRadianceLuma/cascadeLuminanceStart,1.f/cascadeSegmentCount),1.0625f);
12591261
std::cout << "Re-Weighting Monte Carlo = ENABLED [cascadeCount: "<<cascadeCount<<", start: "<<cascadeLuminanceStart<<", base: "<<cascadeLuminanceBase<<"]" << std::endl;

22.RaytracedAO/closestHit.comp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ void main()
9898
);
9999

100100
const vec3 origin = dPdBary*compactBary+lastVxPos;
101-
generate_next_rays(
101+
rayMask = generate_next_rays(
102102
MAX_RAYS_GENERATED,material,frontfacing,vertex_depth,
103103
scramble_start_state,sampleID,outPixelLocation,origin,
104104
throughput,aovThroughputScale,contrib.albedo,contrib.worldspaceNormal

22.RaytracedAO/main.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -643,11 +643,19 @@ int main(int argc, char** argv)
643643
mainSensorData.denoiserInfo.bloomIntensity = film.denoiserBloomIntensity;
644644
mainSensorData.denoiserInfo.tonemapperArgs = std::string(film.denoiserTonemapperArgs);
645645
mainSensorData.fileFormat = film.fileFormat;
646+
#ifndef UBER_TEST
647+
mainSensorData.cascadeCount = 6;
648+
mainSensorData.cascadeLuminanceBase = film.cascadeLuminanceBase;
649+
mainSensorData.cascadeLuminanceStart = film.cascadeLuminanceStart;
650+
mainSensorData.kappa = 1.f;
651+
mainSensorData.Emin = 1.7f;
652+
#else
646653
mainSensorData.cascadeCount = film.cascadeCount;
647654
mainSensorData.cascadeLuminanceBase = film.cascadeLuminanceBase;
648655
mainSensorData.cascadeLuminanceStart = film.cascadeLuminanceStart;
649656
mainSensorData.kappa = mainSensorData.cascadeCount<2 ? 0.f:film.rfilter.kappa;
650657
mainSensorData.Emin = film.rfilter.Emin;
658+
#endif
651659
mainSensorData.envmapRegFactor = core::clamp(film.envmapRegularizationFactor, 0.0f, 0.8f);
652660
mainSensorData.outputFilePath = std::filesystem::path(film.outputFilePath);
653661
// handle missing output path

22.RaytracedAO/raygen.comp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -152,7 +152,7 @@ void main()
152152
else if (cascadeIx==higherCascade)
153153
weight = splat.cascadeWeights[1];
154154
nextSampleAccumulationCascade(
155-
contrib.color*weight,coord,samplesPerPixelPerDispatch,
155+
firstFrame,contrib.color*weight,coord,samplesPerPixelPerDispatch,
156156
cascadeIx,pc.cummon.rcpFramesDispatched
157157
);
158158
}
@@ -162,7 +162,8 @@ void main()
162162
// clear accumulations totally if beginning a new frame
163163
if (firstFrame)
164164
{
165-
storeAccumulation(contrib.color,coord);
165+
if (!isRWMCEnabled())
166+
storeAccumulation(contrib.color,coord);
166167
storeAlbedo(contrib.albedo,coord);
167168
storeWorldspaceNormal(contrib.worldspaceNormal,coord);
168169
storeMask(hideEnvmap&&(!hit) ? 1.f:0.f,coord);

22.RaytracedAO/raytraceCommon.glsl

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -104,16 +104,14 @@ void addAccumulation(in vec3 delta, in uvec3 coord)
104104

105105
// TODO: use a R17G17B17_UNORM format matched to cascade range, then use 13 bits to store last spp count (max 8k spp renders)
106106
// This way we can avoid writing every cascade every path storage
107-
void nextSampleAccumulationCascade(in vec3 weightedDelta, uvec3 coord, in uint samplesPerPixelPerDispatch, in uint cascadeIndex, in float rcpN)
107+
void nextSampleAccumulationCascade(in bool firstFrame, in vec3 weightedDelta, uvec3 coord, in uint samplesPerPixelPerDispatch, in uint cascadeIndex, in float rcpN)
108108
{
109109
// but leave first index in the array for the ray accumulation metadata, hence the +1
110110
coord.z += (cascadeIndex+1u)*samplesPerPixelPerDispatch;
111-
const vec3 prev = fetchAccumulation(coord);
111+
const vec3 prev = firstFrame ? vec3(0.0):fetchAccumulation(coord);
112112
const vec3 newVal = prev+(weightedDelta-prev)*rcpN;
113-
// TODO: do a better check, compare actually encoded values for difference
114-
const uvec3 diff = floatBitsToUint(newVal)^floatBitsToUint(prev);
115-
if (bool((diff.x|diff.y|diff.z)&0x7ffffff0u))
116-
storeAccumulation(newVal,coord);
113+
// always store, cause we need to reset the value
114+
storeAccumulation(newVal,coord);
117115
}
118116
void addAccumulationCascade(in vec3 weightedDelta, uvec3 coord, in uint samplesPerPixelPerDispatch, in uint cascadeIndex)
119117
{

0 commit comments

Comments
 (0)