Handmade Hero»Episode Guide
Off-line Lighting and Per-vertex Reflectors
?
?

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:07Introduce the new location, recap and set the stage for the day
0:07Introduce the new location, recap and set the stage for the day
0:07Introduce the new location, recap and set the stage for the day
1:58Run the game and consider the current state of the block lighting
1:58Run the game and consider the current state of the block lighting
1:58Run the game and consider the current state of the block lighting
5:59Blackboard: Multiresolution and Quality
5:59Blackboard: Multiresolution and Quality
5:59Blackboard: Multiresolution and Quality
16:45Blackboard: Aggregating reflectors
16:45Blackboard: Aggregating reflectors
16:45Blackboard: Aggregating reflectors
18:52Run the game and consider switching to rectangular reflectors
18:52Run the game and consider switching to rectangular reflectors
18:52Run the game and consider switching to rectangular reflectors
22:27Blackboard: Figuring out a multiresolution raycasting scheme
22:27Blackboard: Figuring out a multiresolution raycasting scheme
22:27Blackboard: Figuring out a multiresolution raycasting scheme
29:25Run the game and consider switching to an offline lighting solution, for experimentation purposes
29:25Run the game and consider switching to an offline lighting solution, for experimentation purposes
29:25Run the game and consider switching to an offline lighting solution, for experimentation purposes
30:50handmade_render_group.cpp: Make LightingTest() cast out 64 and then 256 rays and run the game to demonstrate how unusable this is
30:50handmade_render_group.cpp: Make LightingTest() cast out 64 and then 256 rays and run the game to demonstrate how unusable this is
30:50handmade_render_group.cpp: Make LightingTest() cast out 64 and then 256 rays and run the game to demonstrate how unusable this is
32:32handmade_render_group.cpp: Set up LightingTest() to compute the lighting offline
32:32handmade_render_group.cpp: Set up LightingTest() to compute the lighting offline
32:32handmade_render_group.cpp: Set up LightingTest() to compute the lighting offline
34:55handmade_render_group.h: Introduce lighting_solution for LightingTest() to use
34:55handmade_render_group.h: Introduce lighting_solution for LightingTest() to use
34:55handmade_render_group.h: Introduce lighting_solution for LightingTest() to use
36:24handmade_world_mode.cpp: Set up UpdateAndRenderWorld() to output the lighting on a key press
36:24handmade_world_mode.cpp: Set up UpdateAndRenderWorld() to output the lighting on a key press
36:24handmade_world_mode.cpp: Set up UpdateAndRenderWorld() to output the lighting on a key press
36:54handmade_render_group.cpp: Split out some of LightingTest() into a new OutputLighting() function
36:54handmade_render_group.cpp: Split out some of LightingTest() into a new OutputLighting() function
36:54handmade_render_group.cpp: Split out some of LightingTest() into a new OutputLighting() function
49:37handmade_world_mode.cpp: Make LightingTest() store the bitmaps when copying the lighting in
49:37handmade_world_mode.cpp: Make LightingTest() store the bitmaps when copying the lighting in
49:37handmade_world_mode.cpp: Make LightingTest() store the bitmaps when copying the lighting in
52:21win32_handmade.cpp: Enable Win32ProcessPendingMessages() to handle the F-keys
52:21win32_handmade.cpp: Enable Win32ProcessPendingMessages() to handle the F-keys
52:21win32_handmade.cpp: Enable Win32ProcessPendingMessages() to handle the F-keys
56:28handmade_world_mode.cpp: Enable UpdateAndRenderWorld() to toggle ShowLighting mode on a key press
56:28handmade_world_mode.cpp: Enable UpdateAndRenderWorld() to toggle ShowLighting mode on a key press
56:28handmade_world_mode.cpp: Enable UpdateAndRenderWorld() to toggle ShowLighting mode on a key press
59:07Run the game, try toggling to ShowLighting mode and hit an assert in PushQuad()
59:07Run the game, try toggling to ShowLighting mode and hit an assert in PushQuad()
59:07Run the game, try toggling to ShowLighting mode and hit an assert in PushQuad()
1:00:51handmade_render_group.cpp: Make OutputLighting() call GetCurrentQuads() up front
1:00:51handmade_render_group.cpp: Make OutputLighting() call GetCurrentQuads() up front
1:00:51handmade_render_group.cpp: Make OutputLighting() call GetCurrentQuads() up front
1:01:46Run the game and toggle to ShowLighting mode
1:01:46Run the game and toggle to ShowLighting mode
1:01:46Run the game and toggle to ShowLighting mode
1:02:25Infinite watersα
1:02:25Infinite watersα
1:02:25Infinite watersα
1:03:07handmade_render_group.cpp: Make OutputLighting() loop through all the Elements, and LightingTest() write out the correct Bitmaps
1:03:07handmade_render_group.cpp: Make OutputLighting() loop through all the Elements, and LightingTest() write out the correct Bitmaps
1:03:07handmade_render_group.cpp: Make OutputLighting() loop through all the Elements, and LightingTest() write out the correct Bitmaps
1:04:21Run the game and toggle to ShowLighting mode
1:04:21Run the game and toggle to ShowLighting mode
1:04:21Run the game and toggle to ShowLighting mode
1:04:41win32_handmade.cpp: Make Win32ProcessPendingMessages() correctly clear the pressed key
1:04:41win32_handmade.cpp: Make Win32ProcessPendingMessages() correctly clear the pressed key
1:04:41win32_handmade.cpp: Make Win32ProcessPendingMessages() correctly clear the pressed key
1:05:56Run the game, toggle to ShowLighting mode and consider the solution
1:05:56Run the game, toggle to ShowLighting mode and consider the solution
1:05:56Run the game, toggle to ShowLighting mode and consider the solution
1:08:50handmade_render_group.cpp: Temporarily make ComputeLighting() set the lighting to full white, and run the game to confirm that we are correctly writing out the lighting
1:08:50handmade_render_group.cpp: Temporarily make ComputeLighting() set the lighting to full white, and run the game to confirm that we are correctly writing out the lighting
1:08:50handmade_render_group.cpp: Temporarily make ComputeLighting() set the lighting to full white, and run the game to confirm that we are correctly writing out the lighting
1:09:56Get some water
1:09:56Get some water
1:09:56Get some water
1:10:38Return with water
1:10:38Return with water
1:10:38Return with water
1:11:08handmade_render_group.cpp: Make LightingTest() cast 8 rays, run the game and consider if we are accumulating and not averaging
1:11:08handmade_render_group.cpp: Make LightingTest() cast 8 rays, run the game and consider if we are accumulating and not averaging
1:11:08handmade_render_group.cpp: Make LightingTest() cast 8 rays, run the game and consider if we are accumulating and not averaging
1:12:42handmade_render_group.cpp: Make LightingTest() correctly accumulate the rays
1:12:42handmade_render_group.cpp: Make LightingTest() correctly accumulate the rays
1:12:42handmade_render_group.cpp: Make LightingTest() correctly accumulate the rays
1:14:04Run the game to see that our lighting solution is a lot better
1:14:04Run the game to see that our lighting solution is a lot better
1:14:04Run the game to see that our lighting solution is a lot better
1:15:25handmade_render_group.cpp: Make OutputLighting() wind the vectors in the correct order
1:15:25handmade_render_group.cpp: Make OutputLighting() wind the vectors in the correct order
1:15:25handmade_render_group.cpp: Make OutputLighting() wind the vectors in the correct order
1:16:10Run the game and consider using the quad structures themselves as reflectors
1:16:10Run the game and consider using the quad structures themselves as reflectors
1:16:10Run the game and consider using the quad structures themselves as reflectors
1:21:06handmade_render_group.cpp: Make LightingTest() cast 256 rays, run the game and consider using the ray count as a divisor
1:21:06handmade_render_group.cpp: Make LightingTest() cast 256 rays, run the game and consider using the ray count as a divisor
1:21:06handmade_render_group.cpp: Make LightingTest() cast 256 rays, run the game and consider using the ray count as a divisor
1:23:06handmade_render_group.cpp: Make LightingTest() factor in the ray count
1:23:06handmade_render_group.cpp: Make LightingTest() factor in the ray count
1:23:06handmade_render_group.cpp: Make LightingTest() factor in the ray count
1:23:57Run the game to see a more stable lighting solution, in terms of its brightness
1:23:57Run the game to see a more stable lighting solution, in terms of its brightness
1:23:57Run the game to see a more stable lighting solution, in terms of its brightness
1:26:03Run the game and consider smoothing out the lighting solution across reflectors
1:26:03Run the game and consider smoothing out the lighting solution across reflectors
1:26:03Run the game and consider smoothing out the lighting solution across reflectors
1:35:22handmade_render_group.cpp: Split out LightingTest() into a new ExtractReflectorsFromQuads() function
1:35:22handmade_render_group.cpp: Split out LightingTest() into a new ExtractReflectorsFromQuads() function
1:35:22handmade_render_group.cpp: Split out LightingTest() into a new ExtractReflectorsFromQuads() function
1:38:46handmade_render_group.cpp: Introduce ExtractReflectorsFromVerts()
1:38:46handmade_render_group.cpp: Introduce ExtractReflectorsFromVerts()
1:38:46handmade_render_group.cpp: Introduce ExtractReflectorsFromVerts()
1:43:44Run the game and view just the reflectors
1:43:44Run the game and view just the reflectors
1:43:44Run the game and view just the reflectors
1:46:02handmade_render_group.cpp: Make ExtractReflectorsFromVerts() correctly create the four vertices
1:46:02handmade_render_group.cpp: Make ExtractReflectorsFromVerts() correctly create the four vertices
1:46:02handmade_render_group.cpp: Make ExtractReflectorsFromVerts() correctly create the four vertices
1:46:32Run the game to see our reflectors' vertices
1:46:32Run the game to see our reflectors' vertices
1:46:32Run the game to see our reflectors' vertices
1:48:12Run the game and temporarily believe that it is correct
1:48:12Run the game and temporarily believe that it is correct
1:48:12Run the game and temporarily believe that it is correct
1:49:19handmade_render_group.cpp: Consider making ExtractReflectorsFromVerts() position the vertices correctly
1:49:19handmade_render_group.cpp: Consider making ExtractReflectorsFromVerts() position the vertices correctly
1:49:19handmade_render_group.cpp: Consider making ExtractReflectorsFromVerts() position the vertices correctly
1:50:27Blackboard: Evenly distributing reflectors across a face
1:50:27Blackboard: Evenly distributing reflectors across a face
1:50:27Blackboard: Evenly distributing reflectors across a face
1:51:24handmade_render_group.cpp: Make ExtractReflectorsFromVerts() distribute the reflectors
1:51:24handmade_render_group.cpp: Make ExtractReflectorsFromVerts() distribute the reflectors
1:51:24handmade_render_group.cpp: Make ExtractReflectorsFromVerts() distribute the reflectors
1:53:46Run the game and take a look at the fairly regularly tiled reflectors
1:53:46Run the game and take a look at the fairly regularly tiled reflectors
1:53:46Run the game and take a look at the fairly regularly tiled reflectors
1:54:19handmade_render_group.cpp: Introduce OutputLightingQuads() and OutputLightingVerts()
1:54:19handmade_render_group.cpp: Introduce OutputLightingQuads() and OutputLightingVerts()
1:54:19handmade_render_group.cpp: Introduce OutputLightingQuads() and OutputLightingVerts()
1:59:20Run the game and check out the lighting solution, now with vertex-based banding
1:59:20Run the game and check out the lighting solution, now with vertex-based banding
1:59:20Run the game and check out the lighting solution, now with vertex-based banding
2:00:52Q&A
🗩
2:00:52Q&A
🗩
2:00:52Q&A
🗩
2:02:21Till_us You can triangle order the verts for the banding issue?
🗪
2:02:21Till_us You can triangle order the verts for the banding issue?
🗪
2:02:21Till_us You can triangle order the verts for the banding issue?
🗪
2:02:43Blackboard: Triangle vertex order picking
2:02:43Blackboard: Triangle vertex order picking
2:02:43Blackboard: Triangle vertex order picking
2:04:29Brian Forgive me, but is the game currently running in the hardware renderer, or software?
🗪
2:04:29Brian Forgive me, but is the game currently running in the hardware renderer, or software?
🗪
2:04:29Brian Forgive me, but is the game currently running in the hardware renderer, or software?
🗪
2:04:44garryjohanson So I had the idea of maintaining all geometry in a geometrically determined hash table, computing the trajectory of the reflections and looking up where the resulting geometry is. Is that something that would be workable, or am I missing something?
🗪
2:04:44garryjohanson So I had the idea of maintaining all geometry in a geometrically determined hash table, computing the trajectory of the reflections and looking up where the resulting geometry is. Is that something that would be workable, or am I missing something?
🗪
2:04:44garryjohanson So I had the idea of maintaining all geometry in a geometrically determined hash table, computing the trajectory of the reflections and looking up where the resulting geometry is. Is that something that would be workable, or am I missing something?
🗪
2:05:20Blackboard: Using a geometrically determined hash table to compute the trajectory of reflections
2:05:20Blackboard: Using a geometrically determined hash table to compute the trajectory of reflections
2:05:20Blackboard: Using a geometrically determined hash table to compute the trajectory of reflections
2:13:36Brian WeeChat works pretty well, if this is on Linux
🗪
2:13:36Brian WeeChat works pretty well, if this is on Linux
🗪
2:13:36Brian WeeChat works pretty well, if this is on Linux
🗪
2:14:26kriminator117 If you figure it out, tell Autodesk how to fix how MAYA's weight painting looks
🗪
2:14:26kriminator117 If you figure it out, tell Autodesk how to fix how MAYA's weight painting looks
🗪
2:14:26kriminator117 If you figure it out, tell Autodesk how to fix how MAYA's weight painting looks
🗪
2:15:21derpzerker Would it be possible to write a transpiler so that we could take this C code and run it on the GPU trivially after debugging on CPU?
🗪
2:15:21derpzerker Would it be possible to write a transpiler so that we could take this C code and run it on the GPU trivially after debugging on CPU?
🗪
2:15:21derpzerker Would it be possible to write a transpiler so that we could take this C code and run it on the GPU trivially after debugging on CPU?
🗪
2:17:23chaoscom In your lighting formulae, you use negative spans like "-0.25f*Span10". What if everything is supposed to be a displacement off Vertex0? Shouldn't you have "+0.75f" at some point instead of something negative?
🗪
2:17:23chaoscom In your lighting formulae, you use negative spans like "-0.25f*Span10". What if everything is supposed to be a displacement off Vertex0? Shouldn't you have "+0.75f" at some point instead of something negative?
🗪
2:17:23chaoscom In your lighting formulae, you use negative spans like "-0.25f*Span10". What if everything is supposed to be a displacement off Vertex0? Shouldn't you have "+0.75f" at some point instead of something negative?
🗪
2:18:15username_password_admin You're using square, so why not filter bilinearly along the square axes rather than interpolating over the triangles? That should avoid the diagonal seams
🗪
2:18:15username_password_admin You're using square, so why not filter bilinearly along the square axes rather than interpolating over the triangles? That should avoid the diagonal seams
🗪
2:18:15username_password_admin You're using square, so why not filter bilinearly along the square axes rather than interpolating over the triangles? That should avoid the diagonal seams
🗪
2:19:01Blackboard: Interpolating perpendicularly between the squares' edges
2:19:01Blackboard: Interpolating perpendicularly between the squares' edges
2:19:01Blackboard: Interpolating perpendicularly between the squares' edges
2:21:07chaoscom Light doesn't behave linearily. That's why the banding occurs in the first place
🗪
2:21:07chaoscom Light doesn't behave linearily. That's why the banding occurs in the first place
🗪
2:21:07chaoscom Light doesn't behave linearily. That's why the banding occurs in the first place
🗪
2:22:12Wrap it up
🗩
2:22:12Wrap it up
🗩
2:22:12Wrap it up
🗩
2:22:53"It's not live now"β
🗩
2:22:53"It's not live now"β
🗩
2:22:53"It's not live now"β
🗩