Handmade Hero»Episode Guide
Switching to Rectangular Lighting Elements
?
?

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:09Recap and set the stage for the day1
0:09Recap and set the stage for the day1
0:09Recap and set the stage for the day1
6:40Run the game to see our current lighting solution
6:40Run the game to see our current lighting solution
6:40Run the game to see our current lighting solution
9:03handmade_world_mode.cpp: Let UpdateAndRenderWorld() call OutputLighting()
9:03handmade_world_mode.cpp: Let UpdateAndRenderWorld() call OutputLighting()
9:03handmade_world_mode.cpp: Let UpdateAndRenderWorld() call OutputLighting()
9:27Run the game to see our lighting voxel grid visualisation
9:27Run the game to see our lighting voxel grid visualisation
9:27Run the game to see our lighting voxel grid visualisation
10:27handmade_render_group.cpp: Make OutputLighting() draw the reflectors
10:27handmade_render_group.cpp: Make OutputLighting() draw the reflectors
10:27handmade_render_group.cpp: Make OutputLighting() draw the reflectors
10:34Run the game to see our reflectors debug visualisation
10:34Run the game to see our reflectors debug visualisation
10:34Run the game to see our reflectors debug visualisation
12:32handmade_render_group.cpp: Prevent OutputLighting() from drawing any debug visualisations
12:32handmade_render_group.cpp: Prevent OutputLighting() from drawing any debug visualisations
12:32handmade_render_group.cpp: Prevent OutputLighting() from drawing any debug visualisations
12:54Run the game and consider that the final gather may be producing the bleed-through lighting
12:54Run the game and consider that the final gather may be producing the bleed-through lighting
12:54Run the game and consider that the final gather may be producing the bleed-through lighting
17:51Run the game, noting that we had decided not to have 2-sided geometry any more
17:51Run the game, noting that we had decided not to have 2-sided geometry any more
17:51Run the game, noting that we had decided not to have 2-sided geometry any more
18:33handmade_world_mode.cpp: Make OutputLighting() draw the reflectors
18:33handmade_world_mode.cpp: Make OutputLighting() draw the reflectors
18:33handmade_world_mode.cpp: Make OutputLighting() draw the reflectors
18:45Run the game to see the giant hole in the relectors, and consider how to deal with this
18:45Run the game to see the giant hole in the relectors, and consider how to deal with this
18:45Run the game to see the giant hole in the relectors, and consider how to deal with this
21:12Run the game, toggle between the debug and regular views, and determine to switch to rectangular lighting elements
21:12Run the game, toggle between the debug and regular views, and determine to switch to rectangular lighting elements
21:12Run the game, toggle between the debug and regular views, and determine to switch to rectangular lighting elements
24:48Blackboard: Intersection of a Ray with a Rectangle
24:48Blackboard: Intersection of a Ray with a Rectangle
24:48Blackboard: Intersection of a Ray with a Rectangle
29:32Blackboard: Storing the rectangular lighting elements' X and Y axes to operate on them in their parametric space
29:32Blackboard: Storing the rectangular lighting elements' X and Y axes to operate on them in their parametric space
29:32Blackboard: Storing the rectangular lighting elements' X and Y axes to operate on them in their parametric space
31:39Blackboard: Defining the axes in unit-length and using the inner product to determine if we are inside the rectangle
31:39Blackboard: Defining the axes in unit-length and using the inner product to determine if we are inside the rectangle
31:39Blackboard: Defining the axes in unit-length and using the inner product to determine if we are inside the rectangle
35:19Blackboard: Simplifying our rectangle bounds equation
35:19Blackboard: Simplifying our rectangle bounds equation
35:19Blackboard: Simplifying our rectangle bounds equation
40:28Remove ExtractReflectorsFromVerts(), and make LightingTest() call ExtractReflectorsFromQuads()
40:28Remove ExtractReflectorsFromVerts(), and make LightingTest() call ExtractReflectorsFromQuads()
40:28Remove ExtractReflectorsFromVerts(), and make LightingTest() call ExtractReflectorsFromQuads()
42:13Run the game and determine to extract lighting from exact quads
42:13Run the game and determine to extract lighting from exact quads
42:13Run the game and determine to extract lighting from exact quads
42:47handmade_world_mode.h: Change R to Width and Height, and add XAxis and YAxis to the lighting_element
42:47handmade_world_mode.h: Change R to Width and Height, and add XAxis and YAxis to the lighting_element
42:47handmade_world_mode.h: Change R to Width and Height, and add XAxis and YAxis to the lighting_element
46:20Blackboard: Coordinate system winding
46:20Blackboard: Coordinate system winding
46:20Blackboard: Coordinate system winding
46:50handmade_render_group.cpp: Make ExtractReflectorsFromQuads() set the rectangle dimensions and axes
46:50handmade_render_group.cpp: Make ExtractReflectorsFromQuads() set the rectangle dimensions and axes
46:50handmade_render_group.cpp: Make ExtractReflectorsFromQuads() set the rectangle dimensions and axes
50:50handmade_render_group.cpp: Enable RayCast() to use our newly encoded rectangle data
50:50handmade_render_group.cpp: Enable RayCast() to use our newly encoded rectangle data
50:50handmade_render_group.cpp: Enable RayCast() to use our newly encoded rectangle data
59:01handmade_render_group.cpp: Remove OutputLightingVerts() and enable OutputLightingQuads() to reconstruct the quads from our encoded data
59:01handmade_render_group.cpp: Remove OutputLightingVerts() and enable OutputLightingQuads() to reconstruct the quads from our encoded data
59:01handmade_render_group.cpp: Remove OutputLightingVerts() and enable OutputLightingQuads() to reconstruct the quads from our encoded data
1:01:11Run the game to see our diamond lighting reflectors
1:01:11Run the game to see our diamond lighting reflectors
1:01:11Run the game to see our diamond lighting reflectors
1:01:26handmade_render_group.cpp: Fix OutputLightingQuads() to produce a right-angle rectangle
1:01:26handmade_render_group.cpp: Fix OutputLightingQuads() to produce a right-angle rectangle
1:01:26handmade_render_group.cpp: Fix OutputLightingQuads() to produce a right-angle rectangle
1:02:03Run the game to see our rectangular lighting reflectors, and consider how to shrink them
1:02:03Run the game to see our rectangular lighting reflectors, and consider how to shrink them
1:02:03Run the game to see our rectangular lighting reflectors, and consider how to shrink them
1:05:45handmade_render_group.cpp: Make OutputLightingQuads() shrink the reflectors slightly
1:05:45handmade_render_group.cpp: Make OutputLightingQuads() shrink the reflectors slightly
1:05:45handmade_render_group.cpp: Make OutputLightingQuads() shrink the reflectors slightly
1:06:51Run the game to see the gaps between reflectors
1:06:51Run the game to see the gaps between reflectors
1:06:51Run the game to see the gaps between reflectors
1:07:22handmade_render_group.cpp: Start to make ExtractReflectorsFromQuads() dice up the reflectors
1:07:22handmade_render_group.cpp: Start to make ExtractReflectorsFromQuads() dice up the reflectors
1:07:22handmade_render_group.cpp: Start to make ExtractReflectorsFromQuads() dice up the reflectors
1:09:14handmade_world_mode.h: Remove OrigBitmap and OrigV from lighting_element
1:09:14handmade_world_mode.h: Remove OrigBitmap and OrigV from lighting_element
1:09:14handmade_world_mode.h: Remove OrigBitmap and OrigV from lighting_element
1:10:42Run the game to see that we're good to go
1:10:42Run the game to see that we're good to go
1:10:42Run the game to see that we're good to go
1:11:36handmade_render_group.cpp: Continue to make ExtractReflectorsFromQuads() subdivide the reflectors
1:11:36handmade_render_group.cpp: Continue to make ExtractReflectorsFromQuads() subdivide the reflectors
1:11:36handmade_render_group.cpp: Continue to make ExtractReflectorsFromQuads() subdivide the reflectors
1:16:01Run the game to see our smaller reflectors
1:16:01Run the game to see our smaller reflectors
1:16:01Run the game to see our smaller reflectors
1:16:15handmade_render_group.cpp: Allow smaller subdivisions of the reflectors
1:16:15handmade_render_group.cpp: Allow smaller subdivisions of the reflectors
1:16:15handmade_render_group.cpp: Allow smaller subdivisions of the reflectors
1:17:30Run the game to see our lighting solution, and consider that either the ray cast is incorrect or our indirect bounce may be too powerful
1:17:30Run the game to see our lighting solution, and consider that either the ray cast is incorrect or our indirect bounce may be too powerful
1:17:30Run the game to see our lighting solution, and consider that either the ray cast is incorrect or our indirect bounce may be too powerful
1:19:58Q&A
🗩
1:19:58Q&A
🗩
1:19:58Q&A
🗩
1:20:51Kknewkles Hi! No shave November? That stache's gun be epic
🗪
1:20:51Kknewkles Hi! No shave November? That stache's gun be epic
🗪
1:20:51Kknewkles Hi! No shave November? That stache's gun be epic
🗪
1:22:15toastystoemp Forward rendering or deferred rendering
🗪
1:22:15toastystoemp Forward rendering or deferred rendering
🗪
1:22:15toastystoemp Forward rendering or deferred rendering
🗪
1:23:05nnreality Would the subdivision of the rectangles be something that you would do in a tesselation shader if you were using OpenGL?
🗪
1:23:05nnreality Would the subdivision of the rectangles be something that you would do in a tesselation shader if you were using OpenGL?
🗪
1:23:05nnreality Would the subdivision of the rectangles be something that you would do in a tesselation shader if you were using OpenGL?
🗪
1:24:22butwhynot1 Are you going to be implementing shadowmaps?
🗪
1:24:22butwhynot1 Are you going to be implementing shadowmaps?
🗪
1:24:22butwhynot1 Are you going to be implementing shadowmaps?
🗪
1:25:06Kknewkles 1) Any more Handmade Ray episodes? 2) Remember when someone took your raytracer a few steps further on twitter: what do you do to move to this picture from the one you stopped at?2
🗪
1:25:06Kknewkles 1) Any more Handmade Ray episodes? 2) Remember when someone took your raytracer a few steps further on twitter: what do you do to move to this picture from the one you stopped at?2
🗪
1:25:06Kknewkles 1) Any more Handmade Ray episodes? 2) Remember when someone took your raytracer a few steps further on twitter: what do you do to move to this picture from the one you stopped at?2
🗪
1:25:39abdcw Is your keyboard any good?
🗪
1:25:39abdcw Is your keyboard any good?
🗪
1:25:39abdcw Is your keyboard any good?
🗪
1:27:06vaualbus So, as far as know, if I would want to implement a real time rendering system there should have been some differences? Or for now the light bounces can also be used in that situation?
🗪
1:27:06vaualbus So, as far as know, if I would want to implement a real time rendering system there should have been some differences? Or for now the light bounces can also be used in that situation?
🗪
1:27:06vaualbus So, as far as know, if I would want to implement a real time rendering system there should have been some differences? Or for now the light bounces can also be used in that situation?
🗪
1:27:50sneakybob_wot Is there a specific reason to recalculate 1.0/255 rather than store it as a value or does the compiler optimise that anyway?
🗪
1:27:50sneakybob_wot Is there a specific reason to recalculate 1.0/255 rather than store it as a value or does the compiler optimise that anyway?
🗪
1:27:50sneakybob_wot Is there a specific reason to recalculate 1.0/255 rather than store it as a value or does the compiler optimise that anyway?
🗪
1:28:16bouke285 I'm a new CS student with limited free time. Do you recommend watching your series from the beginning, or would time be better spent working on a new project and using your videos to learn something as needed?
🗪
1:28:16bouke285 I'm a new CS student with limited free time. Do you recommend watching your series from the beginning, or would time be better spent working on a new project and using your videos to learn something as needed?
🗪
1:28:16bouke285 I'm a new CS student with limited free time. Do you recommend watching your series from the beginning, or would time be better spent working on a new project and using your videos to learn something as needed?
🗪
1:29:53jalapenosbud I was wondering what sort of data strucures / algorithms you would recommend to learn to get a wider grasp on programming?
🗪
1:29:53jalapenosbud I was wondering what sort of data strucures / algorithms you would recommend to learn to get a wider grasp on programming?
🗪
1:29:53jalapenosbud I was wondering what sort of data strucures / algorithms you would recommend to learn to get a wider grasp on programming?
🗪
1:33:00vaualbus In my previous question I was wrong: I wanted to ask if we want to have physically based rendering techniques
🗪
1:33:00vaualbus In my previous question I was wrong: I wanted to ask if we want to have physically based rendering techniques
🗪
1:33:00vaualbus In my previous question I was wrong: I wanted to ask if we want to have physically based rendering techniques
🗪
1:34:17toastystoemp Which physics engine, if any, will you implement
🗪
1:34:17toastystoemp Which physics engine, if any, will you implement
🗪
1:34:17toastystoemp Which physics engine, if any, will you implement
🗪
1:34:29sired22 Are you planning to have any procedural generation in your levels later?
🗪
1:34:29sired22 Are you planning to have any procedural generation in your levels later?
🗪
1:34:29sired22 Are you planning to have any procedural generation in your levels later?
🗪
1:34:48alexkelbo You once said that you wanted to use Vulkan on HMH. Is that still on the table or are you sticking with OpenGL?
🗪
1:34:48alexkelbo You once said that you wanted to use Vulkan on HMH. Is that still on the table or are you sticking with OpenGL?
🗪
1:34:48alexkelbo You once said that you wanted to use Vulkan on HMH. Is that still on the table or are you sticking with OpenGL?
🗪
1:34:59kknewkles What are the things you've solved yourself?3
🗪
1:34:59kknewkles What are the things you've solved yourself?3
🗪
1:34:59kknewkles What are the things you've solved yourself?3
🗪
1:36:21kknewkles I watched that live, how could you?
🗪
1:36:21kknewkles I watched that live, how could you?
🗪
1:36:21kknewkles I watched that live, how could you?
🗪
1:36:36jalapenosbud Haha yeah, I didn't have anything specific in mind, just where to go after having learned the basics of coding, like the stuff you mentioned. But also where to start to slowly start understanding the more "complex" algorithms. Like there's probably a hundred ways to sort something, trees etc, but to get the basic understanding, where should I start?4
🗪
1:36:36jalapenosbud Haha yeah, I didn't have anything specific in mind, just where to go after having learned the basics of coding, like the stuff you mentioned. But also where to start to slowly start understanding the more "complex" algorithms. Like there's probably a hundred ways to sort something, trees etc, but to get the basic understanding, where should I start?4
🗪
1:36:36jalapenosbud Haha yeah, I didn't have anything specific in mind, just where to go after having learned the basics of coding, like the stuff you mentioned. But also where to start to slowly start understanding the more "complex" algorithms. Like there's probably a hundred ways to sort something, trees etc, but to get the basic understanding, where should I start?4
🗪
1:38:49jalapenosbud That's the one I'm reading right now!
🗪
1:38:49jalapenosbud That's the one I'm reading right now!
🗪
1:38:49jalapenosbud That's the one I'm reading right now!
🗪
1:39:29jalapenosbud Yeah fine fine haha, I just wanted to know if there was a "shortcut"
🗪
1:39:29jalapenosbud Yeah fine fine haha, I just wanted to know if there was a "shortcut"
🗪
1:39:29jalapenosbud Yeah fine fine haha, I just wanted to know if there was a "shortcut"
🗪
1:40:06the_8th_mage You once mentioned a numerical book5
🗪
1:40:06the_8th_mage You once mentioned a numerical book5
🗪
1:40:06the_8th_mage You once mentioned a numerical book5
🗪
1:41:45stanpancakes Meh. Just read Knuth. Easy read
🗪
1:41:45stanpancakes Meh. Just read Knuth. Easy read
🗪
1:41:45stanpancakes Meh. Just read Knuth. Easy read
🗪
1:42:41stanpancakes I was kidding
🗪
1:42:41stanpancakes I was kidding
🗪
1:42:41stanpancakes I was kidding
🗪
1:44:13Recommend disabling internet access
1:44:13Recommend disabling internet access
1:44:13Recommend disabling internet access
1:46:21kknewkles There's more people in my flat depending on that connection, but I could program a tiny thingie to cut my own connection
🗪
1:46:21kknewkles There's more people in my flat depending on that connection, but I could program a tiny thingie to cut my own connection
🗪
1:46:21kknewkles There's more people in my flat depending on that connection, but I could program a tiny thingie to cut my own connection
🗪
1:49:27serialqwiller If you have enough space and budget, having a separate room / desk and machine for development that you never use for anything else works for me
🗪
1:49:27serialqwiller If you have enough space and budget, having a separate room / desk and machine for development that you never use for anything else works for me
🗪
1:49:27serialqwiller If you have enough space and budget, having a separate room / desk and machine for development that you never use for anything else works for me
🗪
1:50:38kknewkles But how do you code without source control
🗪
1:50:38kknewkles But how do you code without source control
🗪
1:50:38kknewkles But how do you code without source control
🗪
1:51:13kknewkles Not cmirror though?
🗪
1:51:13kknewkles Not cmirror though?
🗪
1:51:13kknewkles Not cmirror though?
🗪
1:52:04kknewkles Yeah, I'm kidding. Just another bile round at them gits and cmakes
🗪
1:52:04kknewkles Yeah, I'm kidding. Just another bile round at them gits and cmakes
🗪
1:52:04kknewkles Yeah, I'm kidding. Just another bile round at them gits and cmakes
🗪
1:52:38thisdrunkdane Gonna share cmirror 2 at some point?
🗪
1:52:38thisdrunkdane Gonna share cmirror 2 at some point?
🗪
1:52:38thisdrunkdane Gonna share cmirror 2 at some point?
🗪
1:53:21kknewkles Handmade Source Control episodes?
🗪
1:53:21kknewkles Handmade Source Control episodes?
🗪
1:53:21kknewkles Handmade Source Control episodes?
🗪
1:53:52k1ng_k3v1n So you never access MSDN, the OpenGL docs, or other documentation on your work machine?
🗪
1:53:52k1ng_k3v1n So you never access MSDN, the OpenGL docs, or other documentation on your work machine?
🗪
1:53:52k1ng_k3v1n So you never access MSDN, the OpenGL docs, or other documentation on your work machine?
🗪
1:54:57usdaproved I would like to program without being connected to the internet, but how do you do it without stack overflow or other references? Does breaking that reliance just come from practice and experience?
🗪
1:54:57usdaproved I would like to program without being connected to the internet, but how do you do it without stack overflow or other references? Does breaking that reliance just come from practice and experience?
🗪
1:54:57usdaproved I would like to program without being connected to the internet, but how do you do it without stack overflow or other references? Does breaking that reliance just come from practice and experience?
🗪
1:58:05Shut things down
🗩
1:58:05Shut things down
🗩
1:58:05Shut things down
🗩