Handmade Hero»Episode Guide
Streamlining the New Lighting Pipeline
?
?

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:04Recap and set the stage for the day debugging and streamlining our lighting
🗩
0:04Recap and set the stage for the day debugging and streamlining our lighting
🗩
0:04Recap and set the stage for the day debugging and streamlining our lighting
🗩
4:41Launch the game, with continued thoughts on hardware rendering
🏃
4:41Launch the game, with continued thoughts on hardware rendering
🏃
4:41Launch the game, with continued thoughts on hardware rendering
🏃
5:15Demo our diffuse lighting, considering disabling it for the debug overlay
🏃
5:15Demo our diffuse lighting, considering disabling it for the debug overlay
🏃
5:15Demo our diffuse lighting, considering disabling it for the debug overlay
🏃
7:15Set up to thread the whole of EndLightingComputation()
📖
7:15Set up to thread the whole of EndLightingComputation()
📖
7:15Set up to thread the whole of EndLightingComputation()
📖
10:03Draw the voxels in TestLightSphere()
10:03Draw the voxels in TestLightSphere()
10:03Draw the voxels in TestLightSphere()
10:19Show the voxels
🏃
10:19Show the voxels
🏃
10:19Show the voxels
🏃
10:45Determine that Global_Lighting_ShowProbes controls the probe drawing
📖
10:45Determine that Global_Lighting_ShowProbes controls the probe drawing
📖
10:45Determine that Global_Lighting_ShowProbes controls the probe drawing
📖
10:51Consult the debug overlay for the ShowProbes toggle
🏃
10:51Consult the debug overlay for the ShowProbes toggle
🏃
10:51Consult the debug overlay for the ShowProbes toggle
🏃
11:18Set Global_Lighting_ShowProbes to true
11:18Set Global_Lighting_ShowProbes to true
11:18Set Global_Lighting_ShowProbes to true
11:27Show, explain and consider pulling the light probes
🏃
11:27Show, explain and consider pulling the light probes
🏃
11:27Show, explain and consider pulling the light probes
🏃
13:28Remove LightProbeCount and LightProbeP from lighting_solution, and propagate this removal
13:28Remove LightProbeCount and LightProbeP from lighting_solution, and propagate this removal
13:28Remove LightProbeCount and LightProbeP from lighting_solution, and propagate this removal
14:09Our mistake: Making Z primal
🗩
14:09Our mistake: Making Z primal
🗩
14:09Our mistake: Making Z primal
🗩
16:47Replace OnePastLastLightProbeIndex with VoxelX in lighting_work (i.e. making X primal), and continue to switch ComputeLightPropagation() away from light probes to a voxel-direct, X slice-based scheme
16:47Replace OnePastLastLightProbeIndex with VoxelX in lighting_work (i.e. making X primal), and continue to switch ComputeLightPropagation() away from light probes to a voxel-direct, X slice-based scheme
16:47Replace OnePastLastLightProbeIndex with VoxelX in lighting_work (i.e. making X primal), and continue to switch ComputeLightPropagation() away from light probes to a voxel-direct, X slice-based scheme
23:24Consider the potentially increased cache-friendliness of our voxel-direct scheme
🗩
23:24Consider the potentially increased cache-friendliness of our voxel-direct scheme
🗩
23:24Consider the potentially increased cache-friendliness of our voxel-direct scheme
🗩
24:52Switch ComputeLightPropagationWork() to our voxel-direct scheme
24:52Switch ComputeLightPropagationWork() to our voxel-direct scheme
24:52Switch ComputeLightPropagationWork() to our voxel-direct scheme
36:36Augment lighting_work with SamplePointEntropy and LightPointEntropy for ComputeLightPropagation() to set
36:36Augment lighting_work with SamplePointEntropy and LightPointEntropy for ComputeLightPropagation() to set
36:36Augment lighting_work with SamplePointEntropy and LightPointEntropy for ComputeLightPropagation() to set
38:52Continue to switch ComputeLightPropagationWork() to our voxel-direct scheme
38:52Continue to switch ComputeLightPropagationWork() to our voxel-direct scheme
38:52Continue to switch ComputeLightPropagationWork() to our voxel-direct scheme
40:11Augment lighting_solution with a game_render_commands pointer, for ComputeLightPropagation() to take
40:11Augment lighting_solution with a game_render_commands pointer, for ComputeLightPropagation() to take
40:11Augment lighting_solution with a game_render_commands pointer, for ComputeLightPropagation() to take
41:38Continue to switch ComputeLightPropagationWork() to our voxel-direct scheme, making it call TestLightSphere()
41:38Continue to switch ComputeLightPropagationWork() to our voxel-direct scheme, making it call TestLightSphere()
41:38Continue to switch ComputeLightPropagationWork() to our voxel-direct scheme, making it call TestLightSphere()
44:12Weld ComputeLightPropagation() in to EndLightingComputation(), and replace TestCastFromProbes() with a voxel-direct TestCast()
44:12Weld ComputeLightPropagation() in to EndLightingComputation(), and replace TestCastFromProbes() with a voxel-direct TestCast()
44:12Weld ComputeLightPropagation() in to EndLightingComputation(), and replace TestCastFromProbes() with a voxel-direct TestCast()
49:40Introduce FullCast(), respecifying SpamVoxel() as UpdateVoxel()
49:40Introduce FullCast(), respecifying SpamVoxel() as UpdateVoxel()
49:40Introduce FullCast(), respecifying SpamVoxel() as UpdateVoxel()
57:21Rename TestLightSphere() to TestSphere(), updating it to our voxel-direct scheme
57:21Rename TestLightSphere() to TestSphere(), updating it to our voxel-direct scheme
57:21Rename TestLightSphere() to TestSphere(), updating it to our voxel-direct scheme
1:01:22Clean up compile errors in ComputeLightPropagationWork()
1:01:22Clean up compile errors in ComputeLightPropagationWork()
1:01:22Clean up compile errors in ComputeLightPropagationWork()
1:02:14Remove InLargeVoxel(), GetVoxelIndex(), GetVoxelCenterP(), SignedSquareRoot() and GetLightAmount(), and weld GetIrradiance() in to ComputeVoxelIrradianceAt()
1:02:14Remove InLargeVoxel(), GetVoxelIndex(), GetVoxelCenterP(), SignedSquareRoot() and GetLightAmount(), and weld GetIrradiance() in to ComputeVoxelIrradianceAt()
1:02:14Remove InLargeVoxel(), GetVoxelIndex(), GetVoxelCenterP(), SignedSquareRoot() and GetLightAmount(), and weld GetIrradiance() in to ComputeVoxelIrradianceAt()
1:07:37Hit assertion in EndLightingComputation()
🏃
1:07:37Hit assertion in EndLightingComputation()
🏃
1:07:37Hit assertion in EndLightingComputation()
🏃
1:08:08Change lighting_work in lighting_solution to be a pointer, allocated by InitLighting(), and remove AccumulatedPPS
1:08:08Change lighting_work in lighting_solution to be a pointer, allocated by InitLighting(), and remove AccumulatedPPS
1:08:08Change lighting_work in lighting_solution to be a pointer, allocated by InitLighting(), and remove AccumulatedPPS
1:09:31Run slowly
🏃
1:09:31Run slowly
🏃
1:09:31Run slowly
🏃
1:09:59Restrict ComputeLightPropagationWork() to loop over only one Z-slice
1:09:59Restrict ComputeLightPropagationWork() to loop over only one Z-slice
1:09:59Restrict ComputeLightPropagationWork() to loop over only one Z-slice
1:10:55See nothing lit
🏃
1:10:55See nothing lit
🏃
1:10:55See nothing lit
🏃
1:11:19Scour TestSphere() for bugs
📖
1:11:19Scour TestSphere() for bugs
📖
1:11:19Scour TestSphere() for bugs
📖
1:12:07Remove InvHotDim from TestSphere() and switch it to set the LightC based directly on the light's direction
1:12:07Remove InvHotDim from TestSphere() and switch it to set the LightC based directly on the light's direction
1:12:07Remove InvHotDim from TestSphere() and switch it to set the LightC based directly on the light's direction
1:12:25See our lit world
🏃
1:12:25See our lit world
🏃
1:12:25See our lit world
🏃
1:12:41Reduce the brightness of the direction-based lighting in TestSphere()
1:12:41Reduce the brightness of the direction-based lighting in TestSphere()
1:12:41Reduce the brightness of the direction-based lighting in TestSphere()
1:13:11See our diffusely lit world
🏃
1:13:11See our diffusely lit world
🏃
1:13:11See our diffusely lit world
🏃
1:13:44Make EndLightingComputation() add the ComputeLightPropagationWork() calls to our queue
1:13:44Make EndLightingComputation() add the ComputeLightPropagationWork() calls to our queue
1:13:44Make EndLightingComputation() add the ComputeLightPropagationWork() calls to our queue
1:14:09See our diffusely and multithreaded lit world
🏃
1:14:09See our diffusely and multithreaded lit world
🏃
1:14:09See our diffusely and multithreaded lit world
🏃
1:14:23Set Global_Lighting_ShowProbes to false
1:14:23Set Global_Lighting_ShowProbes to false
1:14:23Set Global_Lighting_ShowProbes to false
1:15:13See our lit world, spotting a hole in our light map, and check our performance
🏃
1:15:13See our lit world, spotting a hole in our light map, and check our performance
🏃
1:15:13See our lit world, spotting a hole in our light map, and check our performance
🏃
1:16:50Switch TestSphere() back to set the LightC as computed, fixing that actual computation to not be done in UV-space
1:16:50Switch TestSphere() back to set the LightC as computed, fixing that actual computation to not be done in UV-space
1:16:50Switch TestSphere() back to set the LightC as computed, fixing that actual computation to not be done in UV-space
1:18:39Admire our light
🏃
1:18:39Admire our light
🏃
1:18:39Admire our light
🏃
1:19:39Make CompileZBiasProgram() fall-off the lighting not quite to black, to hide the voxelisation
1:19:39Make CompileZBiasProgram() fall-off the lighting not quite to black, to hide the voxelisation
1:19:39Make CompileZBiasProgram() fall-off the lighting not quite to black, to hide the voxelisation
1:21:17Admire our less apparently voxelised lighting
🏃
🖮
1:21:17Admire our less apparently voxelised lighting
🏃
🖮
1:21:17Admire our less apparently voxelised lighting
🏃
🖮
1:23:18Switch ComputeLightPropagationWork() to TEST_CAST
1:23:18Switch ComputeLightPropagationWork() to TEST_CAST
1:23:18Switch ComputeLightPropagationWork() to TEST_CAST
1:23:47Hit a write-access violation in GetLightLeafForP()
🏃
1:23:47Hit a write-access violation in GetLightLeafForP()
🏃
1:23:47Hit a write-access violation in GetLightLeafForP()
🏃
1:24:24Prevent TestCast() from asking GetLightLeafForP() to draw the voxel hierarchy, because PushDebugLine() is not thread-safe
1:24:24Prevent TestCast() from asking GetLightLeafForP() to draw the voxel hierarchy, because PushDebugLine() is not thread-safe
1:24:24Prevent TestCast() from asking GetLightLeafForP() to draw the voxel hierarchy, because PushDebugLine() is not thread-safe
1:24:51Admire our ray-cast lighting
🏃
1:24:51Admire our ray-cast lighting
🏃
1:24:51Admire our ray-cast lighting
🏃
1:25:03Increase the light brightness in TestCast()
1:25:03Increase the light brightness in TestCast()
1:25:03Increase the light brightness in TestCast()
1:25:11Admire our brighter ray-cast lighting, with misaligned voxel
🏃
1:25:11Admire our brighter ray-cast lighting, with misaligned voxel
🏃
1:25:11Admire our brighter ray-cast lighting, with misaligned voxel
🏃
1:26:51Reflect on the slow performance of our lighting solution
🗩
1:26:51Reflect on the slow performance of our lighting solution
🗩
1:26:51Reflect on the slow performance of our lighting solution
🗩
1:27:51Q&A
🗩
1:27:51Q&A
🗩
1:27:51Q&A
🗩
1:28:39somebody_took_my_name Q: You don't assign the clamp of S back to S in the shader. And is there a bug in the octahedral map? I mean the black pixels in the corners and the line just below
🗪
1:28:39somebody_took_my_name Q: You don't assign the clamp of S back to S in the shader. And is there a bug in the octahedral map? I mean the black pixels in the corners and the line just below
🗪
1:28:39somebody_took_my_name Q: You don't assign the clamp of S back to S in the shader. And is there a bug in the octahedral map? I mean the black pixels in the corners and the line just below
🗪
1:28:46Fix CompileZBiasProgram() to set S
1:28:46Fix CompileZBiasProgram() to set S
1:28:46Fix CompileZBiasProgram() to set S
1:28:57Admire our lighting
🏃
1:28:57Admire our lighting
🏃
1:28:57Admire our lighting
🏃
1:29:33mattiamanzati Q: Shouldn't wall side be in light state at the moment?
🗪
1:29:33mattiamanzati Q: Shouldn't wall side be in light state at the moment?
🗪
1:29:33mattiamanzati Q: Shouldn't wall side be in light state at the moment?
🗪
1:29:520lpbm Q: If we like the voxelized light, can we keep it?
🗪
1:29:520lpbm Q: If we like the voxelized light, can we keep it?
🗪
1:29:520lpbm Q: If we like the voxelized light, can we keep it?
🗪
1:30:07Comment out the "voxel-smoothing" code in CompileZBiasProgram()
1:30:07Comment out the "voxel-smoothing" code in CompileZBiasProgram()
1:30:07Comment out the "voxel-smoothing" code in CompileZBiasProgram()
1:30:12Show the apparently voxelised lighting
🏃
1:30:12Show the apparently voxelised lighting
🏃
1:30:12Show the apparently voxelised lighting
🏃
1:30:25Let CompileZBiasProgram() smooth out the voxelisation
1:30:25Let CompileZBiasProgram() smooth out the voxelisation
1:30:25Let CompileZBiasProgram() smooth out the voxelisation
1:30:43duckbillphil Q: Can you show the disassembly of Transpose() in optimized build
🗪
1:30:43duckbillphil Q: Can you show the disassembly of Transpose() in optimized build
🗪
1:30:43duckbillphil Q: Can you show the disassembly of Transpose() in optimized build
🗪
1:32:00Check the assembly of Transpose()
🏃
1:32:00Check the assembly of Transpose()
🏃
1:32:00Check the assembly of Transpose()
🏃
1:36:40uplinkcoder Q: Can you zoom out on the octahedral debug drawing?
🗪
1:36:40uplinkcoder Q: Can you zoom out on the octahedral debug drawing?
🗪
1:36:40uplinkcoder Q: Can you zoom out on the octahedral debug drawing?
🗪
1:36:47ablindorphan Q: Why does the clamped light have a kind of heart shape from some angles with the sphere lighting (two lobes jutting out behind the hero to his left and right when viewing from a low angle)?
🗪
1:36:47ablindorphan Q: Why does the clamped light have a kind of heart shape from some angles with the sphere lighting (two lobes jutting out behind the hero to his left and right when viewing from a low angle)?
🗪
1:36:47ablindorphan Q: Why does the clamped light have a kind of heart shape from some angles with the sphere lighting (two lobes jutting out behind the hero to his left and right when viewing from a low angle)?
🗪
1:37:34xxthebigfoxx Q: Maybe you fixed it up already but I think you might have a copy-paste error in the border fill. If you look at the sphere test the octahedral maps show a weird black line on each
🗪
1:37:34xxthebigfoxx Q: Maybe you fixed it up already but I think you might have a copy-paste error in the border fill. If you look at the sphere test the octahedral maps show a weird black line on each
🗪
1:37:34xxthebigfoxx Q: Maybe you fixed it up already but I think you might have a copy-paste error in the border fill. If you look at the sphere test the octahedral maps show a weird black line on each
🗪
1:38:15Hunt the orphanage for border copies
🏃
1:38:15Hunt the orphanage for border copies
🏃
1:38:15Hunt the orphanage for border copies
🏃
1:38:48Toggle on EDGE_COLORING in ComputeLightPropagationWork()
1:38:48Toggle on EDGE_COLORING in ComputeLightPropagationWork()
1:38:48Toggle on EDGE_COLORING in ComputeLightPropagationWork()
1:39:11View the light map
🏃
1:39:11View the light map
🏃
1:39:11View the light map
🏃
1:39:38Make a note in ComputeLightPropagationWork() to verify the border copies
1:39:38Make a note in ComputeLightPropagationWork() to verify the border copies
1:39:38Make a note in ComputeLightPropagationWork() to verify the border copies
1:40:30rooctag Q: How will you light the top of the “walls” but make them block light in the middle?
🗪
1:40:30rooctag Q: How will you light the top of the “walls” but make them block light in the middle?
🗪
1:40:30rooctag Q: How will you light the top of the “walls” but make them block light in the middle?
🗪
1:40:42Check the wall lighting
🏃
1:40:42Check the wall lighting
🏃
1:40:42Check the wall lighting
🏃
1:41:21Switch ComputeLightPropagationWork() to TEST_SPHERE
1:41:21Switch ComputeLightPropagationWork() to TEST_SPHERE
1:41:21Switch ComputeLightPropagationWork() to TEST_SPHERE
1:41:34See that the wall uprights are now lit
🏃
1:41:34See that the wall uprights are now lit
🏃
1:41:34See that the wall uprights are now lit
🏃
1:42:28Switch ComputeLightPropagationWork() to TEST_CAST
1:42:28Switch ComputeLightPropagationWork() to TEST_CAST
1:42:28Switch ComputeLightPropagationWork() to TEST_CAST
1:42:36See that the wall uprights are incorrectly lit
🏃
1:42:36See that the wall uprights are incorrectly lit
🏃
1:42:36See that the wall uprights are incorrectly lit
🏃
1:43:45rooctag Q: Just wondered how you would light the wooden top? Or will that be the moon?
🗪
1:43:45rooctag Q: Just wondered how you would light the wooden top? Or will that be the moon?
🗪
1:43:45rooctag Q: Just wondered how you would light the wooden top? Or will that be the moon?
🗪
1:44:22sahfortv Q: I didn't follow what the next step is. I assume you want to merge the test sphere and test cast into their final form. Is that correct?
🗪
1:44:22sahfortv Q: I didn't follow what the next step is. I assume you want to merge the test sphere and test cast into their final form. Is that correct?
🗪
1:44:22sahfortv Q: I didn't follow what the next step is. I assume you want to merge the test sphere and test cast into their final form. Is that correct?
🗪
1:45:13ttbjm Q: Are you planning in putting in tone mapping?
🗪
1:45:13ttbjm Q: Are you planning in putting in tone mapping?
🗪
1:45:13ttbjm Q: Are you planning in putting in tone mapping?
🗪
1:45:53ablindorphan Q: Does it take a significant amount of time to switch head spaces between different programming projects for you (e.g. between Handmade Hero and 1935), and do you have any techniques that you use to re-familiarise yourself about an old project that you haven't worked on in a while?
🗪
1:45:53ablindorphan Q: Does it take a significant amount of time to switch head spaces between different programming projects for you (e.g. between Handmade Hero and 1935), and do you have any techniques that you use to re-familiarise yourself about an old project that you haven't worked on in a while?
🗪
1:45:53ablindorphan Q: Does it take a significant amount of time to switch head spaces between different programming projects for you (e.g. between Handmade Hero and 1935), and do you have any techniques that you use to re-familiarise yourself about an old project that you haven't worked on in a while?
🗪
1:46:57That looks like it
🗩
1:46:57That looks like it
🗩
1:46:57That looks like it
🗩