Handmade Hero»Episode Guide
Centralized Light Atlas Handling
?
?

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:05Welcome to the stream
🗩
0:05Welcome to the stream
🗩
0:05Welcome to the stream
🗩
0:23Demo the current specular lighting
🏃
0:23Demo the current specular lighting
🏃
0:23Demo the current specular lighting
🏃
2:57Prepare to use the diffuse light map for bounce lighting, first treating the light voxel cells as a texture atlas
🗩
2:57Prepare to use the diffuse light map for bounce lighting, first treating the light voxel cells as a texture atlas
🗩
2:57Prepare to use the diffuse light map for bounce lighting, first treating the light voxel cells as a texture atlas
🗩
5:31Introduce light_atlas
5:31Introduce light_atlas
5:31Introduce light_atlas
6:52Consider leaving the depth map out of it
🏃
6:52Consider leaving the depth map out of it
🏃
6:52Consider leaving the depth map out of it
🏃
8:47Swizzling light atlases for optimal GPU submission
🗩
8:47Swizzling light atlases for optimal GPU submission
🗩
8:47Swizzling light atlases for optimal GPU submission
🗩
11:53Fill in the light_atlas, renaming it to game_light_atlas
11:53Fill in the light_atlas, renaming it to game_light_atlas
11:53Fill in the light_atlas, renaming it to game_light_atlas
14:41Consider how to handle specular surfaces
🗩
14:41Consider how to handle specular surfaces
🗩
14:41Consider how to handle specular surfaces
🗩
16:02Replace the LightVoxel data with a game_light_atlas in game_render_commands, and augment open_gl with game_light_atlas
16:02Replace the LightVoxel data with a game_light_atlas in game_render_commands, and augment open_gl with game_light_atlas
16:02Replace the LightVoxel data with a game_light_atlas in game_render_commands, and augment open_gl with game_light_atlas
17:45Update ComputeLightPropagationWork() and BeginLightingComputation() to use our new game_light_atlas
17:45Update ComputeLightPropagationWork() and BeginLightingComputation() to use our new game_light_atlas
17:45Update ComputeLightPropagationWork() and BeginLightingComputation() to use our new game_light_atlas
27:26Introduce v3s overloaded-operator versions of * and /
27:26Introduce v3s overloaded-operator versions of * and /
27:26Introduce v3s overloaded-operator versions of * and /
28:26Finish updating BeginLightingComputation() to use our new game_light_atlas
28:26Finish updating BeginLightingComputation() to use our new game_light_atlas
28:26Finish updating BeginLightingComputation() to use our new game_light_atlas
28:53Hit a write access violation in ComputeLightPropagationWork()
🏃
28:53Hit a write access violation in ComputeLightPropagationWork()
🏃
28:53Hit a write access violation in ComputeLightPropagationWork()
🏃
29:11Make OpenGLInit() initialise our DiffuseLightAtlas
29:11Make OpenGLInit() initialise our DiffuseLightAtlas
29:11Make OpenGLInit() initialise our DiffuseLightAtlas
31:20Run without crashing to see no obvious differences
🏃
31:20Run without crashing to see no obvious differences
🏃
31:20Run without crashing to see no obvious differences
🏃
31:47Create handmade_light_atlas.h, and rename game_light_atlas to light_atlas
31:47Create handmade_light_atlas.h, and rename game_light_atlas to light_atlas
31:47Create handmade_light_atlas.h, and rename game_light_atlas to light_atlas
35:10Prepare to systematise the light atlas initialisation
📖
35:10Prepare to systematise the light atlas initialisation
📖
35:10Prepare to systematise the light atlas initialisation
📖
37:01Introduce GetLightAtlasTexelSize(), MakeLightAtlas(), GetLightAtlasSize() and SetLightAtlasTexels() for Win32InitOpenGL() to call, creating handmade_light_atlas.cpp
37:01Introduce GetLightAtlasTexelSize(), MakeLightAtlas(), GetLightAtlasSize() and SetLightAtlasTexels() for Win32InitOpenGL() to call, creating handmade_light_atlas.cpp
37:01Introduce GetLightAtlasTexelSize(), MakeLightAtlas(), GetLightAtlasSize() and SetLightAtlasTexels() for Win32InitOpenGL() to call, creating handmade_light_atlas.cpp
49:55See no lighting
🏃
49:55See no lighting
🏃
49:55See no lighting
🏃
50:09Remove LightColorData and LightDepthData from open_gl, and update OpenGLEndFrame() to use the new DiffuseLightAtlas, introducing GetLightAtlasTexelCount(), GetLightAtlasTexels(), GetLightAtlasWidth(), GetLightAtlasHeight() and a light_atlas version of IsFloat()
50:09Remove LightColorData and LightDepthData from open_gl, and update OpenGLEndFrame() to use the new DiffuseLightAtlas, introducing GetLightAtlasTexelCount(), GetLightAtlasTexels(), GetLightAtlasWidth(), GetLightAtlasHeight() and a light_atlas version of IsFloat()
50:09Remove LightColorData and LightDepthData from open_gl, and update OpenGLEndFrame() to use the new DiffuseLightAtlas, introducing GetLightAtlasTexelCount(), GetLightAtlasTexels(), GetLightAtlasWidth(), GetLightAtlasHeight() and a light_atlas version of IsFloat()
58:14Admire our lit world
🏃
58:14Admire our lit world
🏃
58:14Admire our lit world
🏃
58:39Augment open_gl with a SpecularLightAtlas, and replace the old Color and Depth handles with ones for the Diffuse and Specular atlases, propagating these changes to OpenGLInit(), OpenGLChangeToSettings() and OpenGLEndFrame()
58:39Augment open_gl with a SpecularLightAtlas, and replace the old Color and Depth handles with ones for the Diffuse and Specular atlases, propagating these changes to OpenGLInit(), OpenGLChangeToSettings() and OpenGLEndFrame()
58:39Augment open_gl with a SpecularLightAtlas, and replace the old Color and Depth handles with ones for the Diffuse and Specular atlases, propagating these changes to OpenGLInit(), OpenGLChangeToSettings() and OpenGLEndFrame()
1:03:46Hit OpenGL error "Invalid texture format"
🏃
1:03:46Hit OpenGL error "Invalid texture format"
🏃
1:03:46Hit OpenGL error "Invalid texture format"
🏃
1:04:11Make Win32InitOpenGL() initialise the SpecularLightAtlas
1:04:11Make Win32InitOpenGL() initialise the SpecularLightAtlas
1:04:11Make Win32InitOpenGL() initialise the SpecularLightAtlas
1:05:24Admire our lit world
🏃
1:05:24Admire our lit world
🏃
1:05:24Admire our lit world
🏃
1:05:52Prepare to write into our specular atlas directly1,2
📖
1:05:52Prepare to write into our specular atlas directly1,2
📖
1:05:52Prepare to write into our specular atlas directly1,2
📖
1:07:26Remove redundant code related to the lighting
1:07:26Remove redundant code related to the lighting
1:07:26Remove redundant code related to the lighting
1:13:36See that it looks the same
🏃
1:13:36See that it looks the same
🏃
1:13:36See that it looks the same
🏃
1:13:46Continue to remove redundant code related to the lighting, augmenting the light_atlas
1:13:46Continue to remove redundant code related to the lighting, augmenting the light_atlas
1:13:46Continue to remove redundant code related to the lighting, augmenting the light_atlas
1:24:47Consider the performance implications of removing LIGHT_COLOR_LOOKUP_SQUARE_DIM in relation to DirectionFromTxTy()
📖
1:24:47Consider the performance implications of removing LIGHT_COLOR_LOOKUP_SQUARE_DIM in relation to DirectionFromTxTy()
📖
1:24:47Consider the performance implications of removing LIGHT_COLOR_LOOKUP_SQUARE_DIM in relation to DirectionFromTxTy()
📖
1:27:30Augment light_atlas with OxyCoefficient and OctDimCoefficient for MakeLightAtlas() to compute and DirectionFromTxTy() and GetOctahedralOffset() respectively to take
1:27:30Augment light_atlas with OxyCoefficient and OctDimCoefficient for MakeLightAtlas() to compute and DirectionFromTxTy() and GetOctahedralOffset() respectively to take
1:27:30Augment light_atlas with OxyCoefficient and OctDimCoefficient for MakeLightAtlas() to compute and DirectionFromTxTy() and GetOctahedralOffset() respectively to take
1:38:43Replace all mentions of LIGHT_COLOR_LOOKUP_SQUARE_DIM in ComputeLightPropagationWork(), introducing FillLightAtlasBorder() and respecifying VOXEL_OFFSET_C() as LIGHT_ATLAS_OFFSET()
1:38:43Replace all mentions of LIGHT_COLOR_LOOKUP_SQUARE_DIM in ComputeLightPropagationWork(), introducing FillLightAtlasBorder() and respecifying VOXEL_OFFSET_C() as LIGHT_ATLAS_OFFSET()
1:38:43Replace all mentions of LIGHT_COLOR_LOOKUP_SQUARE_DIM in ComputeLightPropagationWork(), introducing FillLightAtlasBorder() and respecifying VOXEL_OFFSET_C() as LIGHT_ATLAS_OFFSET()
1:53:11Replace all mentions of LIGHT_COLOR_LOOKUP_SQUARE_DIM in BuldDiffuseLightMaps()
1:53:11Replace all mentions of LIGHT_COLOR_LOOKUP_SQUARE_DIM in BuldDiffuseLightMaps()
1:53:11Replace all mentions of LIGHT_COLOR_LOOKUP_SQUARE_DIM in BuldDiffuseLightMaps()
1:58:17Run unexpectedly successfully
🏃
1:58:17Run unexpectedly successfully
🏃
1:58:17Run unexpectedly successfully
🏃
1:58:46Determine to sample from the correct maps next stream
🗩
1:58:46Determine to sample from the correct maps next stream
🗩
1:58:46Determine to sample from the correct maps next stream
🗩
1:59:15Admire the specular lighting
🏃
1:59:15Admire the specular lighting
🏃
1:59:15Admire the specular lighting
🏃
1:59:46Q&A
🗩
1:59:46Q&A
🗩
1:59:46Q&A
🗩
2:00:37somedude456 Quick question: Does this game use stuff CRT like VCRUNTIME140.dll?
🗪
2:00:37somedude456 Quick question: Does this game use stuff CRT like VCRUNTIME140.dll?
🗪
2:00:37somedude456 Quick question: Does this game use stuff CRT like VCRUNTIME140.dll?
🗪
2:02:02Check the external dependencies of win32_handmade.exe in Depends: GDI32.dll, KERNEL32.dll, USER32.dll and WINMM.dll
🗹
2:02:02Check the external dependencies of win32_handmade.exe in Depends: GDI32.dll, KERNEL32.dll, USER32.dll and WINMM.dll
🗹
2:02:02Check the external dependencies of win32_handmade.exe in Depends: GDI32.dll, KERNEL32.dll, USER32.dll and WINMM.dll
🗹
2:02:23Check the external dependency of handmade_game_temp.dll in Depends: KERNEL32.dll
🗹
2:02:23Check the external dependency of handmade_game_temp.dll in Depends: KERNEL32.dll
🗹
2:02:23Check the external dependency of handmade_game_temp.dll in Depends: KERNEL32.dll
🗹
2:02:50Check the external dependencies of handmade_renderer_temp.dll in Depends: GDI32.dll, KERNEL32.dll, OPENGL32.dll and USER32.dll
🗹
2:02:50Check the external dependencies of handmade_renderer_temp.dll in Depends: GDI32.dll, KERNEL32.dll, OPENGL32.dll and USER32.dll
🗹
2:02:50Check the external dependencies of handmade_renderer_temp.dll in Depends: GDI32.dll, KERNEL32.dll, OPENGL32.dll and USER32.dll
🗹
2:03:42euphius Q: Do you know why some game require you to restart it if you change the graphics settings? Is it because they can't reload different textures at runtime?
🗪
2:03:42euphius Q: Do you know why some game require you to restart it if you change the graphics settings? Is it because they can't reload different textures at runtime?
🗪
2:03:42euphius Q: Do you know why some game require you to restart it if you change the graphics settings? Is it because they can't reload different textures at runtime?
🗪
2:05:41tinspin Q: Why don't all studios use the dynamic .dll loading?! It's the best thing ever, right?
🗪
2:05:41tinspin Q: Why don't all studios use the dynamic .dll loading?! It's the best thing ever, right?
🗪
2:05:41tinspin Q: Why don't all studios use the dynamic .dll loading?! It's the best thing ever, right?
🗪
2:06:30ommos61 Q: Did you forget to upload the previous episode to YouTube?
🗪
2:06:30ommos61 Q: Did you forget to upload the previous episode to YouTube?
🗪
2:06:30ommos61 Q: Did you forget to upload the previous episode to YouTube?
🗪
2:06:39blind_br Q: Casey, great series. Congrats! Any plans to open source the code?
🗪
2:06:39blind_br Q: Casey, great series. Congrats! Any plans to open source the code?
🗪
2:06:39blind_br Q: Casey, great series. Congrats! Any plans to open source the code?
🗪
2:07:00sorrelldev Q: Apologies in advance if this was already answered previously, but is there a particular reason you use structs and global functions instead of classes?
🗪
2:07:00sorrelldev Q: Apologies in advance if this was already answered previously, but is there a particular reason you use structs and global functions instead of classes?
🗪
2:07:00sorrelldev Q: Apologies in advance if this was already answered previously, but is there a particular reason you use structs and global functions instead of classes?
🗪
2:11:50tinspin Q: Also, I managed to extract the cl.exe from Visual Studio but I can't redistribute it. Has anyone been sued for redistributing the free cl.exe compiler?
🗪
2:11:50tinspin Q: Also, I managed to extract the cl.exe from Visual Studio but I can't redistribute it. Has anyone been sued for redistributing the free cl.exe compiler?
🗪
2:11:50tinspin Q: Also, I managed to extract the cl.exe from Visual Studio but I can't redistribute it. Has anyone been sued for redistributing the free cl.exe compiler?
🗪
2:12:23aidsjorb Q: What is your plan to ensure the orphanage our hero lives in will have sufficient access to paper products, especially toilet paper? How will hand washing work in a world where everything is handmade but the children have no limbs?
🗪
2:12:23aidsjorb Q: What is your plan to ensure the orphanage our hero lives in will have sufficient access to paper products, especially toilet paper? How will hand washing work in a world where everything is handmade but the children have no limbs?
🗪
2:12:23aidsjorb Q: What is your plan to ensure the orphanage our hero lives in will have sufficient access to paper products, especially toilet paper? How will hand washing work in a world where everything is handmade but the children have no limbs?
🗪
2:13:25graemephi (Thinks about coronavirus) *touches face*
🗪
2:13:25graemephi (Thinks about coronavirus) *touches face*
🗪
2:13:25graemephi (Thinks about coronavirus) *touches face*
🗪
2:13:48mattiamanzati Q: I'm not completely familiar with this environment, that's why I'm enjoying this streaming, but why today did we moved from an array of light voxel cell to a light atlas? Is that because of OpenGL atlases or other?
🗪
2:13:48mattiamanzati Q: I'm not completely familiar with this environment, that's why I'm enjoying this streaming, but why today did we moved from an array of light voxel cell to a light atlas? Is that because of OpenGL atlases or other?
🗪
2:13:48mattiamanzati Q: I'm not completely familiar with this environment, that's why I'm enjoying this streaming, but why today did we moved from an array of light voxel cell to a light atlas? Is that because of OpenGL atlases or other?
🗪
2:14:23czapa10 Q: Is using _mm_load_ps() and _mm_store_ps() more efficient (or better) then just casting to floats or accessing it through a union?
🗪
2:14:23czapa10 Q: Is using _mm_load_ps() and _mm_store_ps() more efficient (or better) then just casting to floats or accessing it through a union?
🗪
2:14:23czapa10 Q: Is using _mm_load_ps() and _mm_store_ps() more efficient (or better) then just casting to floats or accessing it through a union?
🗪
2:16:45dithinas Q: [Off-topic] Would you be able to give an intuitive / geometric explanation for what the adjoint matrix computes, and why you need it for doing generalized transforms on surface normal vectors?3
🗪
2:16:45dithinas Q: [Off-topic] Would you be able to give an intuitive / geometric explanation for what the adjoint matrix computes, and why you need it for doing generalized transforms on surface normal vectors?3
🗪
2:16:45dithinas Q: [Off-topic] Would you be able to give an intuitive / geometric explanation for what the adjoint matrix computes, and why you need it for doing generalized transforms on surface normal vectors?3
🗪
2:20:19d3rzo Q: Do you think using OpenGL for making games is still fine for the next couple of years? I've heard Jon Blow's rant about it not being a valid API, but I'm not sure why
🗪
2:20:19d3rzo Q: Do you think using OpenGL for making games is still fine for the next couple of years? I've heard Jon Blow's rant about it not being a valid API, but I'm not sure why
🗪
2:20:19d3rzo Q: Do you think using OpenGL for making games is still fine for the next couple of years? I've heard Jon Blow's rant about it not being a valid API, but I'm not sure why
🗪
2:21:55d3rzo Right, but they still support the existing versions (we are up to 4.6, right?). Why aren't the current features enough?
🗪
2:21:55d3rzo Right, but they still support the existing versions (we are up to 4.6, right?). Why aren't the current features enough?
🗪
2:21:55d3rzo Right, but they still support the existing versions (we are up to 4.6, right?). Why aren't the current features enough?
🗪
2:22:12lucid_frost Q: What do you think about the style of using a bunch of defines to control the generated code of an include for things like libraries (similar to your float define but more extreme)?
🗪
2:22:12lucid_frost Q: What do you think about the style of using a bunch of defines to control the generated code of an include for things like libraries (similar to your float define but more extreme)?
🗪
2:22:12lucid_frost Q: What do you think about the style of using a bunch of defines to control the generated code of an include for things like libraries (similar to your float define but more extreme)?
🗪
2:22:27eerrman1 Q: Did you take any programming courses at a college? Do you have any recommendations?
🗪
2:22:27eerrman1 Q: Did you take any programming courses at a college? Do you have any recommendations?
🗪
2:22:27eerrman1 Q: Did you take any programming courses at a college? Do you have any recommendations?
🗪
2:22:33taylor_totter Q: On the Wikipedia page,4the 2x2 generic example5
🗪
2:22:33taylor_totter Q: On the Wikipedia page,4the 2x2 generic example5
🗪
2:22:33taylor_totter Q: On the Wikipedia page,4the 2x2 generic example5
🗪
2:27:11tinspin Q: Do you have a Raspberry 4?
🗪
2:27:11tinspin Q: Do you have a Raspberry 4?
🗪
2:27:11tinspin Q: Do you have a Raspberry 4?
🗪
2:27:16khrob Q: Why would id support Vulkan instead of just DX?
🗪
2:27:16khrob Q: Why would id support Vulkan instead of just DX?
🗪
2:27:16khrob Q: Why would id support Vulkan instead of just DX?
🗪
2:27:26czapa10 Q: Will you ship the game with debug GUI? Mike Acton said at GDC conference that you should be able to debug the release version of your game. How do you do that?
🗪
2:27:26czapa10 Q: Will you ship the game with debug GUI? Mike Acton said at GDC conference that you should be able to debug the release version of your game. How do you do that?
🗪
2:27:26czapa10 Q: Will you ship the game with debug GUI? Mike Acton said at GDC conference that you should be able to debug the release version of your game. How do you do that?
🗪
2:28:53It's been a pleasure
🗩
2:28:53It's been a pleasure
🗩
2:28:53It's been a pleasure
🗩