Distinguishing Between Lights and Occluders
?
?

Keyboard Navigation

Global Keys

[, < / ], > Jump to previous / next episode
W, K, P / S, J, N Jump to previous / next timestamp
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 and Index Controls

a
w
s
d
h j k l


Esc Close menu / unfocus timestamp

Quotes and References Menus and Index

Enter Jump to timestamp

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:01Demo the current state of our light probe-based ray cast lighting
🏃
0:01Demo the current state of our light probe-based ray cast lighting
🏃
0:01Demo the current state of our light probe-based ray cast lighting
🏃
1:59Lighting improvements: 1. Averaging across frames
🏃
1:59Lighting improvements: 1. Averaging across frames
🏃
1:59Lighting improvements: 1. Averaging across frames
🏃
2:57Lighting improvements: 2. Real indirect bounce and convection
🏃
2:57Lighting improvements: 2. Real indirect bounce and convection
🏃
2:57Lighting improvements: 2. Real indirect bounce and convection
🏃
3:34Lighting improvements: 3. How best to store and update our information
🏃
3:34Lighting improvements: 3. How best to store and update our information
🏃
3:34Lighting improvements: 3. How best to store and update our information
🏃
8:22Reacquaint ourselves with TestCastFromProbes()
📖
8:22Reacquaint ourselves with TestCastFromProbes()
📖
8:22Reacquaint ourselves with TestCastFromProbes()
📖
9:55Reacquaint ourselves with ComputeLightPropagation()
📖
9:55Reacquaint ourselves with ComputeLightPropagation()
📖
9:55Reacquaint ourselves with ComputeLightPropagation()
📖
10:49Turn the lighting_work version of ComputeLightPropagation() into a ComputeLightPropagationWork() PLATFORM_WORK_QUEUE_CALLBACK
10:49Turn the lighting_work version of ComputeLightPropagation() into a ComputeLightPropagationWork() PLATFORM_WORK_QUEUE_CALLBACK
10:49Turn the lighting_work version of ComputeLightPropagation() into a ComputeLightPropagationWork() PLATFORM_WORK_QUEUE_CALLBACK
13:22Prepare to update ComputeLightPropagationWork() to work with voxel-based lighting
📖
13:22Prepare to update ComputeLightPropagationWork() to work with voxel-based lighting
📖
13:22Prepare to update ComputeLightPropagationWork() to work with voxel-based lighting
📖
17:51Set up ComputeLightPropagationWork() to handle multiple light sources
17:51Set up ComputeLightPropagationWork() to handle multiple light sources
17:51Set up ComputeLightPropagationWork() to handle multiple light sources
20:55Continue to reacquaint ourselves with ComputeLightPropagationWork(), its stochastic spherical sampling and ambient light
📖
20:55Continue to reacquaint ourselves with ComputeLightPropagationWork(), its stochastic spherical sampling and ambient light
📖
20:55Continue to reacquaint ourselves with ComputeLightPropagationWork(), its stochastic spherical sampling and ambient light
📖
23:53Consider getting ambient light from the probes
23:53Consider getting ambient light from the probes
23:53Consider getting ambient light from the probes
24:56Continue to reacquaint ourselves with ComputeLightPropagationWork(), sampling hits
📖
24:56Continue to reacquaint ourselves with ComputeLightPropagationWork(), sampling hits
📖
24:56Continue to reacquaint ourselves with ComputeLightPropagationWork(), sampling hits
📖
26:52Set up ComputeLightPropagationWork() to sample from our voxel-based lighting, removing light_probe_irradiance and introducing ComputeVoxelIrradianceAt()
26:52Set up ComputeLightPropagationWork() to sample from our voxel-based lighting, removing light_probe_irradiance and introducing ComputeVoxelIrradianceAt()
26:52Set up ComputeLightPropagationWork() to sample from our voxel-based lighting, removing light_probe_irradiance and introducing ComputeVoxelIrradianceAt()
31:19Make ComputeLightPropagationWork() call SpamVoxel() renaming the existing SpamVoxel() to SpamVoxelSlice()
31:19Make ComputeLightPropagationWork() call SpamVoxel() renaming the existing SpamVoxel() to SpamVoxelSlice()
31:19Make ComputeLightPropagationWork() call SpamVoxel() renaming the existing SpamVoxel() to SpamVoxelSlice()
35:52Clean up compile errors
35:52Clean up compile errors
35:52Clean up compile errors
40:55Set up ComputeLightPropagationWork() to compute falloff based on the light source position
40:55Set up ComputeLightPropagationWork() to compute falloff based on the light source position
40:55Set up ComputeLightPropagationWork() to compute falloff based on the light source position
43:02Make ComputeLightPropagationWork() weight the incoming light by its intensity and location
43:02Make ComputeLightPropagationWork() weight the incoming light by its intensity and location
43:02Make ComputeLightPropagationWork() weight the incoming light by its intensity and location
46:11Consider how to average higher fidelity lighting with multiple light fields
📖
46:11Consider how to average higher fidelity lighting with multiple light fields
📖
46:11Consider how to average higher fidelity lighting with multiple light fields
📖
48:23Make ComputeLightPropagationWork() initialise a consistent MoonP, and SpamVoxelSlice() and SpamVoxel() take a LightFalloff which may be 0.0f for the moon
48:23Make ComputeLightPropagationWork() initialise a consistent MoonP, and SpamVoxelSlice() and SpamVoxel() take a LightFalloff which may be 0.0f for the moon
48:23Make ComputeLightPropagationWork() initialise a consistent MoonP, and SpamVoxelSlice() and SpamVoxel() take a LightFalloff which may be 0.0f for the moon
54:37Introduce a stubbed out ComputeVoxelIrradianceAt()
54:37Introduce a stubbed out ComputeVoxelIrradianceAt()
54:37Introduce a stubbed out ComputeVoxelIrradianceAt()
55:38Traverse the world with the determination to put lights into the casting hierarchy
🏃
55:38Traverse the world with the determination to put lights into the casting hierarchy
🏃
55:38Traverse the world with the determination to put lights into the casting hierarchy
🏃
56:29Determine to distinguish between lights and occluders
🗩
56:29Determine to distinguish between lights and occluders
🗩
56:29Determine to distinguish between lights and occluders
🗩
57:59Spatial Partitioning of Lights
🖌
57:59Spatial Partitioning of Lights
🖌
57:59Spatial Partitioning of Lights
🖌
1:03:17Upgrade our lighting_box spatial hierarchy for gathering four lights and distinguish between lights and occluders, replacing its Emission and TextureIndex values with a LightBoxD array in lighting_solution
1:03:17Upgrade our lighting_box spatial hierarchy for gathering four lights and distinguish between lights and occluders, replacing its Emission and TextureIndex values with a LightBoxD array in lighting_solution
1:03:17Upgrade our lighting_box spatial hierarchy for gathering four lights and distinguish between lights and occluders, replacing its Emission and TextureIndex values with a LightBoxD array in lighting_solution
1:11:41Make PushOccluder() set IsLight to 0, and redo PushLight() based on that function instead setting IsLight to 1
1:11:41Make PushOccluder() set IsLight to 0, and redo PushLight() based on that function instead setting IsLight to 1
1:11:41Make PushOccluder() set IsLight to 0, and redo PushLight() based on that function instead setting IsLight to 1
1:13:40Fix compile errors in SplitBox() and UpdateAndRenderEntities()
1:13:40Fix compile errors in SplitBox() and UpdateAndRenderEntities()
1:13:40Fix compile errors in SplitBox() and UpdateAndRenderEntities()
1:16:16Make RayCast() conditionally set the HitEmission to 1.0 or 0.0f for lights and occluders respectively, with deep considerations on efficiency
1:16:16Make RayCast() conditionally set the HitEmission to 1.0 or 0.0f for lights and occluders respectively, with deep considerations on efficiency
1:16:16Make RayCast() conditionally set the HitEmission to 1.0 or 0.0f for lights and occluders respectively, with deep considerations on efficiency
1:24:05Find that all remains well
🏃
1:24:05Find that all remains well
🏃
1:24:05Find that all remains well
🏃
1:24:23Toggle on the PushLight() call in UpdateAndRenderWorld()
1:24:23Toggle on the PushLight() call in UpdateAndRenderWorld()
1:24:23Toggle on the PushLight() call in UpdateAndRenderWorld()
1:25:12Check out our pushed light, being occluded at the top of the hero's hop
🏃
1:25:12Check out our pushed light, being occluded at the top of the hero's hop
🏃
1:25:12Check out our pushed light, being occluded at the top of the hero's hop
🏃
1:25:50Set up TestCastFromProbes() to distinguish between lights and occluders
1:25:50Set up TestCastFromProbes() to distinguish between lights and occluders
1:25:50Set up TestCastFromProbes() to distinguish between lights and occluders
1:27:10Find that our light–occluder distinguishing does not work
🏃
1:27:10Find that our light–occluder distinguishing does not work
🏃
1:27:10Find that our light–occluder distinguishing does not work
🏃
1:27:31Enable IsTestCast in TestCastFromProbes() to highlight ray hits
1:27:31Enable IsTestCast in TestCastFromProbes() to highlight ray hits
1:27:31Enable IsTestCast in TestCastFromProbes() to highlight ray hits
1:30:06Find that our light–occluder distinguishing now works
🏃
1:30:06Find that our light–occluder distinguishing now works
🏃
1:30:06Find that our light–occluder distinguishing now works
🏃
1:31:17Introduce GetSpatialLeafForP() to gather light from the spatial hierarchy
1:31:17Introduce GetSpatialLeafForP() to gather light from the spatial hierarchy
1:31:17Introduce GetSpatialLeafForP() to gather light from the spatial hierarchy
1:38:29Make TestCastFromProbes() call GetSpatialLeafForP(), and rename LightBoxP to LightBoxTargetP in lighting_solution
1:38:29Make TestCastFromProbes() call GetSpatialLeafForP(), and rename LightBoxP to LightBoxTargetP in lighting_solution
1:38:29Make TestCastFromProbes() call GetSpatialLeafForP(), and rename LightBoxP to LightBoxTargetP in lighting_solution
1:41:04Slightly rewrite GetSpatialLeafForP() to return a u32 rather than a lighting_box pointer
1:41:04Slightly rewrite GetSpatialLeafForP() to return a u32 rather than a lighting_box pointer
1:41:04Slightly rewrite GetSpatialLeafForP() to return a u32 rather than a lighting_box pointer
1:42:39Fix compile error in TestCastFromProbes()
1:42:39Fix compile error in TestCastFromProbes()
1:42:39Fix compile error in TestCastFromProbes()
1:43:12Determine to gather our light from the spatial hierarchy
🗩
1:43:12Determine to gather our light from the spatial hierarchy
🗩
1:43:12Determine to gather our light from the spatial hierarchy
🗩
1:43:47Check out our uninitialised light
🏃
1:43:47Check out our uninitialised light
🏃
1:43:47Check out our uninitialised light
🏃
1:43:59Investigate why we saw the light move
📖
1:43:59Investigate why we saw the light move
📖
1:43:59Investigate why we saw the light move
📖
1:44:43Consider our lighting to be buggy
🏃
1:44:43Consider our lighting to be buggy
🏃
1:44:43Consider our lighting to be buggy
🏃
1:45:02Begin to enable BuildSpatialPartitionForLighting() to insert lights into the hierarchy, introducing InsertLight()
1:45:02Begin to enable BuildSpatialPartitionForLighting() to insert lights into the hierarchy, introducing InsertLight()
1:45:02Begin to enable BuildSpatialPartitionForLighting() to insert lights into the hierarchy, introducing InsertLight()
1:52:21Consider tabling our spatial hierarchy lighting gather for tomorrow
🗩
1:52:21Consider tabling our spatial hierarchy lighting gather for tomorrow
🗩
1:52:21Consider tabling our spatial hierarchy lighting gather for tomorrow
🗩
1:53:55Make BuildSpatialPartitionForLighting() fill LightBoxTargetP with the DebugLightP
1:53:55Make BuildSpatialPartitionForLighting() fill LightBoxTargetP with the DebugLightP
1:53:55Make BuildSpatialPartitionForLighting() fill LightBoxTargetP with the DebugLightP
1:55:01Verify that the LightBoxTargetP filling works
🏃
1:55:01Verify that the LightBoxTargetP filling works
🏃
1:55:01Verify that the LightBoxTargetP filling works
🏃
1:55:09Disable IsTestCast in TestCastFromProbes()
1:55:09Disable IsTestCast in TestCastFromProbes()
1:55:09Disable IsTestCast in TestCastFromProbes()
1:55:34See our test lighting, without the spatial hierarchy lookup
🏃
1:55:34See our test lighting, without the spatial hierarchy lookup
🏃
1:55:34See our test lighting, without the spatial hierarchy lookup
🏃
1:55:56Q&A
🗩
1:55:56Q&A
🗩
1:55:56Q&A
🗩
1:57:230lpbm Q: You're returning 0 instead of Result in the function you created to find the box
🗪
1:57:230lpbm Q: You're returning 0 instead of Result in the function you created to find the box
🗪
1:57:230lpbm Q: You're returning 0 instead of Result in the function you created to find the box
🗪
1:57:45Fix GetSpatialLeafForP() to return Result
1:57:45Fix GetSpatialLeafForP() to return Result
1:57:45Fix GetSpatialLeafForP() to return Result
1:58:03ymm0 Q: Not sure how relevant, but the problem seems related to importance sampling lights in Monte Carlo ray tracers
🗪
1:58:03ymm0 Q: Not sure how relevant, but the problem seems related to importance sampling lights in Monte Carlo ray tracers
🗪
1:58:03ymm0 Q: Not sure how relevant, but the problem seems related to importance sampling lights in Monte Carlo ray tracers
🗪
1:59:43jessem3y3r Q: What lessons did you learn from implementing Handmade Hero's debug inspection system?
🗪
1:59:43jessem3y3r Q: What lessons did you learn from implementing Handmade Hero's debug inspection system?
🗪
1:59:43jessem3y3r Q: What lessons did you learn from implementing Handmade Hero's debug inspection system?
🗪
2:01:15jessem3y3r Q: Yes! Follow up question incoming...
🗪
2:01:15jessem3y3r Q: Yes! Follow up question incoming...
🗪
2:01:15jessem3y3r Q: Yes! Follow up question incoming...
🗪
2:02:09devsigner Q: Are there any performance impacts to storing large arrays of data as static global constants?
🗪
2:02:09devsigner Q: Are there any performance impacts to storing large arrays of data as static global constants?
🗪
2:02:09devsigner Q: Are there any performance impacts to storing large arrays of data as static global constants?
🗪
2:04:10jessem3y3r Q: Is a non-trivial part of the difficulty the inherent limitations of C (you originally had to implement various metaprogramming tooling) or is the ideal system you want just inherently complex?
🗪
2:04:10jessem3y3r Q: Is a non-trivial part of the difficulty the inherent limitations of C (you originally had to implement various metaprogramming tooling) or is the ideal system you want just inherently complex?
🗪
2:04:10jessem3y3r Q: Is a non-trivial part of the difficulty the inherent limitations of C (you originally had to implement various metaprogramming tooling) or is the ideal system you want just inherently complex?
🗪
2:04:52panostrak Q: Do you use OpenGL?
🗪
2:04:52panostrak Q: Do you use OpenGL?
🗪
2:04:52panostrak Q: Do you use OpenGL?
🗪
2:06:420lpbm Q: Will you add lights separately, or bundle it with other objects in the scene (like lamps, for example)?
🗪
2:06:420lpbm Q: Will you add lights separately, or bundle it with other objects in the scene (like lamps, for example)?
🗪
2:06:420lpbm Q: Will you add lights separately, or bundle it with other objects in the scene (like lamps, for example)?
🗪
2:08:14berlin84 Q: Not a question, but just wanted to tell you. Lost two daughters (twins) due to a freak accident, and binging Handmade Hero helped a lot with managing the loss during the hardest time. You help with more than you probably think
🗪
2:08:14berlin84 Q: Not a question, but just wanted to tell you. Lost two daughters (twins) due to a freak accident, and binging Handmade Hero helped a lot with managing the loss during the hardest time. You help with more than you probably think
🗪
2:08:14berlin84 Q: Not a question, but just wanted to tell you. Lost two daughters (twins) due to a freak accident, and binging Handmade Hero helped a lot with managing the loss during the hardest time. You help with more than you probably think
🗪
2:10:23jessef Q: Do you think the current trend of dedicated ray tracing hardware is the right way to go for GPUs solving the lighting problem? Is there another route you would like to see?
🗪
2:10:23jessef Q: Do you think the current trend of dedicated ray tracing hardware is the right way to go for GPUs solving the lighting problem? Is there another route you would like to see?
🗪
2:10:23jessef Q: Do you think the current trend of dedicated ray tracing hardware is the right way to go for GPUs solving the lighting problem? Is there another route you would like to see?
🗪
2:14:36bulmanator Q: I really like the platform and renderer setup you have. If your renderer needed to load files – for shaders or something, or had to allocate a lot of stuff – would you reimplement the platform specific functions in the renderer, or would you pass your platform API struct to the renderer initialise and use the ones your main executable implemented?
🗪
2:14:36bulmanator Q: I really like the platform and renderer setup you have. If your renderer needed to load files – for shaders or something, or had to allocate a lot of stuff – would you reimplement the platform specific functions in the renderer, or would you pass your platform API struct to the renderer initialise and use the ones your main executable implemented?
🗪
2:14:36bulmanator Q: I really like the platform and renderer setup you have. If your renderer needed to load files – for shaders or something, or had to allocate a lot of stuff – would you reimplement the platform specific functions in the renderer, or would you pass your platform API struct to the renderer initialise and use the ones your main executable implemented?
🗪
2:16:17Wrap it up
🗩
2:16:17Wrap it up
🗩
2:16:17Wrap it up
🗩