Handmade Hero»Episode Guide
Basic Multigrid Lighting Down Iteration
?
?

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:07Recap and set the stage for the day
0:07Recap and set the stage for the day
0:07Recap and set the stage for the day
1:12Run the game and consider how to make the light spread further
1:12Run the game and consider how to make the light spread further
1:12Run the game and consider how to make the light spread further
2:48handmade_opengl.cpp: Make CompileFakeSeedLighting() set the Front and Back emitter colours to 100
2:48handmade_opengl.cpp: Make CompileFakeSeedLighting() set the Front and Back emitter colours to 100
2:48handmade_opengl.cpp: Make CompileFakeSeedLighting() set the Front and Back emitter colours to 100
3:40Run the game and check out the light propagation
3:40Run the game and check out the light propagation
3:40Run the game and check out the light propagation
6:04Blackboard: Multigrid Up and bilinear sampling
6:04Blackboard: Multigrid Up and bilinear sampling
6:04Blackboard: Multigrid Up and bilinear sampling
9:59handmade_opengl.cpp: Introduce ManualSample() in CompileMultiLightUp()
9:59handmade_opengl.cpp: Introduce ManualSample() in CompileMultiLightUp()
9:59handmade_opengl.cpp: Introduce ManualSample() in CompileMultiLightUp()
12:21Run the game to see everything is fine
12:21Run the game to see everything is fine
12:21Run the game to see everything is fine
12:29handmade_opengl.cpp: Determine to enable ManualSample() to perform the bilinear sampling1
12:29handmade_opengl.cpp: Determine to enable ManualSample() to perform the bilinear sampling1
12:29handmade_opengl.cpp: Determine to enable ManualSample() to perform the bilinear sampling1
16:27handmade_opengl.cpp: Force OpenGLChangeToSettings() to set the TexWidth to 1024 and TexHeight to 512
16:27handmade_opengl.cpp: Force OpenGLChangeToSettings() to set the TexWidth to 1024 and TexHeight to 512
16:27handmade_opengl.cpp: Force OpenGLChangeToSettings() to set the TexWidth to 1024 and TexHeight to 512
16:44Run the game to see how the downsampling occurs at this perfect 2:1 ratio
16:44Run the game to see how the downsampling occurs at this perfect 2:1 ratio
16:44Run the game to see how the downsampling occurs at this perfect 2:1 ratio
18:55Blackboard: Blending light sources
18:55Blackboard: Blending light sources
18:55Blackboard: Blending light sources
23:25Blackboard: Destructive downsampling
23:25Blackboard: Destructive downsampling
23:25Blackboard: Destructive downsampling
27:26handmade_opengl.cpp: Make OpenGLChangeToSettings() perform a safe divide-by-two and use the RenderWidth and RenderHeight again
27:26handmade_opengl.cpp: Make OpenGLChangeToSettings() perform a safe divide-by-two and use the RenderWidth and RenderHeight again
27:26handmade_opengl.cpp: Make OpenGLChangeToSettings() perform a safe divide-by-two and use the RenderWidth and RenderHeight again
28:19Run the game and see the light propagating up correctly
28:19Run the game and see the light propagating up correctly
28:19Run the game and see the light propagating up correctly
29:46handmade_opengl.cpp: Introduce Light() in CompileFakeSeedLighting(), and create a second light source
29:46handmade_opengl.cpp: Introduce Light() in CompileFakeSeedLighting(), and create a second light source
29:46handmade_opengl.cpp: Introduce Light() in CompileFakeSeedLighting(), and create a second light source
38:45Run the game to see how the lights blend
38:45Run the game to see how the lights blend
38:45Run the game to see how the lights blend
41:45handmade_opengl.cpp: Make CompileFakeSeedLighting() black out the whole area
41:45handmade_opengl.cpp: Make CompileFakeSeedLighting() black out the whole area
41:45handmade_opengl.cpp: Make CompileFakeSeedLighting() black out the whole area
42:53Run the game and consider having separate textures for emission and surface
42:53Run the game and consider having separate textures for emission and surface
42:53Run the game and consider having separate textures for emission and surface
46:56handmade_opengl.cpp: Make CompileFakeSeedLighting() set the NP to 0, 1, -10, and run the game to see that
46:56handmade_opengl.cpp: Make CompileFakeSeedLighting() set the NP to 0, 1, -10, and run the game to see that
46:56handmade_opengl.cpp: Make CompileFakeSeedLighting() set the NP to 0, 1, -10, and run the game to see that
48:14Determine to implement downward propagation in CompileMultiLightDown()
48:14Determine to implement downward propagation in CompileMultiLightDown()
48:14Determine to implement downward propagation in CompileMultiLightDown()
50:29Blackboard: Downward light propagation, with reflectance from neighbours
50:29Blackboard: Downward light propagation, with reflectance from neighbours
50:29Blackboard: Downward light propagation, with reflectance from neighbours
57:14Consult 'Dynamic Ambient Occlusion and Indirect Lighting'2
57:14Consult 'Dynamic Ambient Occlusion and Indirect Lighting'2
57:14Consult 'Dynamic Ambient Occlusion and Indirect Lighting'2
1:05:48Blackboard: Disk-to-disk form factor approximation3
1:05:48Blackboard: Disk-to-disk form factor approximation3
1:05:48Blackboard: Disk-to-disk form factor approximation3
1:15:24Consider having our reflectors as disks and emitters as spheres
1:15:24Consider having our reflectors as disks and emitters as spheres
1:15:24Consider having our reflectors as disks and emitters as spheres
1:16:45handmade_opengl.cpp: Implement downward propagation in CompileMultiLightDown()
1:16:45handmade_opengl.cpp: Implement downward propagation in CompileMultiLightDown()
1:16:45handmade_opengl.cpp: Implement downward propagation in CompileMultiLightDown()
1:19:47Blackboard: Sampling light from the parent and neighbour grids
1:19:47Blackboard: Sampling light from the parent and neighbour grids
1:19:47Blackboard: Sampling light from the parent and neighbour grids
1:23:43handmade_opengl.cpp: Enable CompileMultiLightDown() to sample from the parent grid4
1:23:43handmade_opengl.cpp: Enable CompileMultiLightDown() to sample from the parent grid4
1:23:43handmade_opengl.cpp: Enable CompileMultiLightDown() to sample from the parent grid4
1:35:51handmade_opengl.cpp: Introduce TransferLight() in CompileMultiLightDown()
1:35:51handmade_opengl.cpp: Introduce TransferLight() in CompileMultiLightDown()
1:35:51handmade_opengl.cpp: Introduce TransferLight() in CompileMultiLightDown()
1:39:50Blackboard: Computing NPz
1:39:50Blackboard: Computing NPz
1:39:50Blackboard: Computing NPz
1:40:45handmade_opengl.cpp: Complete the implementation of ParentSample() in CompileMultiLightDown()
1:40:45handmade_opengl.cpp: Complete the implementation of ParentSample() in CompileMultiLightDown()
1:40:45handmade_opengl.cpp: Complete the implementation of ParentSample() in CompileMultiLightDown()
1:43:44handmade_opengl.cpp: Introduce ReconstructNormal() and ReconstructPosition() for ParentSample() to call in CompileMultiLightDown()
1:43:44handmade_opengl.cpp: Introduce ReconstructNormal() and ReconstructPosition() for ParentSample() to call in CompileMultiLightDown()
1:43:44handmade_opengl.cpp: Introduce ReconstructNormal() and ReconstructPosition() for ParentSample() to call in CompileMultiLightDown()
1:45:40handmade_opengl.cpp: Fix compile errors in CompileMultiLightDown()
1:45:40handmade_opengl.cpp: Fix compile errors in CompileMultiLightDown()
1:45:40handmade_opengl.cpp: Fix compile errors in CompileMultiLightDown()
1:48:44handmade_opengl.cpp: Implement the downward phase in ComputeLightTransport(), transferring light from less-detailed light buffers to higher-detailed ones
1:48:44handmade_opengl.cpp: Implement the downward phase in ComputeLightTransport(), transferring light from less-detailed light buffers to higher-detailed ones
1:48:44handmade_opengl.cpp: Implement the downward phase in ComputeLightTransport(), transferring light from less-detailed light buffers to higher-detailed ones
1:54:05handmade_opengl.cpp: Introduce a version of UseProgramBegin() for multigrid_light_down_program
1:54:05handmade_opengl.cpp: Introduce a version of UseProgramBegin() for multigrid_light_down_program
1:54:05handmade_opengl.cpp: Introduce a version of UseProgramBegin() for multigrid_light_down_program
1:55:37handmade_opengl.cpp: Fix compile errors
1:55:37handmade_opengl.cpp: Fix compile errors
1:55:37handmade_opengl.cpp: Fix compile errors
1:58:48Run the game, but simply running is not going to get us very far
1:58:48Run the game, but simply running is not going to get us very far
1:58:48Run the game, but simply running is not going to get us very far
1:59:56Q&A
🗩
1:59:56Q&A
🗩
1:59:56Q&A
🗩
2:00:08handmade_opengl.cpp: Fix up the DestFrontEmit and DestBackEmit computations
2:00:08handmade_opengl.cpp: Fix up the DestFrontEmit and DestBackEmit computations
2:00:08handmade_opengl.cpp: Fix up the DestFrontEmit and DestBackEmit computations
2:01:00desuused Have you seen Doom 2016 rendering paper?5
🗪
2:01:00desuused Have you seen Doom 2016 rendering paper?5
🗪
2:01:00desuused Have you seen Doom 2016 rendering paper?5
🗪
2:01:24fierydrake You have an Up in your Down line
🗪
2:01:24fierydrake You have an Up in your Down line
🗪
2:01:24fierydrake You have an Up in your Down line
🗪
2:01:29handmade_opengl.cpp: Fix up the TransferLight Down call
2:01:29handmade_opengl.cpp: Fix up the TransferLight Down call
2:01:29handmade_opengl.cpp: Fix up the TransferLight Down call
2:01:34On Doom's rendering
2:01:34On Doom's rendering
2:01:34On Doom's rendering
2:02:47elitetk I'm on Day 18 and I'm looking at the stream for the first time and I'm wondering, what happened? I have these sweet-ass colourful gradients and sound, and all you have is two round circles!
🗪
2:02:47elitetk I'm on Day 18 and I'm looking at the stream for the first time and I'm wondering, what happened? I have these sweet-ass colourful gradients and sound, and all you have is two round circles!
🗪
2:02:47elitetk I'm on Day 18 and I'm looking at the stream for the first time and I'm wondering, what happened? I have these sweet-ass colourful gradients and sound, and all you have is two round circles!
🗪
2:03:04handmade_opengl.cpp: Toggle off the debug lighting and run the game to show our actual state
2:03:04handmade_opengl.cpp: Toggle off the debug lighting and run the game to show our actual state
2:03:04handmade_opengl.cpp: Toggle off the debug lighting and run the game to show our actual state
2:04:28sharlock93 Do you usually do a lot of programming before you run, like you did today, or do you program a bit then run and debug? Is it because you know what you are doing that you take big chunks of programming then run?
🗪
2:04:28sharlock93 Do you usually do a lot of programming before you run, like you did today, or do you program a bit then run and debug? Is it because you know what you are doing that you take big chunks of programming then run?
🗪
2:04:28sharlock93 Do you usually do a lot of programming before you run, like you did today, or do you program a bit then run and debug? Is it because you know what you are doing that you take big chunks of programming then run?
🗪
2:06:03vaualbus Try running now that we fixed the stupid error in the shader
🗪
2:06:03vaualbus Try running now that we fixed the stupid error in the shader
🗪
2:06:03vaualbus Try running now that we fixed the stupid error in the shader
🗪
2:06:47traxirage How long do you think this project is gonna take?
🗪
2:06:47traxirage How long do you think this project is gonna take?
🗪
2:06:47traxirage How long do you think this project is gonna take?
🗪
2:07:03flagmyname New here, sorry if this was asked before. If you were working on this on your own time (not streaming / teaching or anything), how long do you think it would take you to complete?
🗪
2:07:03flagmyname New here, sorry if this was asked before. If you were working on this on your own time (not streaming / teaching or anything), how long do you think it would take you to complete?
🗪
2:07:03flagmyname New here, sorry if this was asked before. If you were working on this on your own time (not streaming / teaching or anything), how long do you think it would take you to complete?
🗪
2:08:51justsaul Do you think that game engines have a place or is it just pure evil?
🗪
2:08:51justsaul Do you think that game engines have a place or is it just pure evil?
🗪
2:08:51justsaul Do you think that game engines have a place or is it just pure evil?
🗪
2:10:23bialy90722 Do you have any good practice to keep your brain motivated after months and months of programming?
🗪
2:10:23bialy90722 Do you have any good practice to keep your brain motivated after months and months of programming?
🗪
2:10:23bialy90722 Do you have any good practice to keep your brain motivated after months and months of programming?
🗪
2:12:26sharlock93 If we feed you sandwiches and keep you alive, what would you work on for the rest of your life?
🗪
2:12:26sharlock93 If we feed you sandwiches and keep you alive, what would you work on for the rest of your life?
🗪
2:12:26sharlock93 If we feed you sandwiches and keep you alive, what would you work on for the rest of your life?
🗪
2:13:27sharlock93 I'm down with patreoning Molly so I think you have no worries if we all chip in
🗪
2:13:27sharlock93 I'm down with patreoning Molly so I think you have no worries if we all chip in
🗪
2:13:27sharlock93 I'm down with patreoning Molly so I think you have no worries if we all chip in
🗪
2:14:24theonlyrealtodd Have you found the need to write certain algorithms directly in assembly for performance reasons?
🗪
2:14:24theonlyrealtodd Have you found the need to write certain algorithms directly in assembly for performance reasons?
🗪
2:14:24theonlyrealtodd Have you found the need to write certain algorithms directly in assembly for performance reasons?
🗪
2:17:46zilarrezko Any word on getting other programmers to work on some code on Handmade Hero? Shawn (adult hour edition) for graphics, Fabian for optimizations, Jon for game design, Sean to dance and party, etc.
🗪
2:17:46zilarrezko Any word on getting other programmers to work on some code on Handmade Hero? Shawn (adult hour edition) for graphics, Fabian for optimizations, Jon for game design, Sean to dance and party, etc.
🗪
2:17:46zilarrezko Any word on getting other programmers to work on some code on Handmade Hero? Shawn (adult hour edition) for graphics, Fabian for optimizations, Jon for game design, Sean to dance and party, etc.
🗪
2:21:05garryjohanson So you know stuff about 360 hardware? How much of a problem was in-order execution? Did that cause performance problems? Do you view out-of-order execution as the performance convenience it claims to be, at least with respect to instruction-level parallelism?
🗪
2:21:05garryjohanson So you know stuff about 360 hardware? How much of a problem was in-order execution? Did that cause performance problems? Do you view out-of-order execution as the performance convenience it claims to be, at least with respect to instruction-level parallelism?
🗪
2:21:05garryjohanson So you know stuff about 360 hardware? How much of a problem was in-order execution? Did that cause performance problems? Do you view out-of-order execution as the performance convenience it claims to be, at least with respect to instruction-level parallelism?
🗪
2:26:52A few words on the Load-Hit-Store penalty of PowerPC
2:26:52A few words on the Load-Hit-Store penalty of PowerPC
2:26:52A few words on the Load-Hit-Store penalty of PowerPC
2:30:33Zilarrezko If you had SIMD code for SSE2 but also had the same algorithms for AVX 256-bit, is there a way to only run the AVX in the shipping version if the hardware supports it? Must it be decided at compile time?
🗪
2:30:33Zilarrezko If you had SIMD code for SSE2 but also had the same algorithms for AVX 256-bit, is there a way to only run the AVX in the shipping version if the hardware supports it? Must it be decided at compile time?
🗪
2:30:33Zilarrezko If you had SIMD code for SSE2 but also had the same algorithms for AVX 256-bit, is there a way to only run the AVX in the shipping version if the hardware supports it? Must it be decided at compile time?
🗪
2:33:37Wind it down
🗩
2:33:37Wind it down
🗩
2:33:37Wind it down
🗩