Handmade Hero»Episode Guide
Adding a Debug View for Lighting Points
?
?

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:13Recap and set the stage for the day
🗩
0:13Recap and set the stage for the day
🗩
0:13Recap and set the stage for the day
🗩
2:26Run the game to see our current lighting solution
🏃
2:26Run the game to see our current lighting solution
🏃
2:26Run the game to see our current lighting solution
🏃
6:34Read through ExtractReflectorsFromQuads()
📖
6:34Read through ExtractReflectorsFromQuads()
📖
6:34Read through ExtractReflectorsFromQuads()
📖
8:32Run the game to illustrate the need for some debug visualisation
🏃
8:32Run the game to illustrate the need for some debug visualisation
🏃
8:32Run the game to illustrate the need for some debug visualisation
🏃
10:01Note that SampleHemisphere() is not uniform as mentioned on the forums1
🗩
10:01Note that SampleHemisphere() is not uniform as mentioned on the forums1
🗩
10:01Note that SampleHemisphere() is not uniform as mentioned on the forums1
🗩
11:22Remove OutputLightingQuads() and clean up lighting structs and dependent functions
11:22Remove OutputLightingQuads() and clean up lighting structs and dependent functions
11:22Remove OutputLightingQuads() and clean up lighting structs and dependent functions
19:21Wish for the ability to fetch from a buffer in a fragment shader2,3
📖
19:21Wish for the ability to fetch from a buffer in a fragment shader2,3
📖
19:21Wish for the ability to fetch from a buffer in a fragment shader2,3
📖
24:14Pack lighting_textures differently, remove DecodePower() and trim down OutputLightingTextures()
24:14Pack lighting_textures differently, remove DecodePower() and trim down OutputLightingTextures()
24:14Pack lighting_textures differently, remove DecodePower() and trim down OutputLightingTextures()
32:22Propagate the new lighting_textures to the OpenGL side of things
32:22Propagate the new lighting_textures to the OpenGL side of things
32:22Propagate the new lighting_textures to the OpenGL side of things
37:12Z-Value Reconstruction
🖌
37:12Z-Value Reconstruction
🖌
37:12Z-Value Reconstruction
🖌
39:08Enable CompileZBiasProgram() to reconstruct the Z-value
39:08Enable CompileZBiasProgram() to reconstruct the Z-value
39:08Enable CompileZBiasProgram() to reconstruct the Z-value
43:05Run the game to see colour washes
🏃
43:05Run the game to see colour washes
🏃
43:05Run the game to see colour washes
🏃
44:05Determine to draw lighting sample points
🗩
44:05Determine to draw lighting sample points
🗩
44:05Determine to draw lighting sample points
🗩
46:19Run the game, try adjusting the lighting iteration count and note our apparent power leakage problem
🏃
46:19Run the game, try adjusting the lighting iteration count and note our apparent power leakage problem
🏃
46:19Run the game, try adjusting the lighting iteration count and note our apparent power leakage problem
🏃
50:06Replace OutputLightingQuads() with OutputLightingPoints()
50:06Replace OutputLightingQuads() with OutputLightingPoints()
50:06Replace OutputLightingQuads() with OutputLightingPoints()
52:59Run the game and try toggling between the regular view and debug visualisation
🏃
52:59Run the game and try toggling between the regular view and debug visualisation
🏃
52:59Run the game and try toggling between the regular view and debug visualisation
🏃
53:30Enable OutputLightingPoints() to output the lighting sample points
53:30Enable OutputLightingPoints() to output the lighting sample points
53:30Enable OutputLightingPoints() to output the lighting sample points
1:00:55Run the game to see our lighting sample points
🏃
1:00:55Run the game to see our lighting sample points
🏃
1:00:55Run the game to see our lighting sample points
🏃
1:01:30Try to enable UpdateAndRenderWorld() to perform the simulation even in the debug visualisation
1:01:30Try to enable UpdateAndRenderWorld() to perform the simulation even in the debug visualisation
1:01:30Try to enable UpdateAndRenderWorld() to perform the simulation even in the debug visualisation
1:05:57Run the game to see that this doesn't quite work
🏃
1:05:57Run the game to see that this doesn't quite work
🏃
1:05:57Run the game to see that this doesn't quite work
🏃
1:06:10Revert our simulation update attempt
1:06:10Revert our simulation update attempt
1:06:10Revert our simulation update attempt
1:07:29Run the game to see our lighting sample points
🏃
1:07:29Run the game to see our lighting sample points
🏃
1:07:29Run the game to see our lighting sample points
🏃
1:09:43Read through ComputeLightPropagation()
📖
1:09:43Read through ComputeLightPropagation()
📖
1:09:43Read through ComputeLightPropagation()
📖
1:12:47Make RayCast() account for the Source Position in the Position computation
1:12:47Make RayCast() account for the Source Position in the Position computation
1:12:47Make RayCast() account for the Source Position in the Position computation
1:13:55Run the game to see that it looks much more correct
🏃
1:13:55Run the game to see that it looks much more correct
🏃
1:13:55Run the game to see that it looks much more correct
🏃
1:15:47Temporarily increase the RayCount in ComputeLightPropagation()
1:15:47Temporarily increase the RayCount in ComputeLightPropagation()
1:15:47Temporarily increase the RayCount in ComputeLightPropagation()
1:16:01Run the game to see the lighting solution with more rays
🏃
1:16:01Run the game to see the lighting solution with more rays
🏃
1:16:01Run the game to see the lighting solution with more rays
🏃
1:17:05Determine to make the light sampling more unbiased
🗩
1:17:05Determine to make the light sampling more unbiased
🗩
1:17:05Determine to make the light sampling more unbiased
🗩
1:18:58Run the game and determine to enable lighting recomputation while showing the debug visualisation
🏃
1:18:58Run the game and determine to enable lighting recomputation while showing the debug visualisation
🏃
1:18:58Run the game and determine to enable lighting recomputation while showing the debug visualisation
🏃
1:19:34Enable UpdateAndRenderWorld() to recompute the lighting while showing the debug visualisation
1:19:34Enable UpdateAndRenderWorld() to recompute the lighting while showing the debug visualisation
1:19:34Enable UpdateAndRenderWorld() to recompute the lighting while showing the debug visualisation
1:20:18Run the game and try out our new ability
🏃
1:20:18Run the game and try out our new ability
🏃
1:20:18Run the game and try out our new ability
🏃
1:20:41Increase sample point size in OutputLightingPoints()
1:20:41Increase sample point size in OutputLightingPoints()
1:20:41Increase sample point size in OutputLightingPoints()
1:21:01Run the game to see our bigger sample points
🏃
1:21:01Run the game to see our bigger sample points
🏃
1:21:01Run the game to see our bigger sample points
🏃
1:22:06Toggle off the snake in PlayWorld()
1:22:06Toggle off the snake in PlayWorld()
1:22:06Toggle off the snake in PlayWorld()
1:22:29Run the game to see our current lighting solution
🏃
1:22:29Run the game to see our current lighting solution
🏃
1:22:29Run the game to see our current lighting solution
🏃
1:23:06Consider how to get the lighting bounce to work better
🗩
1:23:06Consider how to get the lighting bounce to work better
🗩
1:23:06Consider how to get the lighting bounce to work better
🗩
1:25:13"Energy Conservation"
🖌
1:25:13"Energy Conservation"
🖌
1:25:13"Energy Conservation"
🖌
1:28:33Introduce the notion of LightRetention in ComputeLightPropagation() to only retain 50% of the light
1:28:33Introduce the notion of LightRetention in ComputeLightPropagation() to only retain 50% of the light
1:28:33Introduce the notion of LightRetention in ComputeLightPropagation() to only retain 50% of the light
1:31:31Run the game to see that the light gets dimmer and dimmer
🏃
1:31:31Run the game to see that the light gets dimmer and dimmer
🏃
1:31:31Run the game to see that the light gets dimmer and dimmer
🏃
1:32:14Enable ComputeLightPropagation() to retain light if rays do not hit
1:32:14Enable ComputeLightPropagation() to retain light if rays do not hit
1:32:14Enable ComputeLightPropagation() to retain light if rays do not hit
1:34:57Run the game to see that the light still gets dimmer
🏃
1:34:57Run the game to see that the light still gets dimmer
🏃
1:34:57Run the game to see that the light still gets dimmer
🏃
1:36:10Read through ComputeLightPropagation()
📖
1:36:10Read through ComputeLightPropagation()
📖
1:36:10Read through ComputeLightPropagation()
📖
1:37:17“It could just be floating point nonsense but it's probably something real”α
🗩
1:37:17“It could just be floating point nonsense but it's probably something real”α
🗩
1:37:17“It could just be floating point nonsense but it's probably something real”α
🗩
1:37:29Change AccumulateSample() to return the Power for ComputeLightPropagation() to use
1:37:29Change AccumulateSample() to return the Power for ComputeLightPropagation() to use
1:37:29Change AccumulateSample() to return the Power for ComputeLightPropagation() to use
1:38:29Run the game to see that it's better but still not right
🏃
1:38:29Run the game to see that it's better but still not right
🏃
1:38:29Run the game to see that it's better but still not right
🏃
1:38:51Read closely through ComputeLightPropagation() to try and see where we lose power
📖
1:38:51Read closely through ComputeLightPropagation() to try and see where we lose power
📖
1:38:51Read closely through ComputeLightPropagation() to try and see where we lose power
📖
1:40:28Make ComputeLightPropagation() compute the DestEmitC from the SourceEmitC
1:40:28Make ComputeLightPropagation() compute the DestEmitC from the SourceEmitC
1:40:28Make ComputeLightPropagation() compute the DestEmitC from the SourceEmitC
1:40:49Run the game to see that we are so close
🏃
1:40:49Run the game to see that we are so close
🏃
1:40:49Run the game to see that we are so close
🏃
1:41:31Thoroughly consider how to correctly retain light
📖
1:41:31Thoroughly consider how to correctly retain light
📖
1:41:31Thoroughly consider how to correctly retain light
📖
1:44:54Describe the problem
🗩
1:44:54Describe the problem
🗩
1:44:54Describe the problem
🗩
1:45:33Introduce the notion of a retention coefficient in ComputeLightPropagation()
1:45:33Introduce the notion of a retention coefficient in ComputeLightPropagation()
1:45:33Introduce the notion of a retention coefficient in ComputeLightPropagation()
1:46:41Run the game to see that it still gets down to zero eventually
🏃
1:46:41Run the game to see that it still gets down to zero eventually
🏃
1:46:41Run the game to see that it still gets down to zero eventually
🏃
1:47:00Make AccumulateSample() return the full colour for ComputeLightPropagation() to use as the retainer
1:47:00Make AccumulateSample() return the full colour for ComputeLightPropagation() to use as the retainer
1:47:00Make AccumulateSample() return the full colour for ComputeLightPropagation() to use as the retainer
1:49:01Run the game to see that we're still losing power
🏃
1:49:01Run the game to see that we're still losing power
🏃
1:49:01Run the game to see that we're still losing power
🏃
1:49:37Read through ComputeLightPropagation() one last time
📖
1:49:37Read through ComputeLightPropagation() one last time
📖
1:49:37Read through ComputeLightPropagation() one last time
📖
1:50:32Run the game and look at our lighting samples
🏃
1:50:32Run the game and look at our lighting samples
🏃
1:50:32Run the game and look at our lighting samples
🏃
1:52:39Q&A
🗩
1:52:39Q&A
🗩
1:52:39Q&A
🗩
1:53:41pseudonym73 cmuratori Am I right in thinking that you're taking into account the geometric (cos theta) factor on the receiving surface, but not on the emitting surface?
🗪
1:53:41pseudonym73 cmuratori Am I right in thinking that you're taking into account the geometric (cos theta) factor on the receiving surface, but not on the emitting surface?
🗪
1:53:41pseudonym73 cmuratori Am I right in thinking that you're taking into account the geometric (cos theta) factor on the receiving surface, but not on the emitting surface?
🗪
1:53:55groggeh Q: In a trade like blacksmithing, you use your tools to make better tools over time. Do you think programming should be like this, where you build tools that you reuse every project? Or should you rebuild most of your code every project?
🗪
1:53:55groggeh Q: In a trade like blacksmithing, you use your tools to make better tools over time. Do you think programming should be like this, where you build tools that you reuse every project? Or should you rebuild most of your code every project?
🗪
1:53:55groggeh Q: In a trade like blacksmithing, you use your tools to make better tools over time. Do you think programming should be like this, where you build tools that you reuse every project? Or should you rebuild most of your code every project?
🗪
1:56:48pseudonym73 Q: That may explain why it wasn't energy preserving
🗪
1:56:48pseudonym73 Q: That may explain why it wasn't energy preserving
🗪
1:56:48pseudonym73 Q: That may explain why it wasn't energy preserving
🗪
1:57:19m0re85 Q: Could you explain the purpose of multiple pointer levels like void *****whatever? Is it just an array of array of array of array... I can't think of a viable example, can you give one?
🗪
1:57:19m0re85 Q: Could you explain the purpose of multiple pointer levels like void *****whatever? Is it just an array of array of array of array... I can't think of a viable example, can you give one?
🗪
1:57:19m0re85 Q: Could you explain the purpose of multiple pointer levels like void *****whatever? Is it just an array of array of array of array... I can't think of a viable example, can you give one?
🗪
1:58:01mtsmox Q: Is the direction of the light correctly recalculated if you only take positive z into account, negative z is also a correct normal, right?
🗪
1:58:01mtsmox Q: Is the direction of the light correctly recalculated if you only take positive z into account, negative z is also a correct normal, right?
🗪
1:58:01mtsmox Q: Is the direction of the light correctly recalculated if you only take positive z into account, negative z is also a correct normal, right?
🗪
1:58:48Make OutputLightTextures() and CompileZBiasProgram() correctly recalculate the light for both positive and negative Z values
1:58:48Make OutputLightTextures() and CompileZBiasProgram() correctly recalculate the light for both positive and negative Z values
1:58:48Make OutputLightTextures() and CompileZBiasProgram() correctly recalculate the light for both positive and negative Z values
2:01:00Run the game to see the lighting solution
🏃
2:01:00Run the game to see the lighting solution
🏃
2:01:00Run the game to see the lighting solution
🏃
2:01:29longboolean Q: In the case of the red wall only being lit by the 3rd or 4th bounce, shouldn't the red wall not reflect any red light because the blue wall is mostly only reflecting blue light?
🗪
2:01:29longboolean Q: In the case of the red wall only being lit by the 3rd or 4th bounce, shouldn't the red wall not reflect any red light because the blue wall is mostly only reflecting blue light?
🗪
2:01:29longboolean Q: In the case of the red wall only being lit by the 3rd or 4th bounce, shouldn't the red wall not reflect any red light because the blue wall is mostly only reflecting blue light?
🗪
2:02:26pseudonym73 Q: Yeah, but think back. The original problem was that the solution was blowing up, wasn't it?
🗪
2:02:26pseudonym73 Q: Yeah, but think back. The original problem was that the solution was blowing up, wasn't it?
🗪
2:02:26pseudonym73 Q: Yeah, but think back. The original problem was that the solution was blowing up, wasn't it?
🗪
2:03:26m0re85 Q: void ** is clear, everything above is bogus
🗪
2:03:26m0re85 Q: void ** is clear, everything above is bogus
🗪
2:03:26m0re85 Q: void ** is clear, everything above is bogus
🗪
2:03:40Pointers to Pointers
🖌
2:03:40Pointers to Pointers
🖌
2:03:40Pointers to Pointers
🖌
2:05:59pseudonym73 Q: Just as a suggestion, the ultimate solution might be to use temporal coherence. Do one bounce per frame, and use the previous frame's solution for the indirect lighting term
🗪
2:05:59pseudonym73 Q: Just as a suggestion, the ultimate solution might be to use temporal coherence. Do one bounce per frame, and use the previous frame's solution for the indirect lighting term
🗪
2:05:59pseudonym73 Q: Just as a suggestion, the ultimate solution might be to use temporal coherence. Do one bounce per frame, and use the previous frame's solution for the indirect lighting term
🗪
2:07:01darkenderio Q: Two weeks ago I asked about sound input. I just want to specify that I was thinking about the data structure to store the sound input. So like you have it setup with the platform layer handling the sound input and passing it to the game
🗪
2:07:01darkenderio Q: Two weeks ago I asked about sound input. I just want to specify that I was thinking about the data structure to store the sound input. So like you have it setup with the platform layer handling the sound input and passing it to the game
🗪
2:07:01darkenderio Q: Two weeks ago I asked about sound input. I just want to specify that I was thinking about the data structure to store the sound input. So like you have it setup with the platform layer handling the sound input and passing it to the game
🗪
2:07:51Shut it down
🗩
2:07:51Shut it down
🗩
2:07:51Shut it down
🗩