Handmade Hero»Episode Guide
Voxel-Indexed Lighting Samples
?
?

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:08Recap and set the stage for the day
0:08Recap and set the stage for the day
0:08Recap and set the stage for the day
0:42Run the game and consider the problem of reconstructing per-pixel lighting from our coarse computations
0:42Run the game and consider the problem of reconstructing per-pixel lighting from our coarse computations
0:42Run the game and consider the problem of reconstructing per-pixel lighting from our coarse computations
8:35Blackboard: Sending down four interpolation points per quad, instead of doing a global gather
8:35Blackboard: Sending down four interpolation points per quad, instead of doing a global gather
8:35Blackboard: Sending down four interpolation points per quad, instead of doing a global gather
15:04Blackboard: Radial-normalised interpolation
15:04Blackboard: Radial-normalised interpolation
15:04Blackboard: Radial-normalised interpolation
17:31Run the game and consider whether or not to interpolate across primitives
17:31Run the game and consider whether or not to interpolate across primitives
17:31Run the game and consider whether or not to interpolate across primitives
20:41Blackboard: Lighting Lookups
20:41Blackboard: Lighting Lookups
20:41Blackboard: Lighting Lookups
24:45Blackboard: Storage format for a spherical query
24:45Blackboard: Storage format for a spherical query
24:45Blackboard: Storage format for a spherical query
25:34Blackboard: Quick spatial query
25:34Blackboard: Quick spatial query
25:34Blackboard: Quick spatial query
31:00Consider the problem of packaging up this data for parallel access by the GPU
31:00Consider the problem of packaging up this data for parallel access by the GPU
31:00Consider the problem of packaging up this data for parallel access by the GPU
39:18Consult the Texture Lookup Functions in the OpenGL Shading Language 1.50 Quick Reference Card for sampling from a 3D texture1
39:18Consult the Texture Lookup Functions in the OpenGL Shading Language 1.50 Quick Reference Card for sampling from a 3D texture1
39:18Consult the Texture Lookup Functions in the OpenGL Shading Language 1.50 Quick Reference Card for sampling from a 3D texture1
41:15Blackboard: Artifacts across cell boundaries
41:15Blackboard: Artifacts across cell boundaries
41:15Blackboard: Artifacts across cell boundaries
44:28Determine to create a voxel-based lighting solution
44:28Determine to create a voxel-based lighting solution
44:28Determine to create a voxel-based lighting solution
45:14handmade_render_group.cpp: Introduce OutputLightingTextures()
45:14handmade_render_group.cpp: Introduce OutputLightingTextures()
45:14handmade_render_group.cpp: Introduce OutputLightingTextures()
46:25handmade_world_mode.h: Augment lighting_solution to contain voxel and storage information
46:25handmade_world_mode.h: Augment lighting_solution to contain voxel and storage information
46:25handmade_world_mode.h: Augment lighting_solution to contain voxel and storage information
52:05handmade_world_mode.h: Introduce lighting_texel linked list for fast access lookup
52:05handmade_world_mode.h: Introduce lighting_texel linked list for fast access lookup
52:05handmade_world_mode.h: Introduce lighting_texel linked list for fast access lookup
55:54handmade_world_mode.h: Introduce lighting_textures
55:54handmade_world_mode.h: Introduce lighting_textures
55:54handmade_world_mode.h: Introduce lighting_textures
56:46handmade_render_group.cpp: Begin to enable OutputLightingTextures() to pack our lighting data
56:46handmade_render_group.cpp: Begin to enable OutputLightingTextures() to pack our lighting data
56:46handmade_render_group.cpp: Begin to enable OutputLightingTextures() to pack our lighting data
59:34handmade_render_group.cpp: Determine to prevent OutputLightingQuads() from considering the reflector's own colour
59:34handmade_render_group.cpp: Determine to prevent OutputLightingQuads() from considering the reflector's own colour
59:34handmade_render_group.cpp: Determine to prevent OutputLightingQuads() from considering the reflector's own colour
1:00:12Run the game to see that it's running slower than expected
1:00:12Run the game to see that it's running slower than expected
1:00:12Run the game to see that it's running slower than expected
1:02:17Run the game and note that we want to stop the reflectors from considering their own colour during the lighting pass
1:02:17Run the game and note that we want to stop the reflectors from considering their own colour during the lighting pass
1:02:17Run the game and note that we want to stop the reflectors from considering their own colour during the lighting pass
1:02:51handmade_render_group.cpp: Change LightingTest() to multiply in the reflector's colour at the start, and ExtractReflectorsFromVerts() and ExtractReflectorsFromQuads() to not use the reflector's own emission colour
1:02:51handmade_render_group.cpp: Change LightingTest() to multiply in the reflector's colour at the start, and ExtractReflectorsFromVerts() and ExtractReflectorsFromQuads() to not use the reflector's own emission colour
1:02:51handmade_render_group.cpp: Change LightingTest() to multiply in the reflector's colour at the start, and ExtractReflectorsFromVerts() and ExtractReflectorsFromQuads() to not use the reflector's own emission colour
1:06:22Run the game to see that the red and blue reflectors do not show their own colour, but that these colours are also not bouncing off other reflectors, and investigate why
1:06:22Run the game to see that the red and blue reflectors do not show their own colour, but that these colours are also not bouncing off other reflectors, and investigate why
1:06:22Run the game to see that the red and blue reflectors do not show their own colour, but that these colours are also not bouncing off other reflectors, and investigate why
1:11:53handmade_render_group.cpp: Continue to enable OutputLightingTextures() to pack our lighting data into a linked list
1:11:53handmade_render_group.cpp: Continue to enable OutputLightingTextures() to pack our lighting data into a linked list
1:11:53handmade_render_group.cpp: Continue to enable OutputLightingTextures() to pack our lighting data into a linked list
1:16:14Blackboard: Mapping world space positions into a screen space lookup table
1:16:14Blackboard: Mapping world space positions into a screen space lookup table
1:16:14Blackboard: Mapping world space positions into a screen space lookup table
1:20:45handmade_render_group.cpp: Make OutputLightingTextures() index into voxels
1:20:45handmade_render_group.cpp: Make OutputLightingTextures() index into voxels
1:20:45handmade_render_group.cpp: Make OutputLightingTextures() index into voxels
1:25:23Blackboard: Picking a cell from a grid
1:25:23Blackboard: Picking a cell from a grid
1:25:23Blackboard: Picking a cell from a grid
1:27:00handmade_render_group.cpp: Make OutputLightingTextures() map the lighting into our voxel
1:27:00handmade_render_group.cpp: Make OutputLightingTextures() map the lighting into our voxel
1:27:00handmade_render_group.cpp: Make OutputLightingTextures() map the lighting into our voxel
1:32:39handmade_world_mode.cpp: Make UpdateAndRenderWorld() call OutputLightingTextures() on test textures
1:32:39handmade_world_mode.cpp: Make UpdateAndRenderWorld() call OutputLightingTextures() on test textures
1:32:39handmade_world_mode.cpp: Make UpdateAndRenderWorld() call OutputLightingTextures() on test textures
1:35:31handmade_render_group.cpp: Introduce OutputTextureDebug() for OutputLighting() to call
1:35:31handmade_render_group.cpp: Introduce OutputTextureDebug() for OutputLighting() to call
1:35:31handmade_render_group.cpp: Introduce OutputTextureDebug() for OutputLighting() to call
1:43:13Run the game, toggle to the lighting view and see nothing
1:43:13Run the game, toggle to the lighting view and see nothing
1:43:13Run the game, toggle to the lighting view and see nothing
1:43:56Step in to OutputLightingTextures() and...
1:43:56Step in to OutputLightingTextures() and...
1:43:56Step in to OutputLightingTextures() and...
1:45:40Wish for the ability to optimise just one routine while waiting for our lighting solution to be computed
1:45:40Wish for the ability to optimise just one routine while waiting for our lighting solution to be computed
1:45:40Wish for the ability to optimise just one routine while waiting for our lighting solution to be computed
1:46:37...inspect the values produced by OutputLightingTextures()
1:46:37...inspect the values produced by OutputLightingTextures()
1:46:37...inspect the values produced by OutputLightingTextures()
1:48:32handmade_render_group.cpp: Fix OutputTextureDebug() to index into the correct locations
1:48:32handmade_render_group.cpp: Fix OutputTextureDebug() to index into the correct locations
1:48:32handmade_render_group.cpp: Fix OutputTextureDebug() to index into the correct locations
1:49:10Run the game in release mode and see weirdly positioned light voxels
1:49:10Run the game in release mode and see weirdly positioned light voxels
1:49:10Run the game in release mode and see weirdly positioned light voxels
1:50:45handmade_render_group.cpp: Try to put #pragma optimise around OutputTextureDebug() to disable optimisations
1:50:45handmade_render_group.cpp: Try to put #pragma optimise around OutputTextureDebug() to disable optimisations
1:50:45handmade_render_group.cpp: Try to put #pragma optimise around OutputTextureDebug() to disable optimisations
1:51:10Step through OutputTextureDebug() to see that the colour is not a sane value
1:51:10Step through OutputTextureDebug() to see that the colour is not a sane value
1:51:10Step through OutputTextureDebug() to see that the colour is not a sane value
1:53:06handmade_render_group.cpp: Try to make OutputTextureDebug() set the colour to white, and run the game to see that we are storing lighting samples, but that only the colour value is incorrectly computed
1:53:06handmade_render_group.cpp: Try to make OutputTextureDebug() set the colour to white, and run the game to see that we are storing lighting samples, but that only the colour value is incorrectly computed
1:53:06handmade_render_group.cpp: Try to make OutputTextureDebug() set the colour to white, and run the game to see that we are storing lighting samples, but that only the colour value is incorrectly computed
1:54:12handmade_render_group.cpp: Fix OutputLightingTextures() to multiply the colour into the correct space
1:54:12handmade_render_group.cpp: Fix OutputLightingTextures() to multiply the colour into the correct space
1:54:12handmade_render_group.cpp: Fix OutputLightingTextures() to multiply the colour into the correct space
1:54:31Run the game and see our voxelised lighting samples
1:54:31Run the game and see our voxelised lighting samples
1:54:31Run the game and see our voxelised lighting samples
1:54:55Q&A
🗩
1:54:55Q&A
🗩
1:54:55Q&A
🗩
1:54:57handmade_render_group.cpp: Remove the #pragma optimize
1:54:57handmade_render_group.cpp: Remove the #pragma optimize
1:54:57handmade_render_group.cpp: Remove the #pragma optimize
1:55:23Run the game and express interest in seeing how this works
1:55:23Run the game and express interest in seeing how this works
1:55:23Run the game and express interest in seeing how this works
1:57:49Brian Greetings Casey! For after the stream, here is a collaborative work from us in #hero for a help guide to setting up WeeChat
🗪
1:57:49Brian Greetings Casey! For after the stream, here is a collaborative work from us in #hero for a help guide to setting up WeeChat
🗪
1:57:49Brian Greetings Casey! For after the stream, here is a collaborative work from us in #hero for a help guide to setting up WeeChat
🗪
2:00:07roam00010011 Maybe it's a non-issue, but because the entity is tilted, when it walks in front of a cube it is being cut. Is there an elegant solution for it?
🗪
2:00:07roam00010011 Maybe it's a non-issue, but because the entity is tilted, when it walks in front of a cube it is being cut. Is there an elegant solution for it?
🗪
2:00:07roam00010011 Maybe it's a non-issue, but because the entity is tilted, when it walks in front of a cube it is being cut. Is there an elegant solution for it?
🗪
2:01:34handmade_world_mode.cpp: Make AddPlayer() draw the hero bitmap and run the game
2:01:34handmade_world_mode.cpp: Make AddPlayer() draw the hero bitmap and run the game
2:01:34handmade_world_mode.cpp: Make AddPlayer() draw the hero bitmap and run the game
2:02:10handmade_render_group.cpp: Increase the ZBias in PushBitmap() and run the game to see that the hero gets clipped differently by the geometry
2:02:10handmade_render_group.cpp: Increase the ZBias in PushBitmap() and run the game to see that the hero gets clipped differently by the geometry
2:02:10handmade_render_group.cpp: Increase the ZBias in PushBitmap() and run the game to see that the hero gets clipped differently by the geometry
2:05:15alexkelbo When we made the high and low priority thread queues, how did we make the high queue actually have a higher priority? I can't find the difference between them in the implementation, if that makes sense
🗪
2:05:15alexkelbo When we made the high and low priority thread queues, how did we make the high queue actually have a higher priority? I can't find the difference between them in the implementation, if that makes sense
🗪
2:05:15alexkelbo When we made the high and low priority thread queues, how did we make the high queue actually have a higher priority? I can't find the difference between them in the implementation, if that makes sense
🗪
2:11:23roam00010011 If I was to guess, I would say the problem is not the 2D entities in 3D space, but rather 2D entities with 3D entities. If those cubes were sprites like the trees, it would work just fine
🗪
2:11:23roam00010011 If I was to guess, I would say the problem is not the 2D entities in 3D space, but rather 2D entities with 3D entities. If those cubes were sprites like the trees, it would work just fine
🗪
2:11:23roam00010011 If I was to guess, I would say the problem is not the 2D entities in 3D space, but rather 2D entities with 3D entities. If those cubes were sprites like the trees, it would work just fine
🗪
2:13:03alexkelbo In the software renderer we aligned the memory to 16 bytes for SIMD but then we used the unaligned load and store instructions. Why is that?
🗪
2:13:03alexkelbo In the software renderer we aligned the memory to 16 bytes for SIMD but then we used the unaligned load and store instructions. Why is that?
🗪
2:13:03alexkelbo In the software renderer we aligned the memory to 16 bytes for SIMD but then we used the unaligned load and store instructions. Why is that?
🗪
2:16:18Blackboard: False sharing of one cache line by two threads
2:16:18Blackboard: False sharing of one cache line by two threads
2:16:18Blackboard: False sharing of one cache line by two threads
2:18:12That's about it for today
🗩
2:18:12That's about it for today
🗩
2:18:12That's about it for today
🗩