Handmade Hero»Episode Guide
Debugging Lighting Transfer
?
?

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:14Run the game to see how the lighting is looking at the moment
1:14Run the game to see how the lighting is looking at the moment
1:14Run the game to see how the lighting is looking at the moment
7:39Note some oddities in the lighting solution
7:39Note some oddities in the lighting solution
7:39Note some oddities in the lighting solution
10:14handmade_render_group.cpp: Prevent the ambient occlusion code from running and run the game to still see the bright flashes
10:14handmade_render_group.cpp: Prevent the ambient occlusion code from running and run the game to still see the bright flashes
10:14handmade_render_group.cpp: Prevent the ambient occlusion code from running and run the game to still see the bright flashes
11:50handmade_config.h: Only do one pass of the lighting solution, and run the game to see that this is relatively stable
11:50handmade_config.h: Only do one pass of the lighting solution, and run the game to see that this is relatively stable
11:50handmade_config.h: Only do one pass of the lighting solution, and run the game to see that this is relatively stable
13:14handmade_config.h: Add Global_Renderer_Occlusion_IterationCount for LightingTest() to use
13:14handmade_config.h: Add Global_Renderer_Occlusion_IterationCount for LightingTest() to use
13:14handmade_config.h: Add Global_Renderer_Occlusion_IterationCount for LightingTest() to use
13:43Run the game doing two ambient occlusion passes
13:43Run the game doing two ambient occlusion passes
13:43Run the game doing two ambient occlusion passes
14:44handmade_config.h: Switch to the game view, with two ambient occlusion passes, and run the game to see how that looks
14:44handmade_config.h: Switch to the game view, with two ambient occlusion passes, and run the game to see how that looks
14:44handmade_config.h: Switch to the game view, with two ambient occlusion passes, and run the game to see how that looks
18:01handmade_config.h: Increase the number of lighting iteration passes and run the game with the determination to investigate the flashes
18:01handmade_config.h: Increase the number of lighting iteration passes and run the game with the determination to investigate the flashes
18:01handmade_config.h: Increase the number of lighting iteration passes and run the game with the determination to investigate the flashes
20:35Launch Milton and try out the tablet tracking
20:35Launch Milton and try out the tablet tracking
20:35Launch Milton and try out the tablet tracking
22:58Blackboard: Light Conservation
22:58Blackboard: Light Conservation
22:58Blackboard: Light Conservation
28:45Blackboard: Converging on a good lighting solution
28:45Blackboard: Converging on a good lighting solution
28:45Blackboard: Converging on a good lighting solution
30:00handmade_render_group.cpp: Consider making emission a first-pass-only process
30:00handmade_render_group.cpp: Consider making emission a first-pass-only process
30:00handmade_render_group.cpp: Consider making emission a first-pass-only process
32:40Blackboard: Occluded Reflectors, and Total Emittance
32:40Blackboard: Occluded Reflectors, and Total Emittance
32:40Blackboard: Occluded Reflectors, and Total Emittance
37:37The difficulty of parallelised summation
37:37The difficulty of parallelised summation
37:37The difficulty of parallelised summation
39:48Blackboard: Radiosity, and stabilising the contribution of light by multiple proximate reflectors, with a recommendation to read literature on the problem
39:48Blackboard: Radiosity, and stabilising the contribution of light by multiple proximate reflectors, with a recommendation to read literature on the problem
39:48Blackboard: Radiosity, and stabilising the contribution of light by multiple proximate reflectors, with a recommendation to read literature on the problem
43:37Blackboard: Considering how to handle over-contribution of light distribution
43:37Blackboard: Considering how to handle over-contribution of light distribution
43:37Blackboard: Considering how to handle over-contribution of light distribution
48:04handmade_render_group.cpp: Organise lighting_element to aid our conceptualisation of the light conservation problem
48:04handmade_render_group.cpp: Organise lighting_element to aid our conceptualisation of the light conservation problem
48:04handmade_render_group.cpp: Organise lighting_element to aid our conceptualisation of the light conservation problem
53:18Hit an error in OpenGLDebugCallback()
53:18Hit an error in OpenGLDebugCallback()
53:18Hit an error in OpenGLDebugCallback()
54:30Blackboard: All light must go somewhere
54:30Blackboard: All light must go somewhere
54:30Blackboard: All light must go somewhere
55:33handmade_render_group.cpp: Enable LightingTest() to make RefC converge towards 0, and track the transference and accumulation of light
55:33handmade_render_group.cpp: Enable LightingTest() to make RefC converge towards 0, and track the transference and accumulation of light
55:33handmade_render_group.cpp: Enable LightingTest() to make RefC converge towards 0, and track the transference and accumulation of light
1:03:25handmade_render_group.cpp: Enable LightingTest() to correct for the wrongness of the transfer
1:03:25handmade_render_group.cpp: Enable LightingTest() to correct for the wrongness of the transfer
1:03:25handmade_render_group.cpp: Enable LightingTest() to correct for the wrongness of the transfer
1:11:10Step through LightingTest()
1:11:10Step through LightingTest()
1:11:10Step through LightingTest()
1:13:10Consider how to handle emission
1:13:10Consider how to handle emission
1:13:10Consider how to handle emission
1:13:46handmade_render_group.cpp: Prevent LightingTest() from performing the correction and just letting the light bounce ad infinitum
1:13:46handmade_render_group.cpp: Prevent LightingTest() from performing the correction and just letting the light bounce ad infinitum
1:13:46handmade_render_group.cpp: Prevent LightingTest() from performing the correction and just letting the light bounce ad infinitum
1:14:27Run the game to see the flickery results
1:14:27Run the game to see the flickery results
1:14:27Run the game to see the flickery results
1:14:56handmade_render_group.cpp: Let LightingTest() perform the correction again, and run the game to see the flickering still
1:14:56handmade_render_group.cpp: Let LightingTest() perform the correction again, and run the game to see the flickering still
1:14:56handmade_render_group.cpp: Let LightingTest() perform the correction again, and run the game to see the flickering still
1:15:36Consider how to handle the total light transfer
1:15:36Consider how to handle the total light transfer
1:15:36Consider how to handle the total light transfer
1:17:35handmade_render_group.cpp: Add PhotonsToSend and PhotosReceived to lighting_element, for LightingTest() to use
1:17:35handmade_render_group.cpp: Add PhotonsToSend and PhotosReceived to lighting_element, for LightingTest() to use
1:17:35handmade_render_group.cpp: Add PhotonsToSend and PhotosReceived to lighting_element, for LightingTest() to use
1:22:14handmade_render_group.cpp: Enable LightingTest() to draw the photons
1:22:14handmade_render_group.cpp: Enable LightingTest() to draw the photons
1:22:14handmade_render_group.cpp: Enable LightingTest() to draw the photons
1:23:31Run the game to see the photons transference
1:23:31Run the game to see the photons transference
1:23:31Run the game to see the photons transference
1:24:08handmade_render_group.cpp: Assert in LightingTest() that PhotonsToSend <= TotalPhotonCount, run the game, hit that assertion and investigate why
1:24:08handmade_render_group.cpp: Assert in LightingTest() that PhotonsToSend <= TotalPhotonCount, run the game, hit that assertion and investigate why
1:24:08handmade_render_group.cpp: Assert in LightingTest() that PhotonsToSend <= TotalPhotonCount, run the game, hit that assertion and investigate why
1:26:43handmade_render_group.cpp: Make LightingTest() actually multiply in the correction
1:26:43handmade_render_group.cpp: Make LightingTest() actually multiply in the correction
1:26:43handmade_render_group.cpp: Make LightingTest() actually multiply in the correction
1:27:14Run the game in release, and see that it is more correct but that the flickering is still there
1:27:14Run the game in release, and see that it is more correct but that the flickering is still there
1:27:14Run the game in release, and see that it is more correct but that the flickering is still there
1:30:36Run the game on a loop and change the lighting iteration count to see how that affects it
1:30:36Run the game on a loop and change the lighting iteration count to see how that affects it
1:30:36Run the game on a loop and change the lighting iteration count to see how that affects it
1:32:40handmade_world_mode.cpp: Prevent AddPlayer() from adding any body parts and hit points
1:32:40handmade_world_mode.cpp: Prevent AddPlayer() from adding any body parts and hit points
1:32:40handmade_world_mode.cpp: Prevent AddPlayer() from adding any body parts and hit points
1:34:06Run the game and move just the light, to determine that the hero himself was causing the flickering problem
1:34:06Run the game and move just the light, to determine that the hero himself was causing the flickering problem
1:34:06Run the game and move just the light, to determine that the hero himself was causing the flickering problem
1:36:39handmade_render_group.cpp: Make LightingTest() strictly sum the FrontEmitC, and run the game without flickering, noting that the occluders are spaced far apart
1:36:39handmade_render_group.cpp: Make LightingTest() strictly sum the FrontEmitC, and run the game without flickering, noting that the occluders are spaced far apart
1:36:39handmade_render_group.cpp: Make LightingTest() strictly sum the FrontEmitC, and run the game without flickering, noting that the occluders are spaced far apart
1:39:31Determine to fix the distance falloff for close objects
1:39:31Determine to fix the distance falloff for close objects
1:39:31Determine to fix the distance falloff for close objects
1:40:11handmade_render_group.cpp: Let LightingTest() temper the FrontEmitC by the number of lighting iterations
1:40:11handmade_render_group.cpp: Let LightingTest() temper the FrontEmitC by the number of lighting iterations
1:40:11handmade_render_group.cpp: Let LightingTest() temper the FrontEmitC by the number of lighting iterations
1:41:42handmade_render_group.cpp: Remove PhotonsToSend and PhotonsReceived from lighting_element
1:41:42handmade_render_group.cpp: Remove PhotonsToSend and PhotonsReceived from lighting_element
1:41:42handmade_render_group.cpp: Remove PhotonsToSend and PhotonsReceived from lighting_element
1:42:34Run the game to see the stable light
1:42:34Run the game to see the stable light
1:42:34Run the game to see the stable light
1:42:44handmade_world_mode.cpp: Let AddPlayer() add body parts, and run the game noting that these body parts are very bright
1:42:44handmade_world_mode.cpp: Let AddPlayer() add body parts, and run the game noting that these body parts are very bright
1:42:44handmade_world_mode.cpp: Let AddPlayer() add body parts, and run the game noting that these body parts are very bright
1:44:28handmade_render_group.cpp: Fix the DistanceFalloff computation in LightingTest()
1:44:28handmade_render_group.cpp: Fix the DistanceFalloff computation in LightingTest()
1:44:28handmade_render_group.cpp: Fix the DistanceFalloff computation in LightingTest()
1:44:44Blackboard: Distance Falloff
1:44:44Blackboard: Distance Falloff
1:44:44Blackboard: Distance Falloff
1:48:25Run the game to see that the flickering has gone
1:48:25Run the game to see that the flickering has gone
1:48:25Run the game to see that the flickering has gone
1:49:27handmade_world_mode.cpp: Make AddStandardRoom() draw the walls in red
1:49:27handmade_world_mode.cpp: Make AddStandardRoom() draw the walls in red
1:49:27handmade_world_mode.cpp: Make AddStandardRoom() draw the walls in red
1:51:18Run the game to see if we get red light bleeding from the walls
1:51:18Run the game to see if we get red light bleeding from the walls
1:51:18Run the game to see if we get red light bleeding from the walls
1:51:53handmade_config.h: Perform two ambient occlusion passes and run the game
1:51:53handmade_config.h: Perform two ambient occlusion passes and run the game
1:51:53handmade_config.h: Perform two ambient occlusion passes and run the game
1:54:34Q&A
🗩
1:54:34Q&A
🗩
1:54:34Q&A
🗩
1:54:47macielda Is it supposed to be Square(...) and not SquareRoot(...)?
🗪
1:54:47macielda Is it supposed to be Square(...) and not SquareRoot(...)?
🗪
1:54:47macielda Is it supposed to be Square(...) and not SquareRoot(...)?
🗪
1:56:15handmade_render_group.cpp: Make LightingTest() prevent the DistanceFalloff from getting below 1
1:56:15handmade_render_group.cpp: Make LightingTest() prevent the DistanceFalloff from getting below 1
1:56:15handmade_render_group.cpp: Make LightingTest() prevent the DistanceFalloff from getting below 1
1:56:44Run the game to see how that looks
1:56:44Run the game to see how that looks
1:56:44Run the game to see how that looks
1:57:58the_8th_mage Now we don't need to do a global pass to normalize light?
🗪
1:57:58the_8th_mage Now we don't need to do a global pass to normalize light?
🗪
1:57:58the_8th_mage Now we don't need to do a global pass to normalize light?
🗪
1:59:07macielda Is it useful to convert the surface color from RGB to YUV in these equations, as in using Y to modulate light contribution somehow?
🗪
1:59:07macielda Is it useful to convert the surface color from RGB to YUV in these equations, as in using Y to modulate light contribution somehow?
🗪
1:59:07macielda Is it useful to convert the surface color from RGB to YUV in these equations, as in using Y to modulate light contribution somehow?
🗪
2:00:55the_8th_mage Do you know how much does a GPU gather cost compared to a load from a linear memory read?
🗪
2:00:55the_8th_mage Do you know how much does a GPU gather cost compared to a load from a linear memory read?
🗪
2:00:55the_8th_mage Do you know how much does a GPU gather cost compared to a load from a linear memory read?
🗪
2:02:01the_8th_mage I wrote GPU, not CPU
🗪
2:02:01the_8th_mage I wrote GPU, not CPU
🗪
2:02:01the_8th_mage I wrote GPU, not CPU
🗪
2:02:37handmade_config.h: Play with the lighting IterationCount and run
2:02:37handmade_config.h: Play with the lighting IterationCount and run
2:02:37handmade_config.h: Play with the lighting IterationCount and run
2:03:17cubercaleb Spectral lighting is something I never heard of before. Can you point out some good resources on the topic?1
🗪
2:03:17cubercaleb Spectral lighting is something I never heard of before. Can you point out some good resources on the topic?1
🗪
2:03:17cubercaleb Spectral lighting is something I never heard of before. Can you point out some good resources on the topic?1
🗪
2:05:44the_8th_mage In CPU it's much more efficient to read a cache line using _mm_load and not use the gather commands. Is the same true of the GPU?
🗪
2:05:44the_8th_mage In CPU it's much more efficient to read a cache line using _mm_load and not use the gather commands. Is the same true of the GPU?
🗪
2:05:44the_8th_mage In CPU it's much more efficient to read a cache line using _mm_load and not use the gather commands. Is the same true of the GPU?
🗪
2:12:25the_8th_mage Thanks, so you usually don't want to swizzle it yourself?
🗪
2:12:25the_8th_mage Thanks, so you usually don't want to swizzle it yourself?
🗪
2:12:25the_8th_mage Thanks, so you usually don't want to swizzle it yourself?
🗪
2:15:59the_8th_mage Is HMCon 3 still at the start of 2018?
🗪
2:15:59the_8th_mage Is HMCon 3 still at the start of 2018?
🗪
2:15:59the_8th_mage Is HMCon 3 still at the start of 2018?
🗪
2:16:32Brian ctray improvement: Would you be so kind as to give a suggestion of how you tackle saving the day? Do you prefer temp files (i.e. in %AppData%)? Just keep it simple like how you read settings.ctray. Should I look at how you save state like in ctime? I can try to tackle an alternative this week for I do need to become more confident in reading / writing to files
🗪
2:16:32Brian ctray improvement: Would you be so kind as to give a suggestion of how you tackle saving the day? Do you prefer temp files (i.e. in %AppData%)? Just keep it simple like how you read settings.ctray. Should I look at how you save state like in ctime? I can try to tackle an alternative this week for I do need to become more confident in reading / writing to files
🗪
2:16:32Brian ctray improvement: Would you be so kind as to give a suggestion of how you tackle saving the day? Do you prefer temp files (i.e. in %AppData%)? Just keep it simple like how you read settings.ctray. Should I look at how you save state like in ctime? I can try to tackle an alternative this week for I do need to become more confident in reading / writing to files
🗪
2:18:04Brian But that's what I did! I made it an ini file and rewrote that
🗪
2:18:04Brian But that's what I did! I made it an ini file and rewrote that
🗪
2:18:04Brian But that's what I did! I made it an ini file and rewrote that
🗪
2:19:15macielda Is it possible to mode-change monitor frequency nowadays (say from 75Hz to 60Hz) so I always try to get my game loop to run at 60Hz?
🗪
2:19:15macielda Is it possible to mode-change monitor frequency nowadays (say from 75Hz to 60Hz) so I always try to get my game loop to run at 60Hz?
🗪
2:19:15macielda Is it possible to mode-change monitor frequency nowadays (say from 75Hz to 60Hz) so I always try to get my game loop to run at 60Hz?
🗪
2:22:07Brian ctray question: As an exercise, I would like to investigate the cost of just bringing the overlays to the top and checking first if the overlays need to be brought forward. What should I look for? Should I profile the calls? Should I run it continuously to see if I get an error case? I realize this may not be the best thing to use as an example, but it was something I struggled with
🗪
2:22:07Brian ctray question: As an exercise, I would like to investigate the cost of just bringing the overlays to the top and checking first if the overlays need to be brought forward. What should I look for? Should I profile the calls? Should I run it continuously to see if I get an error case? I realize this may not be the best thing to use as an example, but it was something I struggled with
🗪
2:22:07Brian ctray question: As an exercise, I would like to investigate the cost of just bringing the overlays to the top and checking first if the overlays need to be brought forward. What should I look for? Should I profile the calls? Should I run it continuously to see if I get an error case? I realize this may not be the best thing to use as an example, but it was something I struggled with
🗪
2:24:35Close that
🗩
2:24:35Close that
🗩
2:24:35Close that
🗩