Handmade Hero»Episode Guide
Scrolling the Lighting Voxel
?
?

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: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:19Demo the current state of our lighting solution
🏃
1:19Demo the current state of our lighting solution
🏃
1:19Demo the current state of our lighting solution
🏃
3:27Switch to the test sphere path in EndLightingComputation()
3:27Switch to the test sphere path in EndLightingComputation()
3:27Switch to the test sphere path in EndLightingComputation()
5:23Demo our test light-field interpolation
🏃
5:23Demo our test light-field interpolation
🏃
5:23Demo our test light-field interpolation
🏃
6:19Disable trilinear blending in OpenGLInit()
6:19Disable trilinear blending in OpenGLInit()
6:19Disable trilinear blending in OpenGLInit()
7:13Demo the coarseness of our lighting storage resolution
🏃
7:13Demo the coarseness of our lighting storage resolution
🏃
7:13Demo the coarseness of our lighting storage resolution
🏃
7:36Re-enable trilinear blending in OpenGLInit()
7:36Re-enable trilinear blending in OpenGLInit()
7:36Re-enable trilinear blending in OpenGLInit()
7:54Demo our beguilingly smooth test light-field interpolation
🏃
7:54Demo our beguilingly smooth test light-field interpolation
🏃
7:54Demo our beguilingly smooth test light-field interpolation
🏃
8:44Switch to the test transfer path in EndLightingComputation()
8:44Switch to the test transfer path in EndLightingComputation()
8:44Switch to the test transfer path in EndLightingComputation()
8:51Briefly demo our ray casting to the closest light source
🏃
8:51Briefly demo our ray casting to the closest light source
🏃
8:51Briefly demo our ray casting to the closest light source
🏃
9:13Describe TestCastFromProbes()
📖
9:13Describe TestCastFromProbes()
📖
9:13Describe TestCastFromProbes()
📖
10:30Make TestCastFromProbes() only use the light above the hero's head, to aid testing
10:30Make TestCastFromProbes() only use the light above the hero's head, to aid testing
10:30Make TestCastFromProbes() only use the light above the hero's head, to aid testing
10:51Demo the ray casting to our single light source, considering blending of light sources and secondary bounces
🏃
10:51Demo the ray casting to our single light source, considering blending of light sources and secondary bounces
🏃
10:51Demo the ray casting to our single light source, considering blending of light sources and secondary bounces
🏃
15:22Embark on delayed light blending, first preventing TestCastFromProbes() from clearing the voxel of lighting information
15:22Embark on delayed light blending, first preventing TestCastFromProbes() from clearing the voxel of lighting information
15:22Embark on delayed light blending, first preventing TestCastFromProbes() from clearing the voxel of lighting information
15:50See that our light stops getting updated in areas we leave
🏃
15:50See that our light stops getting updated in areas we leave
🏃
15:50See that our light stops getting updated in areas we leave
🏃
16:38Make TestCastFromProbes() and SpamVoxelSlice() decay and accumulate light across frames, augmenting lighting_solution with IrrBlendU and IrrBlendV
16:38Make TestCastFromProbes() and SpamVoxelSlice() decay and accumulate light across frames, augmenting lighting_solution with IrrBlendU and IrrBlendV
16:38Make TestCastFromProbes() and SpamVoxelSlice() decay and accumulate light across frames, augmenting lighting_solution with IrrBlendU and IrrBlendV
21:38Check out our delayed, but over-bright lighting
🏃
21:38Check out our delayed, but over-bright lighting
🏃
21:38Check out our delayed, but over-bright lighting
🏃
22:16On the need to weight our light accumulation to prevent over-brightness
22:16On the need to weight our light accumulation to prevent over-brightness
22:16On the need to weight our light accumulation to prevent over-brightness
24:26Introduce light_computation_cell for lighting_solution to contain as NewCells, augmenting light_voxel_cell with TotalWeight, LightCAccumulator and LightNAccumulator
24:26Introduce light_computation_cell for lighting_solution to contain as NewCells, augmenting light_voxel_cell with TotalWeight, LightCAccumulator and LightNAccumulator
24:26Introduce light_computation_cell for lighting_solution to contain as NewCells, augmenting light_voxel_cell with TotalWeight, LightCAccumulator and LightNAccumulator
26:24Make TestCastFromProbes() stably accumulate, blend and clear our lighting across frames, and SpamVoxelSlice() preserve the weighting
26:24Make TestCastFromProbes() stably accumulate, blend and clear our lighting across frames, and SpamVoxelSlice() preserve the weighting
26:24Make TestCastFromProbes() stably accumulate, blend and clear our lighting across frames, and SpamVoxelSlice() preserve the weighting
31:13Check out our lagged and not over-bright light blending
🏃
31:13Check out our lagged and not over-bright light blending
🏃
31:13Check out our lagged and not over-bright light blending
🏃
32:18Let TestCastFromProbes() ray cast from the entire spatial hierarchy
32:18Let TestCastFromProbes() ray cast from the entire spatial hierarchy
32:18Let TestCastFromProbes() ray cast from the entire spatial hierarchy
32:33Check out our (incorrect) blending of multiple light sources, noting that our lighting voxel is not pinned to the world
🏃
32:33Check out our (incorrect) blending of multiple light sources, noting that our lighting voxel is not pinned to the world
🏃
32:33Check out our (incorrect) blending of multiple light sources, noting that our lighting voxel is not pinned to the world
🏃
35:10Reacquaint ourselves with BeginLightingComputation()
📖
35:10Reacquaint ourselves with BeginLightingComputation()
📖
35:10Reacquaint ourselves with BeginLightingComputation()
📖
35:39Check out our two lighting voxel bounds
🏃
35:39Check out our two lighting voxel bounds
🏃
35:39Check out our two lighting voxel bounds
🏃
37:08Scrolling the Lighting Voxel: Aligning and pinning it to the world
📖
37:08Scrolling the Lighting Voxel: Aligning and pinning it to the world
📖
37:08Scrolling the Lighting Voxel: Aligning and pinning it to the world
📖
40:06Enable the checkerboard path in EndLightingComputation(), and disable trilinear filtering in OpenGLInit()
40:06Enable the checkerboard path in EndLightingComputation(), and disable trilinear filtering in OpenGLInit()
40:06Enable the checkerboard path in EndLightingComputation(), and disable trilinear filtering in OpenGLInit()
40:50Check out the varying alignment of our light voxel in the world
🏃
40:50Check out the varying alignment of our light voxel in the world
🏃
40:50Check out the varying alignment of our light voxel in the world
🏃
42:39Make BeginLightingComputation() align our light voxel in the world
42:39Make BeginLightingComputation() align our light voxel in the world
42:39Make BeginLightingComputation() align our light voxel in the world
44:52Check out our consistently aligned light voxel in the world
🏃
44:52Check out our consistently aligned light voxel in the world
🏃
44:52Check out our consistently aligned light voxel in the world
🏃
45:23Spot some possible X-fighting or a voxel edge sampling bug
🏃
45:23Spot some possible X-fighting or a voxel edge sampling bug
🏃
45:23Spot some possible X-fighting or a voxel edge sampling bug
🏃
46:17Distinguish between voxel–world alignment and placement consistency
🏃
46:17Distinguish between voxel–world alignment and placement consistency
🏃
46:17Distinguish between voxel–world alignment and placement consistency
🏃
47:38Switch to the test transfer path in EndLightingComputation()
47:38Switch to the test transfer path in EndLightingComputation()
47:38Switch to the test transfer path in EndLightingComputation()
48:19Check out the light transfer with inconsistent voxel placement
🏃
48:19Check out the light transfer with inconsistent voxel placement
🏃
48:19Check out the light transfer with inconsistent voxel placement
🏃
48:51Make BeginLightingComputation() identify the need to maintain consistent voxel placement across frames, augmenting lighting_solution with LastOriginP and introducing a v3s version of Hadamard()
48:51Make BeginLightingComputation() identify the need to maintain consistent voxel placement across frames, augmenting lighting_solution with LastOriginP and introducing a v3s version of Hadamard()
48:51Make BeginLightingComputation() identify the need to maintain consistent voxel placement across frames, augmenting lighting_solution with LastOriginP and introducing a v3s version of Hadamard()
57:51Check out the non-copied, but ready lighting
🏃
57:51Check out the non-copied, but ready lighting
🏃
57:51Check out the non-copied, but ready lighting
🏃
58:20Break in to BeginLightingComputation() and inspect our voxel placement preservation values
🏃
58:20Break in to BeginLightingComputation() and inspect our voxel placement preservation values
🏃
58:20Break in to BeginLightingComputation() and inspect our voxel placement preservation values
🏃
1:00:24Begin to make BeginLightingComputation() consistently position light voxel data in Y across frames
1:00:24Begin to make BeginLightingComputation() consistently position light voxel data in Y across frames
1:00:24Begin to make BeginLightingComputation() consistently position light voxel data in Y across frames
1:03:06Voxel Scrolling
🖌
1:03:06Voxel Scrolling
🖌
1:03:06Voxel Scrolling
🖌
1:07:41Make BeginLightingComputation() consistently position light voxel data in Y
1:07:41Make BeginLightingComputation() consistently position light voxel data in Y
1:07:41Make BeginLightingComputation() consistently position light voxel data in Y
1:14:40Hit an access violation in BeginLightingComputation()
🏃
1:14:40Hit an access violation in BeginLightingComputation()
🏃
1:14:40Hit an access violation in BeginLightingComputation()
🏃
1:14:58Fix typo in BeginLightingComputation()
1:14:58Fix typo in BeginLightingComputation()
1:14:58Fix typo in BeginLightingComputation()
1:16:14Hello, puss!
🗩
1:16:14Hello, puss!
🗩
1:16:14Hello, puss!
🗩
1:17:10Find that our voxel copy did not work correctly
🏃
1:17:10Find that our voxel copy did not work correctly
🏃
1:17:10Find that our voxel copy did not work correctly
🏃
1:18:21Fix two more typos in BeginLightingComputation()
1:18:21Fix two more typos in BeginLightingComputation()
1:18:21Fix two more typos in BeginLightingComputation()
1:19:55Hit an access violation in BeginLightingComputation()
🏃
1:19:55Hit an access violation in BeginLightingComputation()
🏃
1:19:55Hit an access violation in BeginLightingComputation()
🏃
1:20:15Unfix typo in BeginLightingComputation()
1:20:15Unfix typo in BeginLightingComputation()
1:20:15Unfix typo in BeginLightingComputation()
1:20:46Admire our stable downward copy, but broken upward copy
🏃
1:20:46Admire our stable downward copy, but broken upward copy
🏃
1:20:46Admire our stable downward copy, but broken upward copy
🏃
1:21:10Toggle off the upward copy in BeginLightingComputation()
1:21:10Toggle off the upward copy in BeginLightingComputation()
1:21:10Toggle off the upward copy in BeginLightingComputation()
1:21:30Check out the supposed downward copy
🏃
1:21:30Check out the supposed downward copy
🏃
1:21:30Check out the supposed downward copy
🏃
1:21:48Toggle off the downward copy in BeginLightingComputation()
1:21:48Toggle off the downward copy in BeginLightingComputation()
1:21:48Toggle off the downward copy in BeginLightingComputation()
1:22:01Find that the downward lighting does not go to black
🏃
1:22:01Find that the downward lighting does not go to black
🏃
1:22:01Find that the downward lighting does not go to black
🏃
1:22:37Toggle on the downward copy in BeginLightingComputation()
1:22:37Toggle on the downward copy in BeginLightingComputation()
1:22:37Toggle on the downward copy in BeginLightingComputation()
1:22:49Consider the downward copy to be continuous
🏃
1:22:49Consider the downward copy to be continuous
🏃
1:22:49Consider the downward copy to be continuous
🏃
1:23:04Fix the upward copy in BeginLightingComputation()
1:23:04Fix the upward copy in BeginLightingComputation()
1:23:04Fix the upward copy in BeginLightingComputation()
1:27:55Admire our light, stably copied in Y
🏃
1:27:55Admire our light, stably copied in Y
🏃
1:27:55Admire our light, stably copied in Y
🏃
1:28:37Begin to compress the voxel copying routine in BeginLightingComputation()
1:28:37Begin to compress the voxel copying routine in BeginLightingComputation()
1:28:37Begin to compress the voxel copying routine in BeginLightingComputation()
1:29:25Find that nothing changed
🏃
1:29:25Find that nothing changed
🏃
1:29:25Find that nothing changed
🏃
1:29:34Continue to compress the voxel copying routine in BeginLightingComputation()
1:29:34Continue to compress the voxel copying routine in BeginLightingComputation()
1:29:34Continue to compress the voxel copying routine in BeginLightingComputation()
1:32:57Find that that doesn't work at all
🏃
1:32:57Find that that doesn't work at all
🏃
1:32:57Find that that doesn't work at all
🏃
1:33:04Fix the upward clearing loop in BeginLightingComputation()
1:33:04Fix the upward clearing loop in BeginLightingComputation()
1:33:04Fix the upward clearing loop in BeginLightingComputation()
1:33:16Find that it's working
🏃
1:33:16Find that it's working
🏃
1:33:16Find that it's working
🏃
1:33:25Complete the compression of our voxel copying routine in BeginLightingComputation()
1:33:25Complete the compression of our voxel copying routine in BeginLightingComputation()
1:33:25Complete the compression of our voxel copying routine in BeginLightingComputation()
1:35:28Hit an access violation in BeginLightingComputation()
🏃
1:35:28Hit an access violation in BeginLightingComputation()
🏃
1:35:28Hit an access violation in BeginLightingComputation()
🏃
1:35:42Fix the voxel copying routine in BeginLightingComputation() to set the InitialY anew each time through
1:35:42Fix the voxel copying routine in BeginLightingComputation() to set the InitialY anew each time through
1:35:42Fix the voxel copying routine in BeginLightingComputation() to set the InitialY anew each time through
1:36:04Find that nothing changed
🏃
1:36:04Find that nothing changed
🏃
1:36:04Find that nothing changed
🏃
1:36:21Make BeginLightingComputation() consistently position light voxel data in X and Z
1:36:21Make BeginLightingComputation() consistently position light voxel data in X and Z
1:36:21Make BeginLightingComputation() consistently position light voxel data in X and Z
1:41:18Find that the voxel placement is not consistent in X
🏃
1:41:18Find that the voxel placement is not consistent in X
🏃
1:41:18Find that the voxel placement is not consistent in X
🏃
1:41:34Fix the voxel copying in X and Z
1:41:34Fix the voxel copying in X and Z
1:41:34Fix the voxel copying in X and Z
1:42:08Admire our consistently placed voxel
🏃
1:42:08Admire our consistently placed voxel
🏃
1:42:08Admire our consistently placed voxel
🏃
1:42:42Introduce BlockCopyVoxel(), and try writing it more and more succinctly
1:42:42Introduce BlockCopyVoxel(), and try writing it more and more succinctly
1:42:42Introduce BlockCopyVoxel(), and try writing it more and more succinctly
1:50:21Q&A
🗩
1:50:21Q&A
🗩
1:50:21Q&A
🗩
1:51:11Re-enable trilinear blending in OpenGLInit()
1:51:11Re-enable trilinear blending in OpenGLInit()
1:51:11Re-enable trilinear blending in OpenGLInit()
1:51:26Admire our blended and consistently placed light voxel
🏃
1:51:26Admire our blended and consistently placed light voxel
🏃
1:51:26Admire our blended and consistently placed light voxel
🏃
1:53:48roam00010011 Q: handmadehero.org1 time did not reflect the correct start time. What happened?
🗪
1:53:48roam00010011 Q: handmadehero.org1 time did not reflect the correct start time. What happened?
🗪
1:53:48roam00010011 Q: handmadehero.org1 time did not reflect the correct start time. What happened?
🗪
1:54:58ccaxothor Q: I'm really early in the episodes, only just finished 10. Reviewing where you are at now, what are some libraries that are added so I can study before I get to the episode they are added, i.e. OpenGL or something along those lines?
🗪
1:54:58ccaxothor Q: I'm really early in the episodes, only just finished 10. Reviewing where you are at now, what are some libraries that are added so I can study before I get to the episode they are added, i.e. OpenGL or something along those lines?
🗪
1:54:58ccaxothor Q: I'm really early in the episodes, only just finished 10. Reviewing where you are at now, what are some libraries that are added so I can study before I get to the episode they are added, i.e. OpenGL or something along those lines?
🗪
1:56:22aidsjorb Q: Care to give a guess completion percentage on the "final" lighting solution?
🗪
1:56:22aidsjorb Q: Care to give a guess completion percentage on the "final" lighting solution?
🗪
1:56:22aidsjorb Q: Care to give a guess completion percentage on the "final" lighting solution?
🗪
1:58:35synchronizerman Q: I'm exploring spatial grids for collision detection and am finding it challenging to reason about how to handle collision responses. Do you have any tips for using that sort of data structure as opposed to the usual trees (kd, quad, oct, etc.)?
🗪
1:58:35synchronizerman Q: I'm exploring spatial grids for collision detection and am finding it challenging to reason about how to handle collision responses. Do you have any tips for using that sort of data structure as opposed to the usual trees (kd, quad, oct, etc.)?
🗪
1:58:35synchronizerman Q: I'm exploring spatial grids for collision detection and am finding it challenging to reason about how to handle collision responses. Do you have any tips for using that sort of data structure as opposed to the usual trees (kd, quad, oct, etc.)?
🗪
2:00:29synchronizerman Q: Don't you normally need to put colliders inside the grid and somehow map those to entities, or perhaps enqueue into a procedure that handles the collisions? I guess more precisely, what is the pipeline for using the grids in the first place?
🗪
2:00:29synchronizerman Q: Don't you normally need to put colliders inside the grid and somehow map those to entities, or perhaps enqueue into a procedure that handles the collisions? I guess more precisely, what is the pipeline for using the grids in the first place?
🗪
2:00:29synchronizerman Q: Don't you normally need to put colliders inside the grid and somehow map those to entities, or perhaps enqueue into a procedure that handles the collisions? I guess more precisely, what is the pipeline for using the grids in the first place?
🗪
2:01:32ccaxothor Q: What episode do you talk about the blending problem you are facing? Not sure what you mean. Like color blending or some numerical blending?
🗪
2:01:32ccaxothor Q: What episode do you talk about the blending problem you are facing? Not sure what you mean. Like color blending or some numerical blending?
🗪
2:01:32ccaxothor Q: What episode do you talk about the blending problem you are facing? Not sure what you mean. Like color blending or some numerical blending?
🗪
2:04:09Wrap it up
🗩
2:04:09Wrap it up
🗩
2:04:09Wrap it up
🗩