Handmade Hero»Episode Guide
Experimenting with Voxel Filters
?
?

Keyboard Navigation

Global Keys

[, < / ], > Jump to previous / next episode
W, K, P / S, J, N Jump to previous / next marker
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 Movement

a
w
s
d
h j k l


Quotes and References Menus

Enter Jump to timecode

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:01Recap and set the stage for the day making the ray caster produce a stable set of inputs to pass to the light field interpolater, with thoughts on multiple light fields
🗩
0:01Recap and set the stage for the day making the ray caster produce a stable set of inputs to pass to the light field interpolater, with thoughts on multiple light fields
🗩
0:01Recap and set the stage for the day making the ray caster produce a stable set of inputs to pass to the light field interpolater, with thoughts on multiple light fields
🗩
5:25Show the current state of the lighting
🏃
5:25Show the current state of the lighting
🏃
5:25Show the current state of the lighting
🏃
7:11Show the current state of the lighting, without filling in negative light values
🏃
7:11Show the current state of the lighting, without filling in negative light values
🏃
7:11Show the current state of the lighting, without filling in negative light values
🏃
7:35Consult our lighting TODOs
📖
7:35Consult our lighting TODOs
📖
7:35Consult our lighting TODOs
📖
8:03Show the absence of light flickering, thanks to our switch to floats
🏃
8:03Show the absence of light flickering, thanks to our switch to floats
🏃
8:03Show the absence of light flickering, thanks to our switch to floats
🏃
9:02Reorganise and consult our lighting TODOs
9:02Reorganise and consult our lighting TODOs
9:02Reorganise and consult our lighting TODOs
9:28Demo our need to flood fill the voxel so that unsampled portions get filled in from nearby samples
🏃
9:28Demo our need to flood fill the voxel so that unsampled portions get filled in from nearby samples
🏃
9:28Demo our need to flood fill the voxel so that unsampled portions get filled in from nearby samples
🏃
12:03Consider where is most appropriate to perform the flood filled interpolation
🗩
12:03Consider where is most appropriate to perform the flood filled interpolation
🗩
12:03Consider where is most appropriate to perform the flood filled interpolation
🗩
13:04Consider whether or not the reconstructed edge lighting values should persist across frames
🏃
13:04Consider whether or not the reconstructed edge lighting values should persist across frames
🏃
13:04Consider whether or not the reconstructed edge lighting values should persist across frames
🏃
15:22Consider our options for flood filling the lighting voxel: 1) Persistently in lighting_solution; 2) In EndLightingComputation() when: a) pushing the cells to the graphics card each frame; b) accumulating light contribution over time
📖
15:22Consider our options for flood filling the lighting voxel: 1) Persistently in lighting_solution; 2) In EndLightingComputation() when: a) pushing the cells to the graphics card each frame; b) accumulating light contribution over time
📖
15:22Consider our options for flood filling the lighting voxel: 1) Persistently in lighting_solution; 2) In EndLightingComputation() when: a) pushing the cells to the graphics card each frame; b) accumulating light contribution over time
📖
19:13Determine to make EndLightingComputation() flood fill the lighting voxel when pushing the cells to the graphics card
📖
19:13Determine to make EndLightingComputation() flood fill the lighting voxel when pushing the cells to the graphics card
📖
19:13Determine to make EndLightingComputation() flood fill the lighting voxel when pushing the cells to the graphics card
📖
20:36Seperable Filters
🖌
20:36Seperable Filters
🖌
20:36Seperable Filters
🖌
25:03Cache implications of our light voxel1
📖
25:03Cache implications of our light voxel1
📖
25:03Cache implications of our light voxel1
📖
30:44Propose constraining our flood fill filter to cells predetermined to require filtering
📖
30:44Propose constraining our flood fill filter to cells predetermined to require filtering
📖
30:44Propose constraining our flood fill filter to cells predetermined to require filtering
📖
32:35Abortively augment game_render_commands with a FloodIndices array
32:35Abortively augment game_render_commands with a FloodIndices array
32:35Abortively augment game_render_commands with a FloodIndices array
35:54Begin to make EndLightingComputation() flood fill the lighting voxel with purple when pushing the cells to the graphics card, asserting that we're well inside the hot region
35:54Begin to make EndLightingComputation() flood fill the lighting voxel with purple when pushing the cells to the graphics card, asserting that we're well inside the hot region
35:54Begin to make EndLightingComputation() flood fill the lighting voxel with purple when pushing the cells to the graphics card, asserting that we're well inside the hot region
38:17Try unsuccessfully to trigger our hot region assertions
🏃
38:17Try unsuccessfully to trigger our hot region assertions
🏃
38:17Try unsuccessfully to trigger our hot region assertions
🏃
39:02Make EndLightingComputation() flood fill out to neighbour cells, introducing HasLight() and FloodLight()
39:02Make EndLightingComputation() flood fill out to neighbour cells, introducing HasLight() and FloodLight()
39:02Make EndLightingComputation() flood fill out to neighbour cells, introducing HasLight() and FloodLight()
1:02:58Directional Flood Filling
🖌
1:02:58Directional Flood Filling
🖌
1:02:58Directional Flood Filling
🖌
1:04:28Fix FloodLight() to correctly fill in positive and negative directions, before welding its code in to EndLightingComputation()
1:04:28Fix FloodLight() to correctly fill in positive and negative directions, before welding its code in to EndLightingComputation()
1:04:28Fix FloodLight() to correctly fill in positive and negative directions, before welding its code in to EndLightingComputation()
1:08:22Check out our partially working flood filling
🏃
1:08:22Check out our partially working flood filling
🏃
1:08:22Check out our partially working flood filling
🏃
1:08:52Make EndLightingComputation() flood fill with purple
1:08:52Make EndLightingComputation() flood fill with purple
1:08:52Make EndLightingComputation() flood fill with purple
1:09:23Check out our purple flood filling, and spot some erroneously unlit / interpolated areas
🏃
1:09:23Check out our purple flood filling, and spot some erroneously unlit / interpolated areas
🏃
1:09:23Check out our purple flood filling, and spot some erroneously unlit / interpolated areas
🏃
1:10:28Make CompileZBiasProgram() clamp the light to 0, introducing Clamp0Inf()2
1:10:28Make CompileZBiasProgram() clamp the light to 0, introducing Clamp0Inf()2
1:10:28Make CompileZBiasProgram() clamp the light to 0, introducing Clamp0Inf()2
1:14:37Still see dead zones
🏃
1:14:37Still see dead zones
🏃
1:14:37Still see dead zones
🏃
1:15:49Make CompileZBiasProgram() normalise the LightN
1:15:49Make CompileZBiasProgram() normalise the LightN
1:15:49Make CompileZBiasProgram() normalise the LightN
1:16:12Still see dead zones
🏃
1:16:12Still see dead zones
🏃
1:16:12Still see dead zones
🏃
1:17:21Prevent EndLightingComputation() from flood filling with purple
1:17:21Prevent EndLightingComputation() from flood filling with purple
1:17:21Prevent EndLightingComputation() from flood filling with purple
1:17:27Still see dead zones
🏃
1:17:27Still see dead zones
🏃
1:17:27Still see dead zones
🏃
1:17:46Toggle on the purple in EndLightingComputation()
1:17:46Toggle on the purple in EndLightingComputation()
1:17:46Toggle on the purple in EndLightingComputation()
1:17:48Change HasLight() to base its decision on LightC, rather than LightN
1:17:48Change HasLight() to base its decision on LightC, rather than LightN
1:17:48Change HasLight() to base its decision on LightC, rather than LightN
1:18:22Still see dead zones
🏃
1:18:22Still see dead zones
🏃
1:18:22Still see dead zones
🏃
1:19:13Make EndLightingComputation() flood fill with yellow the cells that have light
1:19:13Make EndLightingComputation() flood fill with yellow the cells that have light
1:19:13Make EndLightingComputation() flood fill with yellow the cells that have light
1:19:49Find that all cells are lit either purple or yellow
🏃
1:19:49Find that all cells are lit either purple or yellow
🏃
1:19:49Find that all cells are lit either purple or yellow
🏃
1:20:11Comment out the yellow in EndLightingComputation()
1:20:11Comment out the yellow in EndLightingComputation()
1:20:11Comment out the yellow in EndLightingComputation()
1:20:18See our dead zones return
🏃
1:20:18See our dead zones return
🏃
1:20:18See our dead zones return
🏃
1:20:45Make HasLight() less permissive with a threshold
1:20:45Make HasLight() less permissive with a threshold
1:20:45Make HasLight() less permissive with a threshold
1:21:50See our dead zones flood to purple (i.e. unlit)
🏃
1:21:50See our dead zones flood to purple (i.e. unlit)
🏃
1:21:50See our dead zones flood to purple (i.e. unlit)
🏃
1:22:36Toggle off the purple in EndLightingComputation()
1:22:36Toggle off the purple in EndLightingComputation()
1:22:36Toggle off the purple in EndLightingComputation()
1:23:00Check out the interpolation across the light boundaries
🏃
1:23:00Check out the interpolation across the light boundaries
🏃
1:23:00Check out the interpolation across the light boundaries
🏃
1:23:40Scrutinise the directional flood fill interpolation code in EndLightingComputation()
📖
1:23:40Scrutinise the directional flood fill interpolation code in EndLightingComputation()
📖
1:23:40Scrutinise the directional flood fill interpolation code in EndLightingComputation()
📖
1:25:12Directional Flood Fill Interpolation
🖌
1:25:12Directional Flood Fill Interpolation
🖌
1:25:12Directional Flood Fill Interpolation
🖌
1:26:33Scrutinise the light value lookup and clamping in CompileZBiasProgram()
📖
1:26:33Scrutinise the light value lookup and clamping in CompileZBiasProgram()
📖
1:26:33Scrutinise the light value lookup and clamping in CompileZBiasProgram()
📖
1:28:41Closely look at the apparent interpolation bug
🏃
1:28:41Closely look at the apparent interpolation bug
🏃
1:28:41Closely look at the apparent interpolation bug
🏃
1:30:19Make EndLightingComputation() flood fill purple if the LightWeight is 0
1:30:19Make EndLightingComputation() flood fill purple if the LightWeight is 0
1:30:19Make EndLightingComputation() flood fill purple if the LightWeight is 0
1:30:42See some erroneously purple areas
🏃
1:30:42See some erroneously purple areas
🏃
1:30:42See some erroneously purple areas
🏃
1:31:31Scrutinise EndLightingComputation() for gather bugs
📖
1:31:31Scrutinise EndLightingComputation() for gather bugs
📖
1:31:31Scrutinise EndLightingComputation() for gather bugs
📖
1:32:12Closely look at the erroneously purple areas
🏃
1:32:12Closely look at the erroneously purple areas
🏃
1:32:12Closely look at the erroneously purple areas
🏃
1:32:41Remove the threshold from HasLight() and ensure that EndLightingComputation() can blend down to 0
1:32:41Remove the threshold from HasLight() and ensure that EndLightingComputation() can blend down to 0
1:32:41Remove the threshold from HasLight() and ensure that EndLightingComputation() can blend down to 0
1:34:35Still see our interpolation artifacts
🏃
1:34:35Still see our interpolation artifacts
🏃
1:34:35Still see our interpolation artifacts
🏃
1:36:10Toggle off the final flood filling in EndLightingComputation()
1:36:10Toggle off the final flood filling in EndLightingComputation()
1:36:10Toggle off the final flood filling in EndLightingComputation()
1:36:23Still see our interpolation artifacts
🏃
1:36:23Still see our interpolation artifacts
🏃
1:36:23Still see our interpolation artifacts
🏃
1:36:58Try making EndLightingComputation() regularise our light normals
1:36:58Try making EndLightingComputation() regularise our light normals
1:36:58Try making EndLightingComputation() regularise our light normals
1:37:20See no interpolation bugs
🏃
1:37:20See no interpolation bugs
🏃
1:37:20See no interpolation bugs
🏃
1:37:50Toggle on the final flood filling in EndLightingComputation()
1:37:50Toggle on the final flood filling in EndLightingComputation()
1:37:50Toggle on the final flood filling in EndLightingComputation()
1:38:06See some very bizarre half-lit artifacts
🏃
1:38:06See some very bizarre half-lit artifacts
🏃
1:38:06See some very bizarre half-lit artifacts
🏃
1:39:19Investigate our half-lit artifacts
📖
1:39:19Investigate our half-lit artifacts
📖
1:39:19Investigate our half-lit artifacts
📖
1:40:26Toggle off the whole flood filling code in EndLightingComputation()
1:40:26Toggle off the whole flood filling code in EndLightingComputation()
1:40:26Toggle off the whole flood filling code in EndLightingComputation()
1:40:40Check out our lighting without flood filling, and spot some discontinuity across a wall
🏃
1:40:40Check out our lighting without flood filling, and spot some discontinuity across a wall
🏃
1:40:40Check out our lighting without flood filling, and spot some discontinuity across a wall
🏃
1:41:29Try making EndLightingComputation() regularise our light normals as 0, 0, 1
1:41:29Try making EndLightingComputation() regularise our light normals as 0, 0, 1
1:41:29Try making EndLightingComputation() regularise our light normals as 0, 0, 1
1:42:04Find that this doesn't help us
🏃
1:42:04Find that this doesn't help us
🏃
1:42:04Find that this doesn't help us
🏃
1:42:11Try making EndLightingComputation() regularise our light normals as 0, -1, 0
1:42:11Try making EndLightingComputation() regularise our light normals as 0, -1, 0
1:42:11Try making EndLightingComputation() regularise our light normals as 0, -1, 0
1:42:23Find that our discontinuity has gone
🏃
1:42:23Find that our discontinuity has gone
🏃
1:42:23Find that our discontinuity has gone
🏃
1:42:33Let EndLightingComputation() compute each voxel's normal
1:42:33Let EndLightingComputation() compute each voxel's normal
1:42:33Let EndLightingComputation() compute each voxel's normal
1:42:44Wonder if the discontinuity is due to the normal interpolation being unable to properly swing
🏃
1:42:44Wonder if the discontinuity is due to the normal interpolation being unable to properly swing
🏃
1:42:44Wonder if the discontinuity is due to the normal interpolation being unable to properly swing
🏃
1:42:57Make CompileZBiasProgram() visualise the normal
1:42:57Make CompileZBiasProgram() visualise the normal
1:42:57Make CompileZBiasProgram() visualise the normal
1:44:11Determine that we are getting a 0, 0, 0 normal
🏃
1:44:11Determine that we are getting a 0, 0, 0 normal
🏃
1:44:11Determine that we are getting a 0, 0, 0 normal
🏃
1:44:51Prevent CompileZBiasProgram() from normalising the normal
1:44:51Prevent CompileZBiasProgram() from normalising the normal
1:44:51Prevent CompileZBiasProgram() from normalising the normal
1:45:13Find that the hard-edged 0, 0, 0 normal remains
🏃
1:45:13Find that the hard-edged 0, 0, 0 normal remains
🏃
1:45:13Find that the hard-edged 0, 0, 0 normal remains
🏃
1:45:21Make GetIrradiance() in CompileZBiasProgram() always visualise the normals
1:45:21Make GetIrradiance() in CompileZBiasProgram() always visualise the normals
1:45:21Make GetIrradiance() in CompileZBiasProgram() always visualise the normals
1:46:34Find that the hard-edged 0, 0, 0 normal is gone
🏃
1:46:34Find that the hard-edged 0, 0, 0 normal is gone
🏃
1:46:34Find that the hard-edged 0, 0, 0 normal is gone
🏃
1:46:51Explain the problem when the light and world normals are orthogonal
📖
1:46:51Explain the problem when the light and world normals are orthogonal
📖
1:46:51Explain the problem when the light and world normals are orthogonal
📖
1:47:43Make GetIrradiance() in CompileZBiasProgram() modify its result by the LightDC, and not visualise the normal
1:47:43Make GetIrradiance() in CompileZBiasProgram() modify its result by the LightDC, and not visualise the normal
1:47:43Make GetIrradiance() in CompileZBiasProgram() modify its result by the LightDC, and not visualise the normal
1:48:16Find that our discontinuity remains
🏃
1:48:16Find that our discontinuity remains
🏃
1:48:16Find that our discontinuity remains
🏃
1:48:44Make GetIrradiance() in CompileZBiasProgram() visualise the normal, modified by the LightDC
1:48:44Make GetIrradiance() in CompileZBiasProgram() visualise the normal, modified by the LightDC
1:48:44Make GetIrradiance() in CompileZBiasProgram() visualise the normal, modified by the LightDC
1:49:29Find that our discontinuity remains
🏃
1:49:29Find that our discontinuity remains
🏃
1:49:29Find that our discontinuity remains
🏃
1:49:58Make GetIrradiance() in CompileZBiasProgram() visualise the LightDC
1:49:58Make GetIrradiance() in CompileZBiasProgram() visualise the LightDC
1:49:58Make GetIrradiance() in CompileZBiasProgram() visualise the LightDC
1:50:36See our discontinuity
🏃
1:50:36See our discontinuity
🏃
1:50:36See our discontinuity
🏃
1:50:49Ponder our discontinuity
📖
1:50:49Ponder our discontinuity
📖
1:50:49Ponder our discontinuity
📖
1:51:50Disable trilinear interpolation in OpenGLInit()
1:51:50Disable trilinear interpolation in OpenGLInit()
1:51:50Disable trilinear interpolation in OpenGLInit()
1:52:20Check out our non-interpolated LightDC
🏃
1:52:20Check out our non-interpolated LightDC
🏃
1:52:20Check out our non-interpolated LightDC
🏃
1:53:20Scrutinise GetIrradiance()
📖
1:53:20Scrutinise GetIrradiance()
📖
1:53:20Scrutinise GetIrradiance()
📖
1:54:27Make GetIrradiance() in CompileZBiasProgram() visualise the normal
1:54:27Make GetIrradiance() in CompileZBiasProgram() visualise the normal
1:54:27Make GetIrradiance() in CompileZBiasProgram() visualise the normal
1:54:55See smooth interpolation
🏃
1:54:55See smooth interpolation
🏃
1:54:55See smooth interpolation
🏃
1:55:01Make CompileZBiasProgram() visualise just the normal, without the textures
1:55:01Make CompileZBiasProgram() visualise just the normal, without the textures
1:55:01Make CompileZBiasProgram() visualise just the normal, without the textures
1:55:25Check out our normals, with no – or at least less – discontinuity
🏃
1:55:25Check out our normals, with no – or at least less – discontinuity
🏃
1:55:25Check out our normals, with no – or at least less – discontinuity
🏃
1:57:30Let CompileZBiasProgram() use the textures and not visualise the normals
1:57:30Let CompileZBiasProgram() use the textures and not visualise the normals
1:57:30Let CompileZBiasProgram() use the textures and not visualise the normals
1:57:39Check out our discontinuity
🏃
1:57:39Check out our discontinuity
🏃
1:57:39Check out our discontinuity
🏃
1:58:03Temporarily make CompileZBiasProgram() hard set the LightDC to 0.5
1:58:03Temporarily make CompileZBiasProgram() hard set the LightDC to 0.5
1:58:03Temporarily make CompileZBiasProgram() hard set the LightDC to 0.5
1:58:22Find that our discontinuity has gone
🏃
1:58:22Find that our discontinuity has gone
🏃
1:58:22Find that our discontinuity has gone
🏃
1:59:25Let CompileZBiasProgram() gather in some light from perpendicular sources
1:59:25Let CompileZBiasProgram() gather in some light from perpendicular sources
1:59:25Let CompileZBiasProgram() gather in some light from perpendicular sources
1:59:52Find that our discontinuity has really gone
🏃
1:59:52Find that our discontinuity has really gone
🏃
1:59:52Find that our discontinuity has really gone
🏃
2:01:10Re-enable the flood filling code in EndLightingComputation()
2:01:10Re-enable the flood filling code in EndLightingComputation()
2:01:10Re-enable the flood filling code in EndLightingComputation()
2:01:29See that our flood filling brightens the light
🏃
2:01:29See that our flood filling brightens the light
🏃
2:01:29See that our flood filling brightens the light
🏃
2:01:48Prevent EndLightingComputation() from hard setting the normal to 0, 0, 1
2:01:48Prevent EndLightingComputation() from hard setting the normal to 0, 0, 1
2:01:48Prevent EndLightingComputation() from hard setting the normal to 0, 0, 1
2:02:30See that our flood filling fills in some areas
🏃
2:02:30See that our flood filling fills in some areas
🏃
2:02:30See that our flood filling fills in some areas
🏃
2:03:23Take a close look at our flood filling
🏃
2:03:23Take a close look at our flood filling
🏃
2:03:23Take a close look at our flood filling
🏃
2:04:29Respecify HasLight() as a smoothly varying GetLightAmount() for EndLightingComputation() to use as a multiplier
2:04:29Respecify HasLight() as a smoothly varying GetLightAmount() for EndLightingComputation() to use as a multiplier
2:04:29Respecify HasLight() as a smoothly varying GetLightAmount() for EndLightingComputation() to use as a multiplier
2:07:58Find that our flood fill's popping artifacts have been fixed
🏃
2:07:58Find that our flood fill's popping artifacts have been fixed
🏃
2:07:58Find that our flood fill's popping artifacts have been fixed
🏃
2:08:47Make SpamVoxel() spam out to all voxel slices
2:08:47Make SpamVoxel() spam out to all voxel slices
2:08:47Make SpamVoxel() spam out to all voxel slices
2:09:27Check out the spamming (with flood filling)
🏃
2:09:27Check out the spamming (with flood filling)
🏃
2:09:27Check out the spamming (with flood filling)
🏃
2:09:58Toggle off the flood filling in EndLightingComputation()
2:09:58Toggle off the flood filling in EndLightingComputation()
2:09:58Toggle off the flood filling in EndLightingComputation()
2:10:08Check out the spamming (without flood filling)
🏃
2:10:08Check out the spamming (without flood filling)
🏃
2:10:08Check out the spamming (without flood filling)
🏃
2:11:17Find that the spamming does not capture negative light properly in the outdoor area
🏃
2:11:17Find that the spamming does not capture negative light properly in the outdoor area
🏃
2:11:17Find that the spamming does not capture negative light properly in the outdoor area
🏃
2:11:38Prevent SpamVoxelSlice() from clamping the light's distance falloff to 0 to 1
2:11:38Prevent SpamVoxelSlice() from clamping the light's distance falloff to 0 to 1
2:11:38Prevent SpamVoxelSlice() from clamping the light's distance falloff to 0 to 1
2:11:57See that we're still not getting negative light interpolation
🏃
2:11:57See that we're still not getting negative light interpolation
🏃
2:11:57See that we're still not getting negative light interpolation
🏃
2:12:50Prevent EndLightingComputation() from clamping the light values
2:12:50Prevent EndLightingComputation() from clamping the light values
2:12:50Prevent EndLightingComputation() from clamping the light values
2:13:53See that we're still not getting negative light interpolation
🏃
2:13:53See that we're still not getting negative light interpolation
🏃
2:13:53See that we're still not getting negative light interpolation
🏃
2:14:24Scan the code for any more 0-clamping
📖
2:14:24Scan the code for any more 0-clamping
📖
2:14:24Scan the code for any more 0-clamping
📖
2:15:40Make CompileZBiasProgram() draw negative values in red
2:15:40Make CompileZBiasProgram() draw negative values in red
2:15:40Make CompileZBiasProgram() draw negative values in red
2:16:22See no negative values
🏃
2:16:22See no negative values
🏃
2:16:22See no negative values
🏃
2:16:44Scan the code for any more 0-clamping
📖
2:16:44Scan the code for any more 0-clamping
📖
2:16:44Scan the code for any more 0-clamping
📖
2:18:06Add an assertion in SpamVoxelSlice that LightDF >= 0.0f
2:18:06Add an assertion in SpamVoxelSlice that LightDF >= 0.0f
2:18:06Add an assertion in SpamVoxelSlice that LightDF >= 0.0f
2:18:37Fail to hit that assertion
🏃
2:18:37Fail to hit that assertion
🏃
2:18:37Fail to hit that assertion
🏃
2:18:43Scrutinise the LightDF calculation in SpamVoxelSlice()
📖
2:18:43Scrutinise the LightDF calculation in SpamVoxelSlice()
📖
2:18:43Scrutinise the LightDF calculation in SpamVoxelSlice()
📖
2:20:50Run the game afresh and successfully hit our assertion in SpamVoxelSlice()
🏃
2:20:50Run the game afresh and successfully hit our assertion in SpamVoxelSlice()
🏃
2:20:50Run the game afresh and successfully hit our assertion in SpamVoxelSlice()
🏃
2:20:53Comment out the assertion in SpamVoxelSlice()
2:20:53Comment out the assertion in SpamVoxelSlice()
2:20:53Comment out the assertion in SpamVoxelSlice()
2:21:07Take another look at our non-interpolation of negative light
🏃
2:21:07Take another look at our non-interpolation of negative light
🏃
2:21:07Take another look at our non-interpolation of negative light
🏃
2:21:44Make TestCastFromProbes() fall-off the light more steeply
2:21:44Make TestCastFromProbes() fall-off the light more steeply
2:21:44Make TestCastFromProbes() fall-off the light more steeply
2:21:57Admire our steeper light falloff, and wonder where our stair-step pattern is coming from
🏃
2:21:57Admire our steeper light falloff, and wonder where our stair-step pattern is coming from
🏃
2:21:57Admire our steeper light falloff, and wonder where our stair-step pattern is coming from
🏃
2:23:03Prevent CompileZBiasProgram() from drawing negative values in red
2:23:03Prevent CompileZBiasProgram() from drawing negative values in red
2:23:03Prevent CompileZBiasProgram() from drawing negative values in red
2:23:12Consider our entire falloff to not be that smooth
🏃
2:23:12Consider our entire falloff to not be that smooth
🏃
2:23:12Consider our entire falloff to not be that smooth
🏃
2:23:35Try making SpamVoxelSlice() set the light's alpha to the LightDF squared
2:23:35Try making SpamVoxelSlice() set the light's alpha to the LightDF squared
2:23:35Try making SpamVoxelSlice() set the light's alpha to the LightDF squared
2:24:33Admire our ring of light falloff
🏃
2:24:33Admire our ring of light falloff
🏃
2:24:33Admire our ring of light falloff
🏃
2:24:51Make SpamVoxelSlice() preserve the sign of the LightDF
2:24:51Make SpamVoxelSlice() preserve the sign of the LightDF
2:24:51Make SpamVoxelSlice() preserve the sign of the LightDF
2:25:03Check out our hard light falloff
🏃
2:25:03Check out our hard light falloff
🏃
2:25:03Check out our hard light falloff
🏃
2:25:18Try making SpamVoxelSlice() set the light's alpha to the LightDF square-root
2:25:18Try making SpamVoxelSlice() set the light's alpha to the LightDF square-root
2:25:18Try making SpamVoxelSlice() set the light's alpha to the LightDF square-root
2:25:32Check out our hard light falloff
🏃
2:25:32Check out our hard light falloff
🏃
2:25:32Check out our hard light falloff
🏃
2:25:38Revert SpamVoxelSlice() to setting the light's alpha to the LightDF
2:25:38Revert SpamVoxelSlice() to setting the light's alpha to the LightDF
2:25:38Revert SpamVoxelSlice() to setting the light's alpha to the LightDF
2:25:51Check out our hard light falloff
🏃
2:25:51Check out our hard light falloff
🏃
2:25:51Check out our hard light falloff
🏃
2:26:04Determine that we are doing ShaderSimTexWriteSRGB
📖
2:26:04Determine that we are doing ShaderSimTexWriteSRGB
📖
2:26:04Determine that we are doing ShaderSimTexWriteSRGB
📖
2:27:45Temporarily prevent CompileZBiasProgram() from square-rooting the SurfaceReflect
2:27:45Temporarily prevent CompileZBiasProgram() from square-rooting the SurfaceReflect
2:27:45Temporarily prevent CompileZBiasProgram() from square-rooting the SurfaceReflect
2:28:12See that our light falloff is much smoother
🏃
2:28:12See that our light falloff is much smoother
🏃
2:28:12See that our light falloff is much smoother
🏃
2:28:29Revert CompileZBiasProgram() to square-rooting the SurfaceReflect, and try making SpamVoxelSlice() set the LightDist to LightN squared
2:28:29Revert CompileZBiasProgram() to square-rooting the SurfaceReflect, and try making SpamVoxelSlice() set the LightDist to LightN squared
2:28:29Revert CompileZBiasProgram() to square-rooting the SurfaceReflect, and try making SpamVoxelSlice() set the LightDist to LightN squared
2:29:32See a bizarrely octagonal light falloff
🏃
2:29:32See a bizarrely octagonal light falloff
🏃
2:29:32See a bizarrely octagonal light falloff
🏃
2:29:41Our problem: The falloff interpolation is being interpreted linearly
📖
2:29:41Our problem: The falloff interpolation is being interpreted linearly
📖
2:29:41Our problem: The falloff interpolation is being interpreted linearly
📖
2:31:13Revert SpamVoxelSlice() to not square the LightN, and instead make GetIrradiance() in CompileZBiasProgram() square the LightV when setting the LightColor, introducing Square()
2:31:13Revert SpamVoxelSlice() to not square the LightN, and instead make GetIrradiance() in CompileZBiasProgram() square the LightV when setting the LightColor, introducing Square()
2:31:13Revert SpamVoxelSlice() to not square the LightN, and instead make GetIrradiance() in CompileZBiasProgram() square the LightV when setting the LightColor, introducing Square()
2:32:53Make SpamVoxelSlice() square the LightN when setting the LightDist, and GetIrradiance() in CompileZBiasProgram() preserve the sign3
2:32:53Make SpamVoxelSlice() square the LightN when setting the LightDist, and GetIrradiance() in CompileZBiasProgram() preserve the sign3
2:32:53Make SpamVoxelSlice() square the LightN when setting the LightDist, and GetIrradiance() in CompileZBiasProgram() preserve the sign3
2:35:12See our brighter light
🏃
2:35:12See our brighter light
🏃
2:35:12See our brighter light
🏃
2:36:30Fix the sign-preservation in GetIrradiance() in CompileZBiasProgram()
2:36:30Fix the sign-preservation in GetIrradiance() in CompileZBiasProgram()
2:36:30Fix the sign-preservation in GetIrradiance() in CompileZBiasProgram()
2:36:44See our falloff
🏃
2:36:44See our falloff
🏃
2:36:44See our falloff
🏃
2:37:13Make SpamVoxelSlice() square-root the LightC0, introducing SignedSquareRoot()
2:37:13Make SpamVoxelSlice() square-root the LightC0, introducing SignedSquareRoot()
2:37:13Make SpamVoxelSlice() square-root the LightC0, introducing SignedSquareRoot()
2:38:23Admire our softer falloff
🏃
2:38:23Admire our softer falloff
🏃
2:38:23Admire our softer falloff
🏃
2:38:38Make TestCastFromProbes() fall-off the light more gradually
2:38:38Make TestCastFromProbes() fall-off the light more gradually
2:38:38Make TestCastFromProbes() fall-off the light more gradually
2:39:03Admire our softer, yet wobbly falloff
🏃
2:39:03Admire our softer, yet wobbly falloff
🏃
2:39:03Admire our softer, yet wobbly falloff
🏃
2:39:36Make TestCastFromProbes() darken the LightC
2:39:36Make TestCastFromProbes() darken the LightC
2:39:36Make TestCastFromProbes() darken the LightC
2:39:45Admire our darker light, but doubt that the falloff is softer
🏃
2:39:45Admire our darker light, but doubt that the falloff is softer
🏃
2:39:45Admire our darker light, but doubt that the falloff is softer
🏃
2:41:00Make TestCastFromProbes() further darken the LightC
2:41:00Make TestCastFromProbes() further darken the LightC
2:41:00Make TestCastFromProbes() further darken the LightC
2:41:03Admire our darker light
🏃
2:41:03Admire our darker light
🏃
2:41:03Admire our darker light
🏃
2:41:26Toggle off the square-rooting / squaring
2:41:26Toggle off the square-rooting / squaring
2:41:26Toggle off the square-rooting / squaring
2:42:03Check out our less gradual light falloff
🏃
2:42:03Check out our less gradual light falloff
🏃
2:42:03Check out our less gradual light falloff
🏃
2:42:52Make TestCastFromProbes() brighten the LightC
2:42:52Make TestCastFromProbes() brighten the LightC
2:42:52Make TestCastFromProbes() brighten the LightC
2:43:04Check out our brighter and less gradual light falloff
🏃
2:43:04Check out our brighter and less gradual light falloff
🏃
2:43:04Check out our brighter and less gradual light falloff
🏃
2:44:16Q&A
🗩
2:44:16Q&A
🗩
2:44:16Q&A
🗩
2:44:49cemuzunlar Q: Solution->HasCornerI.x + X + 2*dZ
🗪
2:44:49cemuzunlar Q: Solution->HasCornerI.x + X + 2*dZ
🗪
2:44:49cemuzunlar Q: Solution->HasCornerI.x + X + 2*dZ
🗪
2:45:10Fix typo in EndLightingComputation() and toggle on the flood filling
2:45:10Fix typo in EndLightingComputation() and toggle on the flood filling
2:45:10Fix typo in EndLightingComputation() and toggle on the flood filling
2:45:25Check out the blotchy flood filling
🏃
2:45:25Check out the blotchy flood filling
🏃
2:45:25Check out the blotchy flood filling
🏃
2:46:15Toggle off flood filling
2:46:15Toggle off flood filling
2:46:15Toggle off flood filling
2:46:23Consider our flood filling not to be close to working
🏃
2:46:23Consider our flood filling not to be close to working
🏃
2:46:23Consider our flood filling not to be close to working
🏃
2:47:040lpbm Damn, it wasn't that
🗪
2:47:040lpbm Damn, it wasn't that
🗪
2:47:040lpbm Damn, it wasn't that
🗪
2:48:29Wrap it up
🗩
2:48:29Wrap it up
🗩
2:48:29Wrap it up
🗩