Handmade Hero»Episode Guide
Converting Depth Peel Data to Lighting Data
?
?

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
2:05Consider how to resolve the issue that we're only computing the lighting on the topmost of four depth peels
2:05Consider how to resolve the issue that we're only computing the lighting on the topmost of four depth peels
2:05Consider how to resolve the issue that we're only computing the lighting on the topmost of four depth peels
5:41Mention that multigrid lighting may not work out
5:41Mention that multigrid lighting may not work out
5:41Mention that multigrid lighting may not work out
9:29Run the game to see the current state of the lighting system
9:29Run the game to see the current state of the lighting system
9:29Run the game to see the current state of the lighting system
12:31handmade_opengl.cpp: Fix "Minor copy-paste error in handmade_opengl.cpp" issue1
12:31handmade_opengl.cpp: Fix "Minor copy-paste error in handmade_opengl.cpp" issue1
12:31handmade_opengl.cpp: Fix "Minor copy-paste error in handmade_opengl.cpp" issue1
14:13handmade_opengl.cpp: Prevent ComputeLightTransport() from pulling the emit colour from the DepthPeelResolveBuffer
14:13handmade_opengl.cpp: Prevent ComputeLightTransport() from pulling the emit colour from the DepthPeelResolveBuffer
14:13handmade_opengl.cpp: Prevent ComputeLightTransport() from pulling the emit colour from the DepthPeelResolveBuffer
15:03Run the game to see the existing fake lighting
15:03Run the game to see the existing fake lighting
15:03Run the game to see the existing fake lighting
15:22handmade_opengl.cpp: Enable ComputeLightTransport() to bind lighting textures that come from the depth peel
15:22handmade_opengl.cpp: Enable ComputeLightTransport() to bind lighting textures that come from the depth peel
15:22handmade_opengl.cpp: Enable ComputeLightTransport() to bind lighting textures that come from the depth peel
20:00handmade_opengl.cpp: Introduce CompileDepthPeelToLighting() based on CompilePeelComposite()
20:00handmade_opengl.cpp: Introduce CompileDepthPeelToLighting() based on CompilePeelComposite()
20:00handmade_opengl.cpp: Introduce CompileDepthPeelToLighting() based on CompilePeelComposite()
29:16handmade_opengl.cpp: Make CompilePeelComposite() compute the FrontEmit, BackEmit, SurfaceColor and NP
29:16handmade_opengl.cpp: Make CompilePeelComposite() compute the FrontEmit, BackEmit, SurfaceColor and NP
29:16handmade_opengl.cpp: Make CompilePeelComposite() compute the FrontEmit, BackEmit, SurfaceColor and NP
32:50handmade_opengl.cpp: Change CompilePeelComposite() to use the layout(location) syntax and take an opengl_program_common
32:50handmade_opengl.cpp: Change CompilePeelComposite() to use the layout(location) syntax and take an opengl_program_common
32:50handmade_opengl.cpp: Change CompilePeelComposite() to use the layout(location) syntax and take an opengl_program_common
37:55Run the game and see bright white
37:55Run the game and see bright white
37:55Run the game and see bright white
38:12Research the OpenGL Layout qualifier2,3
38:12Research the OpenGL Layout qualifier2,3
38:12Research the OpenGL Layout qualifier2,3
42:35handmade_opengl.cpp: Revert CompilePeelComposite() to not use the layout(location) syntax, and make all the programs explicit
42:35handmade_opengl.cpp: Revert CompilePeelComposite() to not use the layout(location) syntax, and make all the programs explicit
42:35handmade_opengl.cpp: Revert CompilePeelComposite() to not use the layout(location) syntax, and make all the programs explicit
45:20handmade_opengl.cpp: Make OpenGLCreateProgram() reset the SamplerCount, and introduce OpenGLLinkSamplers()
45:20handmade_opengl.cpp: Make OpenGLCreateProgram() reset the SamplerCount, and introduce OpenGLLinkSamplers()
45:20handmade_opengl.cpp: Make OpenGLCreateProgram() reset the SamplerCount, and introduce OpenGLLinkSamplers()
50:15Run the game to see what we had running before
50:15Run the game to see what we had running before
50:15Run the game to see what we had running before
50:31handmade_opengl.cpp: Make all the shader programs use OpenGLLinkSamplers(), as a partial way towards layout(location)
50:31handmade_opengl.cpp: Make all the shader programs use OpenGLLinkSamplers(), as a partial way towards layout(location)
50:31handmade_opengl.cpp: Make all the shader programs use OpenGLLinkSamplers(), as a partial way towards layout(location)
56:00handmade_opengl.cpp: Make UseProgramBegin() set up all of the samplers for the program
56:00handmade_opengl.cpp: Make UseProgramBegin() set up all of the samplers for the program
56:00handmade_opengl.cpp: Make UseProgramBegin() set up all of the samplers for the program
56:59Run the game to see that we're back to normal, view the beautiful depth buffer and investigate why we are seeing it
56:59Run the game to see that we're back to normal, view the beautiful depth buffer and investigate why we are seeing it
56:59Run the game to see that we're back to normal, view the beautiful depth buffer and investigate why we are seeing it
1:01:07handmade_opengl.cpp: Hard set CompileZBiasProgram() to write red into BlendUnitColor[0]
1:01:07handmade_opengl.cpp: Hard set CompileZBiasProgram() to write red into BlendUnitColor[0]
1:01:07handmade_opengl.cpp: Hard set CompileZBiasProgram() to write red into BlendUnitColor[0]
1:01:43Run the game to see that it isn't all red, and determine that some other phase must be wrong
1:01:43Run the game to see that it isn't all red, and determine that some other phase must be wrong
1:01:43Run the game to see that it isn't all red, and determine that some other phase must be wrong
1:03:13handmade_opengl.cpp: Make CompileResolveMultisample() pass the samplers to OpenGLLinkSamplers() in the correct order, and run the game to see that we're back to normal
1:03:13handmade_opengl.cpp: Make CompileResolveMultisample() pass the samplers to OpenGLLinkSamplers() in the correct order, and run the game to see that we're back to normal
1:03:13handmade_opengl.cpp: Make CompileResolveMultisample() pass the samplers to OpenGLLinkSamplers() in the correct order, and run the game to see that we're back to normal
1:03:35handmade_opengl.h and handmade_opengl.cpp: Remove peel_composite_program, final_stretch_program and multigrid_light_up_program, and their corresponding OpenGLProgramBegin() functions
1:03:35handmade_opengl.h and handmade_opengl.cpp: Remove peel_composite_program, final_stretch_program and multigrid_light_up_program, and their corresponding OpenGLProgramBegin() functions
1:03:35handmade_opengl.h and handmade_opengl.cpp: Remove peel_composite_program, final_stretch_program and multigrid_light_up_program, and their corresponding OpenGLProgramBegin() functions
1:06:09Run the game to see that we're still fine
1:06:09Run the game to see that we're still fine
1:06:09Run the game to see that we're still fine
1:06:15handmade_opengl.cpp: Try and force CompileResolveMultisample() to use layout(location = 8)
1:06:15handmade_opengl.cpp: Try and force CompileResolveMultisample() to use layout(location = 8)
1:06:15handmade_opengl.cpp: Try and force CompileResolveMultisample() to use layout(location = 8)
1:10:45handmade_opengl.cpp: Toggle back on the depth peel importing in ComputeLightTransport()
1:10:45handmade_opengl.cpp: Toggle back on the depth peel importing in ComputeLightTransport()
1:10:45handmade_opengl.cpp: Toggle back on the depth peel importing in ComputeLightTransport()
1:11:17Run the game to see that this does appear to have imported the lighting values
1:11:17Run the game to see that this does appear to have imported the lighting values
1:11:17Run the game to see that this does appear to have imported the lighting values
1:13:52Determine to bounce the light around
1:13:52Determine to bounce the light around
1:13:52Determine to bounce the light around
1:17:30Blackboard: Multigrid light transport
1:17:30Blackboard: Multigrid light transport
1:17:30Blackboard: Multigrid light transport
1:20:42Blackboard: The multigrid dream
1:20:42Blackboard: The multigrid dream
1:20:42Blackboard: The multigrid dream
1:27:54handmade_opengl.cpp: Consider what we can do in CompileMultiLightDown()
1:27:54handmade_opengl.cpp: Consider what we can do in CompileMultiLightDown()
1:27:54handmade_opengl.cpp: Consider what we can do in CompileMultiLightDown()
1:29:26Blackboard: Bouncing light
1:29:26Blackboard: Bouncing light
1:29:26Blackboard: Bouncing light
1:30:21Blackboard: Figuring out how aligned light sources are
1:30:21Blackboard: Figuring out how aligned light sources are
1:30:21Blackboard: Figuring out how aligned light sources are
1:31:02handmade_opengl.cpp: Make CompileMultiLightDown() compute the facing term, the distance between lights and the falloff4
1:31:02handmade_opengl.cpp: Make CompileMultiLightDown() compute the facing term, the distance between lights and the falloff4
1:31:02handmade_opengl.cpp: Make CompileMultiLightDown() compute the facing term, the distance between lights and the falloff4
1:34:45Note that we're not reconstructing the light positions
1:34:45Note that we're not reconstructing the light positions
1:34:45Note that we're not reconstructing the light positions
1:35:19"That's gonna be a whole bailiwick in and of itself"α
1:35:19"That's gonna be a whole bailiwick in and of itself"α
1:35:19"That's gonna be a whole bailiwick in and of itself"α
1:36:08handmade_opengl.cpp: Make ReconstructPosition() in CompileMultiLightDown() use UV
1:36:08handmade_opengl.cpp: Make ReconstructPosition() in CompileMultiLightDown() use UV
1:36:08handmade_opengl.cpp: Make ReconstructPosition() in CompileMultiLightDown() use UV
1:36:52Run the game, crash in ExecuteBrain() and investigate why
1:36:52Run the game, crash in ExecuteBrain() and investigate why
1:36:52Run the game, crash in ExecuteBrain() and investigate why
1:39:02win32_handmade.cpp: Reduce the resolution in WinMain() and run the game to see that that looks better
1:39:02win32_handmade.cpp: Reduce the resolution in WinMain() and run the game to see that that looks better
1:39:02win32_handmade.cpp: Reduce the resolution in WinMain() and run the game to see that that looks better
1:41:06handmade_opengl.cpp: Make CompileZBiasProgram() create a white light and run the game to see what's happening
1:41:06handmade_opengl.cpp: Make CompileZBiasProgram() create a white light and run the game to see what's happening
1:41:06handmade_opengl.cpp: Make CompileZBiasProgram() create a white light and run the game to see what's happening
1:42:49handmade_opengl.cpp: Investigate why we are not seeing any colour contribution from textures
1:42:49handmade_opengl.cpp: Investigate why we are not seeing any colour contribution from textures
1:42:49handmade_opengl.cpp: Investigate why we are not seeing any colour contribution from textures
1:44:52handmade_opengl.cpp: Fix TransferLight() in CompileZBiasProgram() to use the Falloff, and run the game to see colour contributon
1:44:52handmade_opengl.cpp: Fix TransferLight() in CompileZBiasProgram() to use the Falloff, and run the game to see colour contributon
1:44:52handmade_opengl.cpp: Fix TransferLight() in CompileZBiasProgram() to use the Falloff, and run the game to see colour contributon
1:45:13handmade_opengl.cpp: Make TransferLight() in CompileZBiasProgram() transfer based on the facing direction and run the game to see that that is not working
1:45:13handmade_opengl.cpp: Make TransferLight() in CompileZBiasProgram() transfer based on the facing direction and run the game to see that that is not working
1:45:13handmade_opengl.cpp: Make TransferLight() in CompileZBiasProgram() transfer based on the facing direction and run the game to see that that is not working
1:47:43handmade_opengl.cpp: Investigate why the facing direction isn't producing the expected transfer
1:47:43handmade_opengl.cpp: Investigate why the facing direction isn't producing the expected transfer
1:47:43handmade_opengl.cpp: Investigate why the facing direction isn't producing the expected transfer
1:52:44handmade_opengl.cpp: Make CompileMultiGridDown() write the reconstructed normal into our second channel, and run the game to inspect that channel
1:52:44handmade_opengl.cpp: Make CompileMultiGridDown() write the reconstructed normal into our second channel, and run the game to inspect that channel
1:52:44handmade_opengl.cpp: Make CompileMultiGridDown() write the reconstructed normal into our second channel, and run the game to inspect that channel
1:55:27handmade_opengl.cpp: Make ReconstructNormal() in CompileMultiGridDown() overwrite the Z with 0 and run the game to see that upward facing components still contain green
1:55:27handmade_opengl.cpp: Make ReconstructNormal() in CompileMultiGridDown() overwrite the Z with 0 and run the game to see that upward facing components still contain green
1:55:27handmade_opengl.cpp: Make ReconstructNormal() in CompileMultiGridDown() overwrite the Z with 0 and run the game to see that upward facing components still contain green
1:57:02handmade_opengl.cpp: Make CompileDepthPeelToLighting() correctly compute the Nx and Ny and run the game to see better values
1:57:02handmade_opengl.cpp: Make CompileDepthPeelToLighting() correctly compute the Nx and Ny and run the game to see better values
1:57:02handmade_opengl.cpp: Make CompileDepthPeelToLighting() correctly compute the Nx and Ny and run the game to see better values
1:57:48handmade_opengl.cpp: Make ReconstructNormal() in CompileMultiGridDown() use the computed Z and run the game with more confidence that the normals are plausible
1:57:48handmade_opengl.cpp: Make ReconstructNormal() in CompileMultiGridDown() use the computed Z and run the game with more confidence that the normals are plausible
1:57:48handmade_opengl.cpp: Make ReconstructNormal() in CompileMultiGridDown() use the computed Z and run the game with more confidence that the normals are plausible
1:58:28handmade_opengl.cpp: Continue investigating why we're not getting any light transference
1:58:28handmade_opengl.cpp: Continue investigating why we're not getting any light transference
1:58:28handmade_opengl.cpp: Continue investigating why we're not getting any light transference
2:00:36handmade_opengl.cpp: Make CompileZBiasProgram() output the negative inner product of the surface normals
2:00:36handmade_opengl.cpp: Make CompileZBiasProgram() output the negative inner product of the surface normals
2:00:36handmade_opengl.cpp: Make CompileZBiasProgram() output the negative inner product of the surface normals
2:01:20Run the game to see that negative product
2:01:20Run the game to see that negative product
2:01:20Run the game to see that negative product
2:01:39handmade_opengl.cpp: Make CompileZBiasProgram() output the non-negative inner product of the surface normals
2:01:39handmade_opengl.cpp: Make CompileZBiasProgram() output the non-negative inner product of the surface normals
2:01:39handmade_opengl.cpp: Make CompileZBiasProgram() output the non-negative inner product of the surface normals
2:01:47Run the game to see this non-negative product
2:01:47Run the game to see this non-negative product
2:01:47Run the game to see this non-negative product
2:04:06Q&A
🗩
2:04:06Q&A
🗩
2:04:06Q&A
🗩
2:04:50Miblo Could some of our lighting code end up being used by the audio system to figure out where and how obstructed / reflected sound sources are?
🗪
2:04:50Miblo Could some of our lighting code end up being used by the audio system to figure out where and how obstructed / reflected sound sources are?
🗪
2:04:50Miblo Could some of our lighting code end up being used by the audio system to figure out where and how obstructed / reflected sound sources are?
🗪
2:06:01lorto6 Try 1 - clamp()!
🗪
2:06:01lorto6 Try 1 - clamp()!
🗪
2:06:01lorto6 Try 1 - clamp()!
🗪
2:06:27Blackboard: Clamping normals
2:06:27Blackboard: Clamping normals
2:06:27Blackboard: Clamping normals
2:08:03asafgartner Should you add a fake ceiling for lighting (or a non-fake ceiling based on the floor above the current one)?
🗪
2:08:03asafgartner Should you add a fake ceiling for lighting (or a non-fake ceiling based on the floor above the current one)?
🗪
2:08:03asafgartner Should you add a fake ceiling for lighting (or a non-fake ceiling based on the floor above the current one)?
🗪
2:08:48xyane Not entirely related to today's stream, but will you perhaps use something like a pipeline state object for binding resources? I personally find that I get a few annoying debug messages telling me about resource hazards and I'd like a better way than randomly throwing in null binds in the middle of my code and would like a better way to bind resources to minimize API calls, and would love to see a good PSO implementation
🗪
2:08:48xyane Not entirely related to today's stream, but will you perhaps use something like a pipeline state object for binding resources? I personally find that I get a few annoying debug messages telling me about resource hazards and I'd like a better way than randomly throwing in null binds in the middle of my code and would like a better way to bind resources to minimize API calls, and would love to see a good PSO implementation
🗪
2:08:48xyane Not entirely related to today's stream, but will you perhaps use something like a pipeline state object for binding resources? I personally find that I get a few annoying debug messages telling me about resource hazards and I'd like a better way than randomly throwing in null binds in the middle of my code and would like a better way to bind resources to minimize API calls, and would love to see a good PSO implementation
🗪
2:11:34We are done for today
🗩
2:11:34We are done for today
🗩
2:11:34We are done for today
🗩