Rendering Lighting Information from the Game ⚠ Click here to regain focus ⚠
?
?

Keyboard Navigation

Global Keys

W, A, P / S, D, N Jump to previous / next marker
z Toggle filter mode V Revert filter to original state

Menu toggling

q Quotes r References f Filter c Credits

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

Credits Menu

Enter Open URL (in new tab)
0:01Recap and set the stage for the day
0:01Recap and set the stage for the day
0:01Recap and set the stage for the day
0:51handmade_opengl.cpp and handmade_opengl.h: Rename UVStep to SourceUVStep everywhere CompileMultiLightDown()
0:51handmade_opengl.cpp and handmade_opengl.h: Rename UVStep to SourceUVStep everywhere CompileMultiLightDown()
0:51handmade_opengl.cpp and handmade_opengl.h: Rename UVStep to SourceUVStep everywhere CompileMultiLightDown()
3:06Run the game and consider using different textures for the up and down sampling
3:06Run the game and consider using different textures for the up and down sampling
3:06Run the game and consider using different textures for the up and down sampling
3:54handmade_opengl.cpp: Make TransferLight() in CompileMultiLightDown() use the reflection colour and enable ComputeLightTransport() to combine the colours with glBlendFunc()
3:54handmade_opengl.cpp: Make TransferLight() in CompileMultiLightDown() use the reflection colour and enable ComputeLightTransport() to combine the colours with glBlendFunc()
3:54handmade_opengl.cpp: Make TransferLight() in CompileMultiLightDown() use the reflection colour and enable ComputeLightTransport() to combine the colours with glBlendFunc()
8:33Run the game to see that we're now seeing unlit dots, despite the scene being lit yellow by them
8:33Run the game to see that we're now seeing unlit dots, despite the scene being lit yellow by them
8:33Run the game to see that we're now seeing unlit dots, despite the scene being lit yellow by them
10:17handmade_opengl.cpp: Reduce the colour intensity of the lights in CompileFakeSeedLighting() and run the game to see the scene's yellow light still not affecting the interior of the red and green light sources
10:17handmade_opengl.cpp: Reduce the colour intensity of the lights in CompileFakeSeedLighting() and run the game to see the scene's yellow light still not affecting the interior of the red and green light sources
10:17handmade_opengl.cpp: Reduce the colour intensity of the lights in CompileFakeSeedLighting() and run the game to see the scene's yellow light still not affecting the interior of the red and green light sources
12:04handmade_opengl.cpp: Make TransferLight() in CompileMultiLightDown() reduce the amount of light transferred, running the game to see how that affects it
12:04handmade_opengl.cpp: Make TransferLight() in CompileMultiLightDown() reduce the amount of light transferred, running the game to see how that affects it
12:04handmade_opengl.cpp: Make TransferLight() in CompileMultiLightDown() reduce the amount of light transferred, running the game to see how that affects it
14:47Run the game and describe exactly what we're expecting
14:47Run the game and describe exactly what we're expecting
14:47Run the game and describe exactly what we're expecting
15:32handmade_opengl.cpp: Prevent TransferLight() in CompileMultiLightDown() from using the reflection colour
15:32handmade_opengl.cpp: Prevent TransferLight() in CompileMultiLightDown() from using the reflection colour
15:32handmade_opengl.cpp: Prevent TransferLight() in CompileMultiLightDown() from using the reflection colour
15:54Run the game to see the red and green light sources being affected by each other
15:54Run the game to see the red and green light sources being affected by each other
15:54Run the game to see the red and green light sources being affected by each other
16:12handmade_opengl.cpp: Make TransferLight() in CompileMultiLightDown() clamp the light transfer and run the game to see that
16:12handmade_opengl.cpp: Make TransferLight() in CompileMultiLightDown() clamp the light transfer and run the game to see that
16:12handmade_opengl.cpp: Make TransferLight() in CompileMultiLightDown() clamp the light transfer and run the game to see that
17:04handmade_opengl.cpp: Make TransferLight() in CompileMultiLightDown() use the reflection colour again, and run the game
17:04handmade_opengl.cpp: Make TransferLight() in CompileMultiLightDown() use the reflection colour again, and run the game
17:04handmade_opengl.cpp: Make TransferLight() in CompileMultiLightDown() use the reflection colour again, and run the game
17:43handmade_opengl.cpp: CompileFakeSeedLighting() increase the colour intensity of the lights, running the game to see how that affects it
17:43handmade_opengl.cpp: CompileFakeSeedLighting() increase the colour intensity of the lights, running the game to see how that affects it
17:43handmade_opengl.cpp: CompileFakeSeedLighting() increase the colour intensity of the lights, running the game to see how that affects it
19:10Run the game and note the problem with the light bleeding
19:10Run the game and note the problem with the light bleeding
19:10Run the game and note the problem with the light bleeding
20:24Consider creating a way to switch between game and test mode
20:24Consider creating a way to switch between game and test mode
20:24Consider creating a way to switch between game and test mode
23:03handmade_opengl.cpp: Toggle off the lighting debug visualisation in OpenGLRenderCommands() and run the game
23:03handmade_opengl.cpp: Toggle off the lighting debug visualisation in OpenGLRenderCommands() and run the game
23:03handmade_opengl.cpp: Toggle off the lighting debug visualisation in OpenGLRenderCommands() and run the game
24:26Prepare to enable lighting toggling
24:26Prepare to enable lighting toggling
24:26Prepare to enable lighting toggling
26:36handmade_opengl.cpp: Make CompilePeelComposite() render the game at full brightness, preserving the directional lighting
26:36handmade_opengl.cpp: Make CompilePeelComposite() render the game at full brightness, preserving the directional lighting
26:36handmade_opengl.cpp: Make CompilePeelComposite() render the game at full brightness, preserving the directional lighting
29:02Run the game to see the lit scene a lot more cleanly
29:02Run the game to see the lit scene a lot more cleanly
29:02Run the game to see the lit scene a lot more cleanly
29:40handmade_opengl.cpp: Try to make CompileResolveMultisample() only blend with colours from above
29:40handmade_opengl.cpp: Try to make CompileResolveMultisample() only blend with colours from above
29:40handmade_opengl.cpp: Try to make CompileResolveMultisample() only blend with colours from above
31:19Run the game to see that a lot of the blending has been eliminated
31:19Run the game to see that a lot of the blending has been eliminated
31:19Run the game to see that a lot of the blending has been eliminated
31:57handmade_opengl.cpp: Flip the direction of the depth test in CompileResolveMultisample() and run
31:57handmade_opengl.cpp: Flip the direction of the depth test in CompileResolveMultisample() and run
31:57handmade_opengl.cpp: Flip the direction of the depth test in CompileResolveMultisample() and run
32:26handmade_opengl.cpp: Back out those changes
32:26handmade_opengl.cpp: Back out those changes
32:26handmade_opengl.cpp: Back out those changes
32:58Run the game and consider how to get everything into the lighting system
32:58Run the game and consider how to get everything into the lighting system
32:58Run the game and consider how to get everything into the lighting system
33:57handmade_opengl.h: Describe the opengl_framebuffer struct, noting that we'll need some space to store the emitter
33:57handmade_opengl.h: Describe the opengl_framebuffer struct, noting that we'll need some space to store the emitter
33:57handmade_opengl.h: Describe the opengl_framebuffer struct, noting that we'll need some space to store the emitter
37:43handmade_opengl.h: Extend opengl_framebuffer to contain multiple ColorHandle types
37:43handmade_opengl.h: Extend opengl_framebuffer to contain multiple ColorHandle types
37:43handmade_opengl.h: Extend opengl_framebuffer to contain multiple ColorHandle types
43:27Blackboard: Emission Specification
43:27Blackboard: Emission Specification
43:27Blackboard: Emission Specification
46:11handmade_opengl.h: Specify opengl_color_handle_type enum, noting the heavily increased write bandwidth required
46:11handmade_opengl.h: Specify opengl_color_handle_type enum, noting the heavily increased write bandwidth required
46:11handmade_opengl.h: Specify opengl_color_handle_type enum, noting the heavily increased write bandwidth required
51:13handmade_opengl.cpp: Make CreateFramebuffer() and FreeFramebuffer() operate on multiple framebuffers
51:13handmade_opengl.cpp: Make CreateFramebuffer() and FreeFramebuffer() operate on multiple framebuffers
51:13handmade_opengl.cpp: Make CreateFramebuffer() and FreeFramebuffer() operate on multiple framebuffers
55:28Run the game correctly
55:28Run the game correctly
55:28Run the game correctly
55:47handmade_opengl.cpp: Make CreateFramebuffer() operate on OpenGLAllColorAttachments
55:47handmade_opengl.cpp: Make CreateFramebuffer() operate on OpenGLAllColorAttachments
55:47handmade_opengl.cpp: Make CreateFramebuffer() operate on OpenGLAllColorAttachments
59:06Run the game to see it rendering just fine
59:06Run the game to see it rendering just fine
59:06Run the game to see it rendering just fine
59:58handmade_opengl.cpp: Move the lighting code out of CompilePeelComposite()
59:58handmade_opengl.cpp: Move the lighting code out of CompilePeelComposite()
59:58handmade_opengl.cpp: Move the lighting code out of CompilePeelComposite()
1:02:52Run the unlit version of the game
1:02:52Run the unlit version of the game
1:02:52Run the unlit version of the game
1:03:14handmade_opengl.cpp: Replace deprecated gl_FragData in CompileFakeSeedLighting() and CompileMultiLightUp()1
1:03:14handmade_opengl.cpp: Replace deprecated gl_FragData in CompileFakeSeedLighting() and CompileMultiLightUp()1
1:03:14handmade_opengl.cpp: Replace deprecated gl_FragData in CompileFakeSeedLighting() and CompileMultiLightUp()1
1:08:07Run the game to see that it looks fine, and close issue #92
1:08:07Run the game to see that it looks fine, and close issue #92
1:08:07Run the game to see that it looks fine, and close issue #92
1:10:03handmade_opengl.cpp: Propagate this gl_FragData replacement to all shaders
1:10:03handmade_opengl.cpp: Propagate this gl_FragData replacement to all shaders
1:10:03handmade_opengl.cpp: Propagate this gl_FragData replacement to all shaders
1:12:37Rant on how things have to be named in GLSL
1:12:37Rant on how things have to be named in GLSL
1:12:37Rant on how things have to be named in GLSL
1:15:09handmade_opengl.cpp: Rename colours
1:15:09handmade_opengl.cpp: Rename colours
1:15:09handmade_opengl.cpp: Rename colours
1:16:52Run the game to see it working almost alright
1:16:52Run the game to see it working almost alright
1:16:52Run the game to see it working almost alright
1:17:19handmade_opengl.cpp: Fix up the naming
1:17:19handmade_opengl.cpp: Fix up the naming
1:17:19handmade_opengl.cpp: Fix up the naming
1:19:56Run the game to see it working correctly
1:19:56Run the game to see it working correctly
1:19:56Run the game to see it working correctly
1:20:16handmade_opengl.cpp: Enable CompileZBiasProgram() to write light out to multiple textures
1:20:16handmade_opengl.cpp: Enable CompileZBiasProgram() to write light out to multiple textures
1:20:16handmade_opengl.cpp: Enable CompileZBiasProgram() to write light out to multiple textures
1:30:31Run the game to see that we're good
1:30:31Run the game to see that we're good
1:30:31Run the game to see that we're good
1:30:34handmade_opengl.cpp: Enable CompileResolveMultisample() and ResolveMultisample() to blend multiple light sources
1:30:34handmade_opengl.cpp: Enable CompileResolveMultisample() and ResolveMultisample() to blend multiple light sources
1:30:34handmade_opengl.cpp: Enable CompileResolveMultisample() and ResolveMultisample() to blend multiple light sources
1:39:45Run the game to see that stuff going
1:39:45Run the game to see that stuff going
1:39:45Run the game to see that stuff going
1:39:51handmade_opengl.cpp: Switch back to the game renderer, and run the game to see that's okay
1:39:51handmade_opengl.cpp: Switch back to the game renderer, and run the game to see that's okay
1:39:51handmade_opengl.cpp: Switch back to the game renderer, and run the game to see that's okay
1:40:21handmade_opengl.cpp: Enable ComputeLightTransport() to override the ordinary texture with the surface emission buffer
1:40:21handmade_opengl.cpp: Enable ComputeLightTransport() to override the ordinary texture with the surface emission buffer
1:40:21handmade_opengl.cpp: Enable ComputeLightTransport() to override the ordinary texture with the surface emission buffer
1:42:56Run the game and see nothing in the emission framebuffer
1:42:56Run the game and see nothing in the emission framebuffer
1:42:56Run the game and see nothing in the emission framebuffer
1:44:15handmade_opengl.cpp: Hard set BlendUnitColor[0] in CompileResolveMultisample() to the surface emission buffer and run the game
1:44:15handmade_opengl.cpp: Hard set BlendUnitColor[0] in CompileResolveMultisample() to the surface emission buffer and run the game
1:44:15handmade_opengl.cpp: Hard set BlendUnitColor[0] in CompileResolveMultisample() to the surface emission buffer and run the game
1:46:41handmade_opengl.cpp: Hard set BlendUnitColor[0] in CompileResolveMultisample() to factor in the CombinedNPL and run the game to see a Stephen's Sausage Roll-esque scene
1:46:41handmade_opengl.cpp: Hard set BlendUnitColor[0] in CompileResolveMultisample() to factor in the CombinedNPL and run the game to see a Stephen's Sausage Roll-esque scene
1:46:41handmade_opengl.cpp: Hard set BlendUnitColor[0] in CompileResolveMultisample() to factor in the CombinedNPL and run the game to see a Stephen's Sausage Roll-esque scene
1:47:39handmade_opengl.cpp: Ensure that OpenGLInit() does not encode the lighting framebuffers as sRGB
1:47:39handmade_opengl.cpp: Ensure that OpenGLInit() does not encode the lighting framebuffers as sRGB
1:47:39handmade_opengl.cpp: Ensure that OpenGLInit() does not encode the lighting framebuffers as sRGB
1:50:15Run the game and consider that the colours may be being decoded in sRGB space
1:50:15Run the game and consider that the colours may be being decoded in sRGB space
1:50:15Run the game and consider that the colours may be being decoded in sRGB space
1:50:48handmade_opengl.cpp: Investigate why CompileResolveMultisample() is not writing out the emission buffer
1:50:48handmade_opengl.cpp: Investigate why CompileResolveMultisample() is not writing out the emission buffer
1:50:48handmade_opengl.cpp: Investigate why CompileResolveMultisample() is not writing out the emission buffer
1:54:10handmade_opengl.cpp: Enable CompileResolveMultisample() to apply light from a wider radius
1:54:10handmade_opengl.cpp: Enable CompileResolveMultisample() to apply light from a wider radius
1:54:10handmade_opengl.cpp: Enable CompileResolveMultisample() to apply light from a wider radius
1:55:18Run the game to see that it makes a difference
1:55:18Run the game to see that it makes a difference
1:55:18Run the game to see that it makes a difference
1:56:00handmade_opengl.cpp: Toggle on the lighting debug visualisation in OpenGLRenderCommands() and the downward light transfer in ComputeLightTransport()
1:56:00handmade_opengl.cpp: Toggle on the lighting debug visualisation in OpenGLRenderCommands() and the downward light transfer in ComputeLightTransport()
1:56:00handmade_opengl.cpp: Toggle on the lighting debug visualisation in OpenGLRenderCommands() and the downward light transfer in ComputeLightTransport()
1:57:06Run the game and see glowy hero
1:57:06Run the game and see glowy hero
1:57:06Run the game and see glowy hero
1:57:15Q&A
1:57:15Q&A
1:57:15Q&A
1:59:25Miblo We can set the spread of the emitter, but can we also set the direction of the spread?
1:59:25Miblo We can set the spread of the emitter, but can we also set the direction of the spread?
1:59:25Miblo We can set the spread of the emitter, but can we also set the direction of the spread?
1:59:44Blackboard: Emitter vs sprite facing
1:59:44Blackboard: Emitter vs sprite facing
1:59:44Blackboard: Emitter vs sprite facing
2:01:32vaualbus Why not doing a marathon stream in lighting? Maybe if doing so will be more productive as you remember what hack you have done, and maybe forget the next weekend
2:01:32vaualbus Why not doing a marathon stream in lighting? Maybe if doing so will be more productive as you remember what hack you have done, and maybe forget the next weekend
2:01:32vaualbus Why not doing a marathon stream in lighting? Maybe if doing so will be more productive as you remember what hack you have done, and maybe forget the next weekend
2:02:44napoleon89 Don't know if this is the right place, but with your assert macro, it could currently cause bugs if you place it inside and if / else that doesn't use curly braces. Adding an else to this macro could solve this
2:02:44napoleon89 Don't know if this is the right place, but with your assert macro, it could currently cause bugs if you place it inside and if / else that doesn't use curly braces. Adding an else to this macro could solve this
2:02:44napoleon89 Don't know if this is the right place, but with your assert macro, it could currently cause bugs if you place it inside and if / else that doesn't use curly braces. Adding an else to this macro could solve this
2:04:04psychomaniactv I have been looking into compression schemes for skeletal animation data. Currently I have only implemented basic quantisation, but I would like to add curve fitting to the mix. Could you give me some pointers on this? If I were to use Catmull-Rom splines, what are some methods on estimating the error of a segment and finding a good split point? And how could I apply this stuff to quaternions?
2:04:04psychomaniactv I have been looking into compression schemes for skeletal animation data. Currently I have only implemented basic quantisation, but I would like to add curve fitting to the mix. Could you give me some pointers on this? If I were to use Catmull-Rom splines, what are some methods on estimating the error of a segment and finding a good split point? And how could I apply this stuff to quaternions?
2:04:04psychomaniactv I have been looking into compression schemes for skeletal animation data. Currently I have only implemented basic quantisation, but I would like to add curve fitting to the mix. Could you give me some pointers on this? If I were to use Catmull-Rom splines, what are some methods on estimating the error of a segment and finding a good split point? And how could I apply this stuff to quaternions?
2:04:38brruunnooo Do you plan to allow sprites to use emit textures that could, for example, make eyes glow?
2:04:38brruunnooo Do you plan to allow sprites to use emit textures that could, for example, make eyes glow?
2:04:38brruunnooo Do you plan to allow sprites to use emit textures that could, for example, make eyes glow?
2:05:23chrysos42 Alternative if / else syntax?
2:05:23chrysos42 Alternative if / else syntax?
2:05:23chrysos42 Alternative if / else syntax?
2:06:50macielda About the Nx Ny Lp0 Lp1 texture, is a 16-bit texture worse than a 32-bit in any way? I felt like you added Lp0 and Lp1 just because it wouldn't make much of a difference performance-wise? Is that true?
2:06:50macielda About the Nx Ny Lp0 Lp1 texture, is a 16-bit texture worse than a 32-bit in any way? I felt like you added Lp0 and Lp1 just because it wouldn't make much of a difference performance-wise? Is that true?
2:06:50macielda About the Nx Ny Lp0 Lp1 texture, is a 16-bit texture worse than a 32-bit in any way? I felt like you added Lp0 and Lp1 just because it wouldn't make much of a difference performance-wise? Is that true?
2:09:11handmade_opengl.h: TODO(casey): Think about making only one opengl_color_handle_type store RGB
2:09:11handmade_opengl.h: TODO(casey): Think about making only one opengl_color_handle_type store RGB
2:09:11handmade_opengl.h: TODO(casey): Think about making only one opengl_color_handle_type store RGB
2:10:35alexkelbo (Off-topic) I'm playing with the debug cycle counters. Is there a way to find out for how long Windows puts our process to sleep? I'm missing millions of cycles in my main loop3
2:10:35alexkelbo (Off-topic) I'm playing with the debug cycle counters. Is there a way to find out for how long Windows puts our process to sleep? I'm missing millions of cycles in my main loop3
2:10:35alexkelbo (Off-topic) I'm playing with the debug cycle counters. Is there a way to find out for how long Windows puts our process to sleep? I'm missing millions of cycles in my main loop3
2:12:54iwumbo_ How do you define a good API and a bad API, or do you have examples of very good APIs?4
2:12:54iwumbo_ How do you define a good API and a bad API, or do you have examples of very good APIs?4
2:12:54iwumbo_ How do you define a good API and a bad API, or do you have examples of very good APIs?4
2:21:03A few words on compressing animation data
2:21:03A few words on compressing animation data
2:21:03A few words on compressing animation data
2:24:10fr0styninja Speaking of, ever thought of releasing old talks you've done if you still have slides / notes and the like laying around?
2:24:10fr0styninja Speaking of, ever thought of releasing old talks you've done if you still have slides / notes and the like laying around?
2:24:10fr0styninja Speaking of, ever thought of releasing old talks you've done if you still have slides / notes and the like laying around?
2:24:48Scan through archival slides for 'In-Depth 3D Exporter: Design and Implementation'
2:24:48Scan through archival slides for 'In-Depth 3D Exporter: Design and Implementation'
2:24:48Scan through archival slides for 'In-Depth 3D Exporter: Design and Implementation'
2:26:36Scan through archival slides for 'Character Animation Programming I'
2:26:36Scan through archival slides for 'Character Animation Programming I'
2:26:36Scan through archival slides for 'Character Animation Programming I'
2:28:08Scan through archival slides for 'Requirements for Real=time Geometry'
2:28:08Scan through archival slides for 'Requirements for Real=time Geometry'
2:28:08Scan through archival slides for 'Requirements for Real=time Geometry'
2:28:25Wrap it up
2:28:25Wrap it up
2:28:25Wrap it up