Enabling Infinite-Bounce Lighting
?
?

Keyboard Navigation

Global Keys

[, < / ], > Jump to previous / next episode
W, K, P / S, J, N Jump to previous / next timestamp
t / T Toggle theatre / SUPERtheatre mode
V Revert filter to original state Y Select link (requires manual Ctrl-c)

Menu toggling

q Quotes r References f Filter y Link c Credits

In-Menu and Index Controls

a
w
s
d
h j k l


Esc Close menu / unfocus timestamp

Quotes and References Menus and Index

Enter Jump to timestamp

Quotes, References and Credits Menus

o Open URL (in new tab)

Filter Menu

x, Space Toggle category and focus next
X, ShiftSpace Toggle category and focus previous
v Invert topics / media as per focus

Filter and Link Menus

z Toggle filter / linking mode

Credits Menu

Enter Open URL (in new tab)
0:02Recap and set the stage for the day
🗩
0:02Recap and set the stage for the day
🗩
0:02Recap and set the stage for the day
🗩
1:13Describe the problem with black gaps in the light map
🏃
1:13Describe the problem with black gaps in the light map
🏃
1:13Describe the problem with black gaps in the light map
🏃
1:57Describe the indexing discrepancy between BuildDiffuseLightMaps() and ComputeLightPropagationWork()
📖
1:57Describe the indexing discrepancy between BuildDiffuseLightMaps() and ComputeLightPropagationWork()
📖
1:57Describe the indexing discrepancy between BuildDiffuseLightMaps() and ComputeLightPropagationWork()
📖
4:36Fix ComputeLightPropagationWork() to look up into the light map correctly
4:36Fix ComputeLightPropagationWork() to look up into the light map correctly
4:36Fix ComputeLightPropagationWork() to look up into the light map correctly
5:17See the correct lighting of our world, but not of the hero, and the misaligned simulation region
🏃
5:17See the correct lighting of our world, but not of the hero, and the misaligned simulation region
🏃
5:17See the correct lighting of our world, but not of the hero, and the misaligned simulation region
🏃
8:32Determine to enable infinite-bounce lighting
🏃
8:32Determine to enable infinite-bounce lighting
🏃
8:32Determine to enable infinite-bounce lighting
🏃
9:15Switch to TEST_SPHERE in ComputeLightPropagationWork()
9:15Switch to TEST_SPHERE in ComputeLightPropagationWork()
9:15Switch to TEST_SPHERE in ComputeLightPropagationWork()
9:29Check out our sphere fall-off lighting
🏃
9:29Check out our sphere fall-off lighting
🏃
9:29Check out our sphere fall-off lighting
🏃
10:36Let CompileZBiasProgram() clamp the light to brighter values
10:36Let CompileZBiasProgram() clamp the light to brighter values
10:36Let CompileZBiasProgram() clamp the light to brighter values
11:51Check out our brighter lighting
🏃
11:51Check out our brighter lighting
🏃
11:51Check out our brighter lighting
🏃
12:23Let CompileZBiasProgram() clamp the light to further brighter values
12:23Let CompileZBiasProgram() clamp the light to further brighter values
12:23Let CompileZBiasProgram() clamp the light to further brighter values
12:28Check out our brighter lighting with the determination to enable bounce lighting
🏃
12:28Check out our brighter lighting with the determination to enable bounce lighting
🏃
12:28Check out our brighter lighting with the determination to enable bounce lighting
🏃
13:56Toggle off TEST_SPHERE in ComputeLightPropagationWork() and fix it to pass Work to FullCast()
13:56Toggle off TEST_SPHERE in ComputeLightPropagationWork() and fix it to pass Work to FullCast()
13:56Toggle off TEST_SPHERE in ComputeLightPropagationWork() and fix it to pass Work to FullCast()
14:43Check out our full bright, slower ray-cast lighting
🏃
14:43Check out our full bright, slower ray-cast lighting
🏃
14:43Check out our full bright, slower ray-cast lighting
🏃
16:33Prepare to enable distributive ray-casting in FullCast()
📖
16:33Prepare to enable distributive ray-casting in FullCast()
📖
16:33Prepare to enable distributive ray-casting in FullCast()
📖
17:22Blank out the MoonColor in FullCast()
17:22Blank out the MoonColor in FullCast()
17:22Blank out the MoonColor in FullCast()
17:42See no difference, except that the light map appears to be accumulating to full brightness
🏃
17:42See no difference, except that the light map appears to be accumulating to full brightness
🏃
17:42See no difference, except that the light map appears to be accumulating to full brightness
🏃
17:57Consult the casting code in FullCast()
📖
17:57Consult the casting code in FullCast()
📖
17:57Consult the casting code in FullCast()
📖
19:14Prevent FullCast() from biasing towards the light source
19:14Prevent FullCast() from biasing towards the light source
19:14Prevent FullCast() from biasing towards the light source
19:36Check out our lighting without biasing towards the light source
🏃
19:36Check out our lighting without biasing towards the light source
🏃
19:36Check out our lighting without biasing towards the light source
🏃
19:42Correctly prevent FullCast() from biasing towards the light source
19:42Correctly prevent FullCast() from biasing towards the light source
19:42Correctly prevent FullCast() from biasing towards the light source
20:00Check out our lighting without biasing towards the light source
🏃
20:00Check out our lighting without biasing towards the light source
🏃
20:00Check out our lighting without biasing towards the light source
🏃
20:15Try blanking out the TransferPPS in FullCast()
20:15Try blanking out the TransferPPS in FullCast()
20:15Try blanking out the TransferPPS in FullCast()
21:15See a black world
🏃
21:15See a black world
🏃
21:15See a black world
🏃
21:18Try setting a TransferPPS of a quarter full bright white in FullCast()
21:18Try setting a TransferPPS of a quarter full bright white in FullCast()
21:18Try setting a TransferPPS of a quarter full bright white in FullCast()
21:30Check out our lit world, noting that the high brightness of the light
🏃
21:30Check out our lit world, noting that the high brightness of the light
🏃
21:30Check out our lit world, noting that the high brightness of the light
🏃
23:03Switch to TEST_CAST in ComputeLightPropagationWork()
23:03Switch to TEST_CAST in ComputeLightPropagationWork()
23:03Switch to TEST_CAST in ComputeLightPropagationWork()
23:51Check out our test cast lighting
🏃
23:51Check out our test cast lighting
🏃
23:51Check out our test cast lighting
🏃
23:57Try making TestCast() output a known grey light
23:57Try making TestCast() output a known grey light
23:57Try making TestCast() output a known grey light
24:19See the light fade
🏃
24:19See the light fade
🏃
24:19See the light fade
🏃
24:27Try making TestCast() call UpdateVoxel() many times
24:27Try making TestCast() call UpdateVoxel() many times
24:27Try making TestCast() call UpdateVoxel() many times
24:30See no difference
🏃
24:30See no difference
🏃
24:30See no difference
🏃
24:36Remove the multiple calls to UpdateVoxel() in TestCast(), and toggle off TEST_CAST in ComputeLightPropagationWork()
24:36Remove the multiple calls to UpdateVoxel() in TestCast(), and toggle off TEST_CAST in ComputeLightPropagationWork()
24:36Remove the multiple calls to UpdateVoxel() in TestCast(), and toggle off TEST_CAST in ComputeLightPropagationWork()
25:08See our bright light
🏃
25:08See our bright light
🏃
25:08See our bright light
🏃
25:14Consider the problem to be in pulling light from multiple octahedral offsets
📖
25:14Consider the problem to be in pulling light from multiple octahedral offsets
📖
25:14Consider the problem to be in pulling light from multiple octahedral offsets
📖
26:39Check BuildDiffuseLightMaps() for possible bugs
📖
26:39Check BuildDiffuseLightMaps() for possible bugs
📖
26:39Check BuildDiffuseLightMaps() for possible bugs
📖
28:17Break in to FullCast() and inspect the DiffuseWeightMap
🏃
28:17Break in to FullCast() and inspect the DiffuseWeightMap
🏃
28:17Break in to FullCast() and inspect the DiffuseWeightMap
🏃
31:35Diffuse Map Filtering
🖌
31:35Diffuse Map Filtering
🖌
31:35Diffuse Map Filtering
🖌
35:39Directional reflection bounce
🖌
35:39Directional reflection bounce
🖌
35:39Directional reflection bounce
🖌
39:37Consider BuildDiffuseLightMaps() to be handling bounce direction correctly
📖
39:37Consider BuildDiffuseLightMaps() to be handling bounce direction correctly
📖
39:37Consider BuildDiffuseLightMaps() to be handling bounce direction correctly
📖
40:23See if CompileZBiasProgram() samples light based on its direction
📖
40:23See if CompileZBiasProgram() samples light based on its direction
📖
40:23See if CompileZBiasProgram() samples light based on its direction
📖
43:00Diffuse sampling of cosine-weighted directional light
🖌
43:00Diffuse sampling of cosine-weighted directional light
🖌
43:00Diffuse sampling of cosine-weighted directional light
🖌
48:56Make SumLight() in CompileZBiasProgram() just use the surface normal as the reflection vector when sampling Lambertian (ideally diffuse) surfaces
48:56Make SumLight() in CompileZBiasProgram() just use the surface normal as the reflection vector when sampling Lambertian (ideally diffuse) surfaces
48:56Make SumLight() in CompileZBiasProgram() just use the surface normal as the reflection vector when sampling Lambertian (ideally diffuse) surfaces
50:23Switch to TEST_CAST in ComputeLightPropagationWork()
50:23Switch to TEST_CAST in ComputeLightPropagationWork()
50:23Switch to TEST_CAST in ComputeLightPropagationWork()
50:42See our darkly lit world
🏃
50:42See our darkly lit world
🏃
50:42See our darkly lit world
🏃
50:45Prevent TestCast() from outputting a known grey light
50:45Prevent TestCast() from outputting a known grey light
50:45Prevent TestCast() from outputting a known grey light
50:59Check out the test ray cast lighting
🏃
50:59Check out the test ray cast lighting
🏃
50:59Check out the test ray cast lighting
🏃
51:15Switch to TEST_SPHERE in ComputeLightPropagationWork()
51:15Switch to TEST_SPHERE in ComputeLightPropagationWork()
51:15Switch to TEST_SPHERE in ComputeLightPropagationWork()
51:25Check out the correct sphere light
🏃
51:25Check out the correct sphere light
🏃
51:25Check out the correct sphere light
🏃
52:34Toggle off TEST_SPHERE in ComputeLightPropagationWork()
52:34Toggle off TEST_SPHERE in ComputeLightPropagationWork()
52:34Toggle off TEST_SPHERE in ComputeLightPropagationWork()
53:00Check out the full ray cast lighting, wondering where falloff comes into it
🏃
53:00Check out the full ray cast lighting, wondering where falloff comes into it
🏃
53:00Check out the full ray cast lighting, wondering where falloff comes into it
🏃
53:40Reduce the TransferPPS from ×0.25f to ×0.1f in FullCast()
53:40Reduce the TransferPPS from ×0.25f to ×0.1f in FullCast()
53:40Reduce the TransferPPS from ×0.25f to ×0.1f in FullCast()
53:54See the dimmer light
🏃
53:54See the dimmer light
🏃
53:54See the dimmer light
🏃
53:58Further reduce the TransferPPS from ×0.1f to ×0.01f in FullCast()
53:58Further reduce the TransferPPS from ×0.1f to ×0.01f in FullCast()
53:58Further reduce the TransferPPS from ×0.1f to ×0.01f in FullCast()
54:01See the unlit world, despite the light map containing non-zero values
🏃
54:01See the unlit world, despite the light map containing non-zero values
🏃
54:01See the unlit world, despite the light map containing non-zero values
🏃
54:32Increase the TransferPPS from ×0.01f to ×0.02f in FullCast()
54:32Increase the TransferPPS from ×0.01f to ×0.02f in FullCast()
54:32Increase the TransferPPS from ×0.01f to ×0.02f in FullCast()
54:38See the world lighten, and recall that we clamp the lighting down
🏃
54:38See the world lighten, and recall that we clamp the lighting down
🏃
54:38See the world lighten, and recall that we clamp the lighting down
🏃
54:48Further increase the TransferPPS from ×0.02f to ×0.03f in FullCast()
54:48Further increase the TransferPPS from ×0.02f to ×0.03f in FullCast()
54:48Further increase the TransferPPS from ×0.02f to ×0.03f in FullCast()
54:50Consider our lighting transfer clamping to be okay
🏃
54:50Consider our lighting transfer clamping to be okay
🏃
54:50Consider our lighting transfer clamping to be okay
🏃
55:05Prevent FullCast() from post-modifying the TransferPPS, and try commenting out the ray hit computations
55:05Prevent FullCast() from post-modifying the TransferPPS, and try commenting out the ray hit computations
55:05Prevent FullCast() from post-modifying the TransferPPS, and try commenting out the ray hit computations
55:55See no lighting
🏃
55:55See no lighting
🏃
55:55See no lighting
🏃
56:06Prevent FullCast() from blanking out the MoonColor
56:06Prevent FullCast() from blanking out the MoonColor
56:06Prevent FullCast() from blanking out the MoonColor
56:21Check out the moonlit world
🏃
56:21Check out the moonlit world
🏃
56:21Check out the moonlit world
🏃
56:46Scrutinise the moonlighting code in FullCast()
📖
56:46Scrutinise the moonlighting code in FullCast()
📖
56:46Scrutinise the moonlighting code in FullCast()
📖
58:03Negate the EmissionDirection in the TransferPPS computation for the moon in FullCast()
58:03Negate the EmissionDirection in the TransferPPS computation for the moon in FullCast()
58:03Negate the EmissionDirection in the TransferPPS computation for the moon in FullCast()
58:18See more expected moonlight
🏃
58:18See more expected moonlight
🏃
58:18See more expected moonlight
🏃
58:25Respecify MoonP as MoonDir in FullCast()
58:25Respecify MoonP as MoonDir in FullCast()
58:25Respecify MoonP as MoonDir in FullCast()
1:00:17Check out our slowly moonlit world
🏃
1:00:17Check out our slowly moonlit world
🏃
1:00:17Check out our slowly moonlit world
🏃
1:00:35Darken the moon from ×3 to ×1 in FullCast()
1:00:35Darken the moon from ×3 to ×1 in FullCast()
1:00:35Darken the moon from ×3 to ×1 in FullCast()
1:00:43Watch the moonlight darken
🏃
1:00:43Watch the moonlight darken
🏃
1:00:43Watch the moonlight darken
🏃
1:00:48Further darken the moon from ×1 to ×0.2 in FullCast()
1:00:48Further darken the moon from ×1 to ×0.2 in FullCast()
1:00:48Further darken the moon from ×1 to ×0.2 in FullCast()
1:00:57Watch the moonlight darken further
🏃
1:00:57Watch the moonlight darken further
🏃
1:00:57Watch the moonlight darken further
🏃
1:01:22Further darken the moon from ×0.2 to ×0.1 in FullCast()
1:01:22Further darken the moon from ×0.2 to ×0.1 in FullCast()
1:01:22Further darken the moon from ×0.2 to ×0.1 in FullCast()
1:01:28Watch the moonlight darken further, and spot a shadow cast by our (unlit) light sources
🏃
1:01:28Watch the moonlight darken further, and spot a shadow cast by our (unlit) light sources
🏃
1:01:28Watch the moonlight darken further, and spot a shadow cast by our (unlit) light sources
🏃
1:02:04Work on the handling of ray cast bounces in FullCast(), respecifying ComputeVoxelIrradianceAt() to take an Outgoing vector
1:02:04Work on the handling of ray cast bounces in FullCast(), respecifying ComputeVoxelIrradianceAt() to take an Outgoing vector
1:02:04Work on the handling of ray cast bounces in FullCast(), respecifying ComputeVoxelIrradianceAt() to take an Outgoing vector
1:07:14Watch the light emerge with style (exploding to bright, before settling)
🏃
1:07:14Watch the light emerge with style (exploding to bright, before settling)
🏃
1:07:14Watch the light emerge with style (exploding to bright, before settling)
🏃
1:07:39Wonder why we are getting more light than expected
📖
1:07:39Wonder why we are getting more light than expected
📖
1:07:39Wonder why we are getting more light than expected
📖
1:09:09Try making ComputeVoxelIrradianceAt() produce a known value
1:09:09Try making ComputeVoxelIrradianceAt() produce a known value
1:09:09Try making ComputeVoxelIrradianceAt() produce a known value
1:09:29See lighting, without the over-brightness
🏃
1:09:29See lighting, without the over-brightness
🏃
1:09:29See lighting, without the over-brightness
🏃
1:11:00Blank out the MoonColor in FullCast()
1:11:00Blank out the MoonColor in FullCast()
1:11:00Blank out the MoonColor in FullCast()
1:11:11See the single-bounce lighting
🏃
1:11:11See the single-bounce lighting
🏃
1:11:11See the single-bounce lighting
🏃
1:11:55Prevent FullCast() from blanking out the MoonColor
1:11:55Prevent FullCast() from blanking out the MoonColor
1:11:55Prevent FullCast() from blanking out the MoonColor
1:12:00Consider our lighting to look right
🏃
1:12:00Consider our lighting to look right
🏃
1:12:00Consider our lighting to look right
🏃
1:12:04Scrutinise ComputeVoxelIrradianceAt()
📖
1:12:04Scrutinise ComputeVoxelIrradianceAt()
📖
1:12:04Scrutinise ComputeVoxelIrradianceAt()
📖
1:14:55Try making CompileZBiasProgram() reduce the VoxUVW by half, in line with ComputeVoxelIrradianceAt()
1:14:55Try making CompileZBiasProgram() reduce the VoxUVW by half, in line with ComputeVoxelIrradianceAt()
1:14:55Try making CompileZBiasProgram() reduce the VoxUVW by half, in line with ComputeVoxelIrradianceAt()
1:15:07See the light disappear completely
🏃
1:15:07See the light disappear completely
🏃
1:15:07See the light disappear completely
🏃
1:15:11Revert VoxUVW and try making CompileZBiasProgram() reduce the VoxR by half
1:15:11Revert VoxUVW and try making CompileZBiasProgram() reduce the VoxR by half
1:15:11Revert VoxUVW and try making CompileZBiasProgram() reduce the VoxR by half
1:15:44See that the light is now centred properly, and the moonlight cannot reach downstairs
🏃
1:15:44See that the light is now centred properly, and the moonlight cannot reach downstairs
🏃
1:15:44See that the light is now centred properly, and the moonlight cannot reach downstairs
🏃
1:17:06Continue to scrutinise ComputeVoxelIrradianceAt()
📖
1:17:06Continue to scrutinise ComputeVoxelIrradianceAt()
📖
1:17:06Continue to scrutinise ComputeVoxelIrradianceAt()
📖
1:18:20Try making ComputeVoxelIrradianceAt() reduce the real result by ×0.01f
1:18:20Try making ComputeVoxelIrradianceAt() reduce the real result by ×0.01f
1:18:20Try making ComputeVoxelIrradianceAt() reduce the real result by ×0.01f
1:18:36Watch the light emerge again with style (exploding to bright)
🏃
1:18:36Watch the light emerge again with style (exploding to bright)
🏃
1:18:36Watch the light emerge again with style (exploding to bright)
🏃
1:18:42Try making ComputeVoxelIrradianceAt() further reduce the real result from ×0.01f to ×0.001f
1:18:42Try making ComputeVoxelIrradianceAt() further reduce the real result from ×0.01f to ×0.001f
1:18:42Try making ComputeVoxelIrradianceAt() further reduce the real result from ×0.01f to ×0.001f
1:18:55See the light hover without exploding
🏃
1:18:55See the light hover without exploding
🏃
1:18:55See the light hover without exploding
🏃
1:19:02Try making ComputeVoxelIrradianceAt() increase the real result from ×0.001f to ×0.002f
1:19:02Try making ComputeVoxelIrradianceAt() increase the real result from ×0.001f to ×0.002f
1:19:02Try making ComputeVoxelIrradianceAt() increase the real result from ×0.001f to ×0.002f
1:19:09Watch the light slowly explode
🏃
1:19:09Watch the light slowly explode
🏃
1:19:09Watch the light slowly explode
🏃
1:19:49Try making ComputeVoxelIrradianceAt() decrease the real result from ×0.002f to ×0.0015f
1:19:49Try making ComputeVoxelIrradianceAt() decrease the real result from ×0.002f to ×0.0015f
1:19:49Try making ComputeVoxelIrradianceAt() decrease the real result from ×0.002f to ×0.0015f
1:20:02Watch the light slowly explode
🏃
1:20:02Watch the light slowly explode
🏃
1:20:02Watch the light slowly explode
🏃
1:20:24Try making ComputeVoxelIrradianceAt() decrease the real result from ×0.0015f to ×0.00125f
1:20:24Try making ComputeVoxelIrradianceAt() decrease the real result from ×0.0015f to ×0.00125f
1:20:24Try making ComputeVoxelIrradianceAt() decrease the real result from ×0.0015f to ×0.00125f
1:20:32Watch the light explode a little
🏃
1:20:32Watch the light explode a little
🏃
1:20:32Watch the light explode a little
🏃
1:20:47Conceptualising photons per second
📖
1:20:47Conceptualising photons per second
📖
1:20:47Conceptualising photons per second
📖
1:22:27Assert in FullCast() that Emission is <= 1.0f
1:22:27Assert in FullCast() that Emission is <= 1.0f
1:22:27Assert in FullCast() that Emission is <= 1.0f
1:22:46Happily fail to hit that Emission <= 1.0f assertion in FullCast()
🏃
1:22:46Happily fail to hit that Emission <= 1.0f assertion in FullCast()
🏃
1:22:46Happily fail to hit that Emission <= 1.0f assertion in FullCast()
🏃
1:22:58Remove that Emission <= 1.0f assertion in FullCast(), and instead assert that the SampleRefColor values are all <= 1.0f
1:22:58Remove that Emission <= 1.0f assertion in FullCast(), and instead assert that the SampleRefColor values are all <= 1.0f
1:22:58Remove that Emission <= 1.0f assertion in FullCast(), and instead assert that the SampleRefColor values are all <= 1.0f
1:24:47Happily fail to hit those SampleRefColor <= 1.0f assertions in FullCast()
🏃
1:24:47Happily fail to hit those SampleRefColor <= 1.0f assertions in FullCast()
🏃
1:24:47Happily fail to hit those SampleRefColor <= 1.0f assertions in FullCast()
🏃
1:24:48Remove those SampleRefColor <= 1.0f assertions in FullCast()
1:24:48Remove those SampleRefColor <= 1.0f assertions in FullCast()
1:24:48Remove those SampleRefColor <= 1.0f assertions in FullCast()
1:25:49Try blanking out the Emission of hit rays in FullCast()
1:25:49Try blanking out the Emission of hit rays in FullCast()
1:25:49Try blanking out the Emission of hit rays in FullCast()
1:26:04See our moonlit world
🏃
1:26:04See our moonlit world
🏃
1:26:04See our moonlit world
🏃
1:26:20Prevent ComputeVoxelIrradianceAt() from modifying its result
1:26:20Prevent ComputeVoxelIrradianceAt() from modifying its result
1:26:20Prevent ComputeVoxelIrradianceAt() from modifying its result
1:26:27Watch the light explode, even with such dim moonlight
🏃
1:26:27Watch the light explode, even with such dim moonlight
🏃
1:26:27Watch the light explode, even with such dim moonlight
🏃
1:27:58Assert in ComputeVoxelIrradianceAt() that the Result values are <= 0.5f
1:27:58Assert in ComputeVoxelIrradianceAt() that the Result values are <= 0.5f
1:27:58Assert in ComputeVoxelIrradianceAt() that the Result values are <= 0.5f
1:28:24Happily hit our Result <= 0.5f assertions in ComputeVoxelIrradianceAt()
🏃
1:28:24Happily hit our Result <= 0.5f assertions in ComputeVoxelIrradianceAt()
🏃
1:28:24Happily hit our Result <= 0.5f assertions in ComputeVoxelIrradianceAt()
🏃
1:28:48Run to ComputeVoxelIrradianceAt() and inspect its values, to find that the UVW is garbage
🏃
1:28:48Run to ComputeVoxelIrradianceAt() and inspect its values, to find that the UVW is garbage
🏃
1:28:48Run to ComputeVoxelIrradianceAt() and inspect its values, to find that the UVW is garbage
🏃
1:33:29Separate out the UVW computation in ComputeVoxelIrradianceAt(), and remove VoxCellDim from the BCoord computation
1:33:29Separate out the UVW computation in ComputeVoxelIrradianceAt(), and remove VoxCellDim from the BCoord computation
1:33:29Separate out the UVW computation in ComputeVoxelIrradianceAt(), and remove VoxCellDim from the BCoord computation
1:35:03Step in to ComputeVoxelIrradianceAt() and inspect its values, to find a more expected UVW
🏃
1:35:03Step in to ComputeVoxelIrradianceAt() and inspect its values, to find a more expected UVW
🏃
1:35:03Step in to ComputeVoxelIrradianceAt() and inspect its values, to find a more expected UVW
🏃
1:36:11Check the moonlit world in release mode
🏃
1:36:11Check the moonlit world in release mode
🏃
1:36:11Check the moonlit world in release mode
🏃
1:36:48Prevent FullCast() from blanking out the Emission
1:36:48Prevent FullCast() from blanking out the Emission
1:36:48Prevent FullCast() from blanking out the Emission
1:36:59See a more sanely and stably lit world
🏃
1:36:59See a more sanely and stably lit world
🏃
1:36:59See a more sanely and stably lit world
🏃
1:38:01Hit a read access violation in ComputeVoxelIrradianceAt()
🏃
1:38:01Hit a read access violation in ComputeVoxelIrradianceAt()
🏃
1:38:01Hit a read access violation in ComputeVoxelIrradianceAt()
🏃
1:39:09Make a note in ComputeVoxelIrradianceAt() to fix the sampling error
1:39:09Make a note in ComputeVoxelIrradianceAt() to fix the sampling error
1:39:09Make a note in ComputeVoxelIrradianceAt() to fix the sampling error
1:39:16Q&A
🗩
1:39:16Q&A
🗩
1:39:16Q&A
🗩
1:39:55uplinkcoder Q: The UI is drawn at Z levels less than -999 so to disable the lighting just compare the Z to -999. Can you quickly re-enable it?
🗪
1:39:55uplinkcoder Q: The UI is drawn at Z levels less than -999 so to disable the lighting just compare the Z to -999. Can you quickly re-enable it?
🗪
1:39:55uplinkcoder Q: The UI is drawn at Z levels less than -999 so to disable the lighting just compare the Z to -999. Can you quickly re-enable it?
🗪
1:40:24Make CompileZBiasProgram() only light surfaces that are above Z -999
1:40:24Make CompileZBiasProgram() only light surfaces that are above Z -999
1:40:24Make CompileZBiasProgram() only light surfaces that are above Z -999
1:41:09Check out our unlit UI
🏃
1:41:09Check out our unlit UI
🏃
1:41:09Check out our unlit UI
🏃
1:41:57Make FullCast() be a TIMED_FUNCTION
1:41:57Make FullCast() be a TIMED_FUNCTION
1:41:57Make FullCast() be a TIMED_FUNCTION
1:43:57Check the CPU usage of FullCast() (73%) and ComputeLightPropagationWork() (21%)
🏃
1:43:57Check the CPU usage of FullCast() (73%) and ComputeLightPropagationWork() (21%)
🏃
1:43:57Check the CPU usage of FullCast() (73%) and ComputeLightPropagationWork() (21%)
🏃
1:44:32Try preventing ComputeVoxelIrradianceAt() from blending the whole lighting hierarchy
1:44:32Try preventing ComputeVoxelIrradianceAt() from blending the whole lighting hierarchy
1:44:32Try preventing ComputeVoxelIrradianceAt() from blending the whole lighting hierarchy
1:44:57FullCast() still uses 73% of our CPU cycles
🏃
1:44:57FullCast() still uses 73% of our CPU cycles
🏃
1:44:57FullCast() still uses 73% of our CPU cycles
🏃
1:45:19Make ComputeVoxelIrradianceAt() be a TIMED_FUNCTION
1:45:19Make ComputeVoxelIrradianceAt() be a TIMED_FUNCTION
1:45:19Make ComputeVoxelIrradianceAt() be a TIMED_FUNCTION
1:45:54Hit a write access violation
🏃
1:45:54Hit a write access violation
🏃
1:45:54Hit a write access violation
🏃
1:46:06Prevent ComputeVoxelIrradianceAt() from being a TIMED_FUNCTION
1:46:06Prevent ComputeVoxelIrradianceAt() from being a TIMED_FUNCTION
1:46:06Prevent ComputeVoxelIrradianceAt() from being a TIMED_FUNCTION
1:46:30Try preventing FullCast() from calling ComputeVoxelIrradianceAt()
1:46:30Try preventing FullCast() from calling ComputeVoxelIrradianceAt()
1:46:30Try preventing FullCast() from calling ComputeVoxelIrradianceAt()
1:47:21FullCast() uses 67% of our CPU cycles
🏃
1:47:21FullCast() uses 67% of our CPU cycles
🏃
1:47:21FullCast() uses 67% of our CPU cycles
🏃
1:48:05Toggle on the ComputeVoxelIrradianceAt() call in FullCast()
1:48:05Toggle on the ComputeVoxelIrradianceAt() call in FullCast()
1:48:05Toggle on the ComputeVoxelIrradianceAt() call in FullCast()
1:48:09FullCast() uses 73% of our CPU cycles
🏃
1:48:09FullCast() uses 73% of our CPU cycles
🏃
1:48:09FullCast() uses 73% of our CPU cycles
🏃
1:48:17Remove that ComputeVoxelIrradianceAt() toggle in FullCast(), and consider the ray cast to be our most expensive consumer
1:48:17Remove that ComputeVoxelIrradianceAt() toggle in FullCast(), and consider the ray cast to be our most expensive consumer
1:48:17Remove that ComputeVoxelIrradianceAt() toggle in FullCast(), and consider the ray cast to be our most expensive consumer
1:49:10x1bzzr Q: I think you mentioned before that you don't like regular expressions. Can you elaborate on why?
🗪
1:49:10x1bzzr Q: I think you mentioned before that you don't like regular expressions. Can you elaborate on why?
🗪
1:49:10x1bzzr Q: I think you mentioned before that you don't like regular expressions. Can you elaborate on why?
🗪
1:50:34xxthebigfoxx Q: If we have a probe near a wall and that probe is updated with the color sampled at the wall, the next frame the wall might be brighter due to the new probe color. Couldn't this spiral up to a very bright probe? How does the system prevent this?
🗪
1:50:34xxthebigfoxx Q: If we have a probe near a wall and that probe is updated with the color sampled at the wall, the next frame the wall might be brighter due to the new probe color. Couldn't this spiral up to a very bright probe? How does the system prevent this?
🗪
1:50:34xxthebigfoxx Q: If we have a probe near a wall and that probe is updated with the color sampled at the wall, the next frame the wall might be brighter due to the new probe color. Couldn't this spiral up to a very bright probe? How does the system prevent this?
🗪
1:52:44Try reducing our RayBundleCount to 1 in FullCast()
1:52:44Try reducing our RayBundleCount to 1 in FullCast()
1:52:44Try reducing our RayBundleCount to 1 in FullCast()
1:53:24FullCast() uses 14% of our CPU cycles
🏃
1:53:24FullCast() uses 14% of our CPU cycles
🏃
1:53:24FullCast() uses 14% of our CPU cycles
🏃
1:54:05Try reducing our RayBundleCount from 1 to 4 in FullCast()
1:54:05Try reducing our RayBundleCount from 1 to 4 in FullCast()
1:54:05Try reducing our RayBundleCount from 1 to 4 in FullCast()
1:54:18Our lighting runs not too poorly
🏃
1:54:18Our lighting runs not too poorly
🏃
1:54:18Our lighting runs not too poorly
🏃
1:54:46Let FullCast() use our full RayBundleCount, and try biasing towards the light source
1:54:46Let FullCast() use our full RayBundleCount, and try biasing towards the light source
1:54:46Let FullCast() use our full RayBundleCount, and try biasing towards the light source
1:55:02Hit a read access violation in ComputeVoxelIrradianceAt()
🏃
1:55:02Hit a read access violation in ComputeVoxelIrradianceAt()
🏃
1:55:02Hit a read access violation in ComputeVoxelIrradianceAt()
🏃
1:55:10Our Ty and Tx values in ComputeVoxelIrradianceAt() have apparently wrapped, but why?
🏃
1:55:10Our Ty and Tx values in ComputeVoxelIrradianceAt() have apparently wrapped, but why?
🏃
1:55:10Our Ty and Tx values in ComputeVoxelIrradianceAt() have apparently wrapped, but why?
🏃
1:55:58Try making GetOctahedralOffset() blank out the Dir
1:55:58Try making GetOctahedralOffset() blank out the Dir
1:55:58Try making GetOctahedralOffset() blank out the Dir
1:56:26Step in to GetOctahedralOffset() and inspect its values
🏃
1:56:26Step in to GetOctahedralOffset() and inspect its values
🏃
1:56:26Step in to GetOctahedralOffset() and inspect its values
🏃
1:57:22Introduce ApproxNOUp() for FullCast() to call, and avoid a divide-by-zero in OctahedralFromUnitVector()
1:57:22Introduce ApproxNOUp() for FullCast() to call, and avoid a divide-by-zero in OctahedralFromUnitVector()
1:57:22Introduce ApproxNOUp() for FullCast() to call, and avoid a divide-by-zero in OctahedralFromUnitVector()
2:00:17Hit a read access violation in ComputeVoxelIrradianceAt(), and see that its SampleN is zero
🏃
2:00:17Hit a read access violation in ComputeVoxelIrradianceAt(), and see that its SampleN is zero
🏃
2:00:17Hit a read access violation in ComputeVoxelIrradianceAt(), and see that its SampleN is zero
🏃
2:02:01Scrutinise RayCast() for HitNormal errors
📖
2:02:01Scrutinise RayCast() for HitNormal errors
📖
2:02:01Scrutinise RayCast() for HitNormal errors
📖
2:04:50Try to make RayCast() never produce a zero HitNormal, by always enabling one of the directional masks
2:04:50Try to make RayCast() never produce a zero HitNormal, by always enabling one of the directional masks
2:04:50Try to make RayCast() never produce a zero HitNormal, by always enabling one of the directional masks
2:06:56Run without hitting that read access violation in ComputeVoxelIrradianceAt()
🏃
2:06:56Run without hitting that read access violation in ComputeVoxelIrradianceAt()
🏃
2:06:56Run without hitting that read access violation in ComputeVoxelIrradianceAt()
🏃
2:06:58Make a note in RayCast() to "Verify that this produces correctly only-one-1 normals for all equivalences"
2:06:58Make a note in RayCast() to "Verify that this produces correctly only-one-1 normals for all equivalences"
2:06:58Make a note in RayCast() to "Verify that this produces correctly only-one-1 normals for all equivalences"
2:07:44Admire our light source-biased lighting
🏃
2:07:44Admire our light source-biased lighting
🏃
2:07:44Admire our light source-biased lighting
🏃
2:08:05Prevent FullCast() from biasing towards the light source
2:08:05Prevent FullCast() from biasing towards the light source
2:08:05Prevent FullCast() from biasing towards the light source
2:08:20See minimal difference with light source-biasing
🏃
2:08:20See minimal difference with light source-biasing
🏃
2:08:20See minimal difference with light source-biasing
🏃
2:08:37Toggle off the light source-biasing in FullCast()
2:08:37Toggle off the light source-biasing in FullCast()
2:08:37Toggle off the light source-biasing in FullCast()
2:09:16Admire our lighting
🏃
2:09:16Admire our lighting
🏃
2:09:16Admire our lighting
🏃
2:09:38x1bzzr Q: How would you share memory across functions in a shared library? I know the user could allocate memory and pass that to the library, but I was wondering how to have the library allocate memory for internal use without the library user having to know anything about it, but that the dll would keep a reference to across library calls. I tried using a global that gets initialized in the dll main with VirtualAlloc, but later when I call a function the library exports the global is zero
🗪
2:09:38x1bzzr Q: How would you share memory across functions in a shared library? I know the user could allocate memory and pass that to the library, but I was wondering how to have the library allocate memory for internal use without the library user having to know anything about it, but that the dll would keep a reference to across library calls. I tried using a global that gets initialized in the dll main with VirtualAlloc, but later when I call a function the library exports the global is zero
🗪
2:09:38x1bzzr Q: How would you share memory across functions in a shared library? I know the user could allocate memory and pass that to the library, but I was wondering how to have the library allocate memory for internal use without the library user having to know anything about it, but that the dll would keep a reference to across library calls. I tried using a global that gets initialized in the dll main with VirtualAlloc, but later when I call a function the library exports the global is zero
🗪
2:10:44Wrap it up
🗩
2:10:44Wrap it up
🗩
2:10:44Wrap it up
🗩