Handmade Hero»Episode Guide
Fixing Light Feedback
?
?

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:00Recap and set the stage for the day looking into light transport
🖌
0:00Recap and set the stage for the day looking into light transport
🖌
0:00Recap and set the stage for the day looking into light transport
🖌
2:55Light Transport
🖌
2:55Light Transport
🖌
2:55Light Transport
🖌
3:14Light Transport: 1. Throwing a light source in a scene, sampling and the inverse-square law
🖌
3:14Light Transport: 1. Throwing a light source in a scene, sampling and the inverse-square law
🖌
3:14Light Transport: 1. Throwing a light source in a scene, sampling and the inverse-square law
🖌
16:59Light Transport: 2. Our lack of a reflectance equation that distributes energy fairly without adding energy to the system
🖌
16:59Light Transport: 2. Our lack of a reflectance equation that distributes energy fairly without adding energy to the system
🖌
16:59Light Transport: 2. Our lack of a reflectance equation that distributes energy fairly without adding energy to the system
🖌
27:44Light Transport: Distributing reflected light fairly
🖌
27:44Light Transport: Distributing reflected light fairly
🖌
27:44Light Transport: Distributing reflected light fairly
🖌
35:14Drink of water
🗹
35:14Drink of water
🗹
35:14Drink of water
🗹
35:32Return and clean the board
🗹
35:32Return and clean the board
🗹
35:32Return and clean the board
🗹
36:57Light Transport: Photon counting, Collection 1 (Direct)
🖌
36:57Light Transport: Photon counting, Collection 1 (Direct)
🖌
36:57Light Transport: Photon counting, Collection 1 (Direct)
🖌
43:36Light Transport: Photon counting, Collection 2 (Reflected)
🖌
43:36Light Transport: Photon counting, Collection 2 (Reflected)
🖌
43:36Light Transport: Photon counting, Collection 2 (Reflected)
🖌
53:16Light Transport: Energy conservation and collection of light from other probes
🖌
53:16Light Transport: Energy conservation and collection of light from other probes
🖌
53:16Light Transport: Energy conservation and collection of light from other probes
🖌
55:25Return
🗹
55:25Return
🗹
55:25Return
🗹
55:35spacenaming handmade_hero Just wanted to let you know you clipped once during the lightboard session (at the word "max" funnily enough), the rest was fine
🗪
55:35spacenaming handmade_hero Just wanted to let you know you clipped once during the lightboard session (at the word "max" funnily enough), the rest was fine
🗪
55:35spacenaming handmade_hero Just wanted to let you know you clipped once during the lightboard session (at the word "max" funnily enough), the rest was fine
🗪
55:41Reduce the lightboard scene's audio
🗹
55:41Reduce the lightboard scene's audio
🗹
55:41Reduce the lightboard scene's audio
🗹
56:32Energy conservation confusion
📖
56:32Energy conservation confusion
📖
56:32Energy conservation confusion
📖
57:04nickito97 So the problem is the probe is measuring the "flow" of light through the probe, and the wall next to he probe is using that value to reflect, despite the fact that "flow" can keep going and be reused by other probes, generating more light from nothing?
🗪
57:04nickito97 So the problem is the probe is measuring the "flow" of light through the probe, and the wall next to he probe is using that value to reflect, despite the fact that "flow" can keep going and be reused by other probes, generating more light from nothing?
🗪
57:04nickito97 So the problem is the probe is measuring the "flow" of light through the probe, and the wall next to he probe is using that value to reflect, despite the fact that "flow" can keep going and be reused by other probes, generating more light from nothing?
🗪
59:09recyrillic We could calculate the amount emitted and the amount received and artificially dampen the emission the next frame. But I am not sure that would fix it as we still would have one frame of latency
🗪
59:09recyrillic We could calculate the amount emitted and the amount received and artificially dampen the emission the next frame. But I am not sure that would fix it as we still would have one frame of latency
🗪
59:09recyrillic We could calculate the amount emitted and the amount received and artificially dampen the emission the next frame. But I am not sure that would fix it as we still would have one frame of latency
🗪
1:00:26Consider reading about light probes
📖
1:00:26Consider reading about light probes
📖
1:00:26Consider reading about light probes
📖
1:04:15evuntech Propagating light info between light probes doesn't make much sense to me. I think you'd want to interpolate rather than sharing info between them
🗪
1:04:15evuntech Propagating light info between light probes doesn't make much sense to me. I think you'd want to interpolate rather than sharing info between them
🗪
1:04:15evuntech Propagating light info between light probes doesn't make much sense to me. I think you'd want to interpolate rather than sharing info between them
🗪
1:05:31Recall the original paper we read on light probes1
📖
1:05:31Recall the original paper we read on light probes1
📖
1:05:31Recall the original paper we read on light probes1
📖
1:07:15Consult 'Dynamic Diffuse Global Illumination with Ray-Traced Irradiance Fields'2
📖
1:07:15Consult 'Dynamic Diffuse Global Illumination with Ray-Traced Irradiance Fields'2
📖
1:07:15Consult 'Dynamic Diffuse Global Illumination with Ray-Traced Irradiance Fields'2
📖
1:14:05Reacquaint ourselves with ComputeLightPropagationWork() and BuildDiffuseLightMaps()
📖
1:14:05Reacquaint ourselves with ComputeLightPropagationWork() and BuildDiffuseLightMaps()
📖
1:14:05Reacquaint ourselves with ComputeLightPropagationWork() and BuildDiffuseLightMaps()
📖
1:16:57Consider ordering Real-Time Rendering3
📖
1:16:57Consider ordering Real-Time Rendering3
📖
1:16:57Consider ordering Real-Time Rendering3
📖
1:18:27Consult 'Real-Time Global Illumination using Precomputed Light Field Probes'4
📖
1:18:27Consult 'Real-Time Global Illumination using Precomputed Light Field Probes'4
📖
1:18:27Consult 'Real-Time Global Illumination using Precomputed Light Field Probes'4
📖
1:29:48Demo the light feedback
🏃
1:29:48Demo the light feedback
🏃
1:29:48Demo the light feedback
🏃
1:30:10Darken the glove's light from 3 to 1 in AddPlayer()
1:30:10Darken the glove's light from 3 to 1 in AddPlayer()
1:30:10Darken the glove's light from 3 to 1 in AddPlayer()
1:30:21The light does not feed back
🏃
1:30:21The light does not feed back
🏃
1:30:21The light does not feed back
🏃
1:31:19Brighten the glove's light from 1 to 2 in AddPlayer()
1:31:19Brighten the glove's light from 1 to 2 in AddPlayer()
1:31:19Brighten the glove's light from 1 to 2 in AddPlayer()
1:31:28The light slowly feeds back
🏃
1:31:28The light slowly feeds back
🏃
1:31:28The light slowly feeds back
🏃
1:31:51Darken the glove's light from 2 to 1 in AddPlayer()
1:31:51Darken the glove's light from 2 to 1 in AddPlayer()
1:31:51Darken the glove's light from 2 to 1 in AddPlayer()
1:32:11The light does not feed back, but why?
🏃
1:32:11The light does not feed back, but why?
🏃
1:32:11The light does not feed back, but why?
🏃
1:33:42drzool 1.1 * 1.1 = larger than original
🗪
1:33:42drzool 1.1 * 1.1 = larger than original
🗪
1:33:42drzool 1.1 * 1.1 = larger than original
🗪
1:34:48Consider fixing the occlusion bug
🏃
1:34:48Consider fixing the occlusion bug
🏃
1:34:48Consider fixing the occlusion bug
🏃
1:35:43Reacquaint ourselves with the bilinear filtering code in GridRayCast()
📖
1:35:43Reacquaint ourselves with the bilinear filtering code in GridRayCast()
📖
1:35:43Reacquaint ourselves with the bilinear filtering code in GridRayCast()
📖
1:39:19Reacquaint ourselves with our surface colours
📖
1:39:19Reacquaint ourselves with our surface colours
📖
1:39:19Reacquaint ourselves with our surface colours
📖
1:43:22Brighten the glove's light from 1 to 1.25 in AddPlayer()
1:43:22Brighten the glove's light from 1 to 1.25 in AddPlayer()
1:43:22Brighten the glove's light from 1 to 1.25 in AddPlayer()
1:44:15The light does not feed back
🏃
1:44:15The light does not feed back
🏃
1:44:15The light does not feed back
🏃
1:44:34Brighten the glove's light from 1.25 to 1.3 in AddPlayer()
1:44:34Brighten the glove's light from 1.25 to 1.3 in AddPlayer()
1:44:34Brighten the glove's light from 1.25 to 1.3 in AddPlayer()
1:44:48The light appears not to feed back
🏃
1:44:48The light appears not to feed back
🏃
1:44:48The light appears not to feed back
🏃
1:45:09Brighten the glove's light from 1.3 to 1.5 in AddPlayer()
1:45:09Brighten the glove's light from 1.3 to 1.5 in AddPlayer()
1:45:09Brighten the glove's light from 1.3 to 1.5 in AddPlayer()
1:45:18The light appears not to feed back
🏃
1:45:18The light appears not to feed back
🏃
1:45:18The light appears not to feed back
🏃
1:45:30Brighten the glove's light from 1.5 to 1.75 in AddPlayer()
1:45:30Brighten the glove's light from 1.5 to 1.75 in AddPlayer()
1:45:30Brighten the glove's light from 1.5 to 1.75 in AddPlayer()
1:45:39The light slowly feeds back
🏃
1:45:39The light slowly feeds back
🏃
1:45:39The light slowly feeds back
🏃
1:47:08mariusorc Q: Is it possible that the color dampening hits some negative values and adds to the lighting instead?
🗪
1:47:08mariusorc Q: Is it possible that the color dampening hits some negative values and adds to the lighting instead?
🗪
1:47:08mariusorc Q: Is it possible that the color dampening hits some negative values and adds to the lighting instead?
🗪
1:48:18vaualbus But did we always have this problem? Like, can be the removal of Z or the walking grid make this happen?
🗪
1:48:18vaualbus But did we always have this problem? Like, can be the removal of Z or the walking grid make this happen?
🗪
1:48:18vaualbus But did we always have this problem? Like, can be the removal of Z or the walking grid make this happen?
🗪
1:48:41Decrease tUpdateBlend from 6/60 to 1/60 in UpdateLighting()
1:48:41Decrease tUpdateBlend from 6/60 to 1/60 in UpdateLighting()
1:48:41Decrease tUpdateBlend from 6/60 to 1/60 in UpdateLighting()
1:48:52The light appears not to feed back
🏃
1:48:52The light appears not to feed back
🏃
1:48:52The light appears not to feed back
🏃
1:49:12Brighten the glove's light from 1.75 to 2 in AddPlayer()
1:49:12Brighten the glove's light from 1.75 to 2 in AddPlayer()
1:49:12Brighten the glove's light from 1.75 to 2 in AddPlayer()
1:49:22The light slowly feeds back
🏃
1:49:22The light slowly feeds back
🏃
1:49:22The light slowly feeds back
🏃
1:49:34Increase tUpdateBlend from 1/60 to 6/60 in UpdateLighting()
1:49:34Increase tUpdateBlend from 1/60 to 6/60 in UpdateLighting()
1:49:34Increase tUpdateBlend from 1/60 to 6/60 in UpdateLighting()
1:49:38The light quickly feeds back
🏃
1:49:38The light quickly feeds back
🏃
1:49:38The light quickly feeds back
🏃
1:50:46Consider how to progress, possibly applying an exposure curve
📖
1:50:46Consider how to progress, possibly applying an exposure curve
📖
1:50:46Consider how to progress, possibly applying an exposure curve
📖
1:52:33Consult LearnOpenGL's HDR article5 for a simple exposure curve
📖
1:52:33Consult LearnOpenGL's HDR article5 for a simple exposure curve
📖
1:52:33Consult LearnOpenGL's HDR article5 for a simple exposure curve
📖
1:53:42Make CompileZBiasProgram() clamp SurfaceReflect in a single call
1:53:42Make CompileZBiasProgram() clamp SurfaceReflect in a single call
1:53:42Make CompileZBiasProgram() clamp SurfaceReflect in a single call
1:53:59That seems fine
🏃
1:53:59That seems fine
🏃
1:53:59That seems fine
🏃
1:54:07Make CompileZBiasProgram() apply Reinhard tone mapping to the SurfaceReflect
1:54:07Make CompileZBiasProgram() apply Reinhard tone mapping to the SurfaceReflect
1:54:07Make CompileZBiasProgram() apply Reinhard tone mapping to the SurfaceReflect
1:54:55The light feeds back
🏃
1:54:55The light feeds back
🏃
1:54:55The light feeds back
🏃
1:55:32Remove Reinhard tone mapping from SurfaceReflect in CompileZBiasProgram()
1:55:32Remove Reinhard tone mapping from SurfaceReflect in CompileZBiasProgram()
1:55:32Remove Reinhard tone mapping from SurfaceReflect in CompileZBiasProgram()
1:55:48immow Are beginner questions okay?
🗪
1:55:48immow Are beginner questions okay?
🗪
1:55:48immow Are beginner questions okay?
🗪
1:56:03Eyeball our over-brighting bug
🏃
1:56:03Eyeball our over-brighting bug
🏃
1:56:03Eyeball our over-brighting bug
🏃
1:57:25Make GridRayCast() zero out HitRefColor and HitEmission upon walking the distance
1:57:25Make GridRayCast() zero out HitRefColor and HitEmission upon walking the distance
1:57:25Make GridRayCast() zero out HitRefColor and HitEmission upon walking the distance
1:58:32The light feeds back
🏃
1:58:32The light feeds back
🏃
1:58:32The light feeds back
🏃
1:58:53Make GridRayCast() only zero out HitRefColor and HitEmission upon hitting the SPATIAL_GRID_NODE_TERMINATOR
1:58:53Make GridRayCast() only zero out HitRefColor and HitEmission upon hitting the SPATIAL_GRID_NODE_TERMINATOR
1:58:53Make GridRayCast() only zero out HitRefColor and HitEmission upon hitting the SPATIAL_GRID_NODE_TERMINATOR
1:59:11The light feeds back
🏃
1:59:11The light feeds back
🏃
1:59:11The light feeds back
🏃
1:59:19Revert our changes to GridRayCast()
1:59:19Revert our changes to GridRayCast()
1:59:19Revert our changes to GridRayCast()
2:00:12vaualbus Q: Could it be sampling errors? Like aliasing or some sort of things like that? Also maybe we are not always dealing with normalized numbers, and in the equation we should count normalization values?
🗪
2:00:12vaualbus Q: Could it be sampling errors? Like aliasing or some sort of things like that? Also maybe we are not always dealing with normalized numbers, and in the equation we should count normalization values?
🗪
2:00:12vaualbus Q: Could it be sampling errors? Like aliasing or some sort of things like that? Also maybe we are not always dealing with normalized numbers, and in the equation we should count normalization values?
🗪
2:02:13mallesbixie Last time I watched, there was sus copy pasta code at the TransferPPSAccum line endings. Can we peak there again?
🗪
2:02:13mallesbixie Last time I watched, there was sus copy pasta code at the TransferPPSAccum line endings. Can we peak there again?
🗪
2:02:13mallesbixie Last time I watched, there was sus copy pasta code at the TransferPPSAccum line endings. Can we peak there again?
🗪
2:02:47mallesbixie Yeah, there, 0 as last args
🗪
2:02:47mallesbixie Yeah, there, 0 as last args
🗪
2:02:47mallesbixie Yeah, there, 0 as last args
🗪
2:03:10Describe the shuffler code in GridRayCast()
📖
2:03:10Describe the shuffler code in GridRayCast()
📖
2:03:10Describe the shuffler code in GridRayCast()
📖
2:08:27Consider our definition of the light transfer problem to be wrong
🏃
2:08:27Consider our definition of the light transfer problem to be wrong
🏃
2:08:27Consider our definition of the light transfer problem to be wrong
🏃
2:09:05Consider working through the light transfer problem on the light board
📖
2:09:05Consider working through the light transfer problem on the light board
📖
2:09:05Consider working through the light transfer problem on the light board
📖
2:09:58mindmark42 What is the normal storing thing the paper6 was talking about?
🗪
2:09:58mindmark42 What is the normal storing thing the paper6 was talking about?
🗪
2:09:58mindmark42 What is the normal storing thing the paper6 was talking about?
🗪
2:10:08Toggle on DebugDrawOctahedralValues() in UpdateLighting()
2:10:08Toggle on DebugDrawOctahedralValues() in UpdateLighting()
2:10:08Toggle on DebugDrawOctahedralValues() in UpdateLighting()
2:10:37Describe our light probe octahedral values
🏃
2:10:37Describe our light probe octahedral values
🏃
2:10:37Describe our light probe octahedral values
🏃
2:11:23Darken the glove's light from 2 to 1 in AddPlayer()
2:11:23Darken the glove's light from 2 to 1 in AddPlayer()
2:11:23Darken the glove's light from 2 to 1 in AddPlayer()
2:11:46Describe our light probe octahedral values, without feedback
🏃
2:11:46Describe our light probe octahedral values, without feedback
🏃
2:11:46Describe our light probe octahedral values, without feedback
🏃
2:13:26Toggle on GRID_RAY_CAST_DEBUGGING
2:13:26Toggle on GRID_RAY_CAST_DEBUGGING
2:13:26Toggle on GRID_RAY_CAST_DEBUGGING
2:13:37Describe the paper's7 storage of hit surface normal
🏃
2:13:37Describe the paper's7 storage of hit surface normal
🏃
2:13:37Describe the paper's7 storage of hit surface normal
🏃
2:16:34Toggle off room lights in StandardLightingPattern()
2:16:34Toggle off room lights in StandardLightingPattern()
2:16:34Toggle off room lights in StandardLightingPattern()
2:17:23Our glove alone does not contaminate
🏃
2:17:23Our glove alone does not contaminate
🏃
2:17:23Our glove alone does not contaminate
🏃
2:17:48Make CompileZBiasProgram() multiply the SurfaceReflect by 10
2:17:48Make CompileZBiasProgram() multiply the SurfaceReflect by 10
2:17:48Make CompileZBiasProgram() multiply the SurfaceReflect by 10
2:18:45Our glove is brighter
🏃
2:18:45Our glove is brighter
🏃
2:18:45Our glove is brighter
🏃
2:18:56Make CompileZBiasProgram() multiply the SurfaceReflect by 100
2:18:56Make CompileZBiasProgram() multiply the SurfaceReflect by 100
2:18:56Make CompileZBiasProgram() multiply the SurfaceReflect by 100
2:19:01Our glove is brighter still, and does not feed back
🏃
2:19:01Our glove is brighter still, and does not feed back
🏃
2:19:01Our glove is brighter still, and does not feed back
🏃
2:19:28Toggle on room lights in StandardLightingPattern(), and reduce their intensity from 10 to 0.1
2:19:28Toggle on room lights in StandardLightingPattern(), and reduce their intensity from 10 to 0.1
2:19:28Toggle on room lights in StandardLightingPattern(), and reduce their intensity from 10 to 0.1
2:20:04Our world is the brightness we'd like, and the light does not feed back
🏃
2:20:04Our world is the brightness we'd like, and the light does not feed back
🏃
2:20:04Our world is the brightness we'd like, and the light does not feed back
🏃
2:20:17Toggle off DebugDrawOctahedralValues() in UpdateLighting()
2:20:17Toggle off DebugDrawOctahedralValues() in UpdateLighting()
2:20:17Toggle off DebugDrawOctahedralValues() in UpdateLighting()
2:20:36Our world is the brightness we'd like, and the light does not feed back
🏃
2:20:36Our world is the brightness we'd like, and the light does not feed back
🏃
2:20:36Our world is the brightness we'd like, and the light does not feed back
🏃
2:22:06Darken the glove's light from 1 to 0.2 in AddPlayer()
2:22:06Darken the glove's light from 1 to 0.2 in AddPlayer()
2:22:06Darken the glove's light from 1 to 0.2 in AddPlayer()
2:22:31Our lighting looks basically correct
🏃
2:22:31Our lighting looks basically correct
🏃
2:22:31Our lighting looks basically correct
🏃
2:22:53Darken the moonlight from 0.2 to 0.025 in GenerateApron()
2:22:53Darken the moonlight from 0.2 to 0.025 in GenerateApron()
2:22:53Darken the moonlight from 0.2 to 0.025 in GenerateApron()
2:23:26The exterior light is still quite bright
🏃
2:23:26The exterior light is still quite bright
🏃
2:23:26The exterior light is still quite bright
🏃
2:23:30Darken the moonlight from 0.025 to 0.01 in GenerateApron()
2:23:30Darken the moonlight from 0.025 to 0.01 in GenerateApron()
2:23:30Darken the moonlight from 0.025 to 0.01 in GenerateApron()
2:23:37The exterior light is maybe about right
🏃
2:23:37The exterior light is maybe about right
🏃
2:23:37The exterior light is maybe about right
🏃
2:23:41Darken the moonlight from 0.01 to 0.005 in GenerateApron()
2:23:41Darken the moonlight from 0.01 to 0.005 in GenerateApron()
2:23:41Darken the moonlight from 0.01 to 0.005 in GenerateApron()
2:23:49The light looks as we'd like
🏃
2:23:49The light looks as we'd like
🏃
2:23:49The light looks as we'd like
🏃
2:24:54sagian2005 Gorgeous light that we don't understand
🗪
2:24:54sagian2005 Gorgeous light that we don't understand
🗪
2:24:54sagian2005 Gorgeous light that we don't understand
🗪
2:25:09An unanticipated portion of the system is working as a percentage
🏃
2:25:09An unanticipated portion of the system is working as a percentage
🏃
2:25:09An unanticipated portion of the system is working as a percentage
🏃
2:26:11Determine to address our occluded light probe darkening problem
📖
2:26:11Determine to address our occluded light probe darkening problem
📖
2:26:11Determine to address our occluded light probe darkening problem
📖
2:26:40Toggle on DebugDrawOctahedralValues() and DebugDrawSpatialGrid() in UpdateLighting()
2:26:40Toggle on DebugDrawOctahedralValues() and DebugDrawSpatialGrid() in UpdateLighting()
2:26:40Toggle on DebugDrawOctahedralValues() and DebugDrawSpatialGrid() in UpdateLighting()
2:27:06Illustrate our darkened occluded light probe
🏃
2:27:06Illustrate our darkened occluded light probe
🏃
2:27:06Illustrate our darkened occluded light probe
🏃
2:27:37Make DebugDrawSpatialGrid() colour the leaves with their RefColor
2:27:37Make DebugDrawSpatialGrid() colour the leaves with their RefColor
2:27:37Make DebugDrawSpatialGrid() colour the leaves with their RefColor
2:29:09The spatial grid leaves are all white
🏃
2:29:09The spatial grid leaves are all white
🏃
2:29:09The spatial grid leaves are all white
🏃
2:29:24Make DebugDrawSpatialGrid() account for Emission when colouring the leaves
2:29:24Make DebugDrawSpatialGrid() account for Emission when colouring the leaves
2:29:24Make DebugDrawSpatialGrid() account for Emission when colouring the leaves
2:30:05Illustrate our darkened embedded light probes
🏃
2:30:05Illustrate our darkened embedded light probes
🏃
2:30:05Illustrate our darkened embedded light probes
🏃
2:31:19Describe the code that blackens embedded light probes in FullCast()
📖
2:31:19Describe the code that blackens embedded light probes in FullCast()
📖
2:31:19Describe the code that blackens embedded light probes in FullCast()
📖
2:31:59Prevent FullCast() from touching embedded light probes
2:31:59Prevent FullCast() from touching embedded light probes
2:31:59Prevent FullCast() from touching embedded light probes
2:32:13Light probes no longer darken when occluded by the glove, but neither do they receive its full light contribution
🏃
2:32:13Light probes no longer darken when occluded by the glove, but neither do they receive its full light contribution
🏃
2:32:13Light probes no longer darken when occluded by the glove, but neither do they receive its full light contribution
🏃
2:33:00Consider running the occlusion check on every sample
📖
2:33:00Consider running the occlusion check on every sample
📖
2:33:00Consider running the occlusion check on every sample
📖
2:35:18Let FullCast() cast rays from embedded light probes
2:35:18Let FullCast() cast rays from embedded light probes
2:35:18Let FullCast() cast rays from embedded light probes
2:35:36The light looks good
🏃
2:35:36The light looks good
🏃
2:35:36The light looks good
🏃
2:36:37Document the embedded light probe ray casting
2:36:37Document the embedded light probe ray casting
2:36:37Document the embedded light probe ray casting
2:37:24The light leaks through walls
🏃
2:37:24The light leaks through walls
🏃
2:37:24The light leaks through walls
🏃
2:38:45Make FullCast() distinguish between emitters and occluders, making only the latter contribute to the IsInside check
2:38:45Make FullCast() distinguish between emitters and occluders, making only the latter contribute to the IsInside check
2:38:45Make FullCast() distinguish between emitters and occluders, making only the latter contribute to the IsInside check
2:42:18The light no longer leaks through walls
🏃
2:42:18The light no longer leaks through walls
🏃
2:42:18The light no longer leaks through walls
🏃
2:43:39psarokroketa Wouldn't IsEmission <= Zero work?
🗪
2:43:39psarokroketa Wouldn't IsEmission <= Zero work?
🗪
2:43:39psarokroketa Wouldn't IsEmission <= Zero work?
🗪
2:43:44Reorient the Mask computation around IsOccluder in FullCast()
2:43:44Reorient the Mask computation around IsOccluder in FullCast()
2:43:44Reorient the Mask computation around IsOccluder in FullCast()
2:44:05Light probes remain not directly lit by overlapping emitters
🏃
2:44:05Light probes remain not directly lit by overlapping emitters
🏃
2:44:05Light probes remain not directly lit by overlapping emitters
🏃
2:46:07Toggle off DebugDrawSpatialGrid() in UpdateLighting()
2:46:07Toggle off DebugDrawSpatialGrid() in UpdateLighting()
2:46:07Toggle off DebugDrawSpatialGrid() in UpdateLighting()
2:46:28Our octahedron directions may be nonsense
🏃
2:46:28Our octahedron directions may be nonsense
🏃
2:46:28Our octahedron directions may be nonsense
🏃
2:47:01DebugDrawOctahedralValues() isn't nonsense
📖
2:47:01DebugDrawOctahedralValues() isn't nonsense
📖
2:47:01DebugDrawOctahedralValues() isn't nonsense
📖
2:47:32Consider writing our emission values into the light probes as a pre-pass
🏃
2:47:32Consider writing our emission values into the light probes as a pre-pass
🏃
2:47:32Consider writing our emission values into the light probes as a pre-pass
🏃
2:48:35coffeeb4code Curious what the total size of Handmade Hero is (clientside)
🗪
2:48:35coffeeb4code Curious what the total size of Handmade Hero is (clientside)
🗪
2:48:35coffeeb4code Curious what the total size of Handmade Hero is (clientside)
🗪
2:48:52Consider writing our emission values into the light probes as a pre-pass (cont.)
🏃
2:48:52Consider writing our emission values into the light probes as a pre-pass (cont.)
🏃
2:48:52Consider writing our emission values into the light probes as a pre-pass (cont.)
🏃
2:49:40coffeeb4code The binary
🗪
2:49:40coffeeb4code The binary
🗪
2:49:40coffeeb4code The binary
🗪
2:49:551 MiB executable size
🗹
2:49:551 MiB executable size
🗹
2:49:551 MiB executable size
🗹
2:50:39coffeeb4code Without assets? That's so small
🗪
2:50:39coffeeb4code Without assets? That's so small
🗪
2:50:39coffeeb4code Without assets? That's so small
🗪
2:51:18Consider writing our emission values into the light probes as a pre-pass (cont.)
🏃
2:51:18Consider writing our emission values into the light probes as a pre-pass (cont.)
🏃
2:51:18Consider writing our emission values into the light probes as a pre-pass (cont.)
🏃
2:52:45gusfrehse I'd say to the left
🗪
2:52:45gusfrehse I'd say to the left
🗪
2:52:45gusfrehse I'd say to the left
🗪
2:54:12Consider writing the emission value of light volumes into light probes proportional to their overlap
🏃
2:54:12Consider writing the emission value of light volumes into light probes proportional to their overlap
🏃
2:54:12Consider writing the emission value of light volumes into light probes proportional to their overlap
🏃
2:58:48Consider writing the emission value of light volumes into light probes stochastically
🏃
2:58:48Consider writing the emission value of light volumes into light probes stochastically
🏃
2:58:48Consider writing the emission value of light volumes into light probes stochastically
🏃
3:00:07Reacquaint ourselves with our use of the specular light atlas
📖
3:00:07Reacquaint ourselves with our use of the specular light atlas
📖
3:00:07Reacquaint ourselves with our use of the specular light atlas
📖
3:03:54Rename LightDepthSampler to SpecularSampler in the OpenGL renderer
3:03:54Rename LightDepthSampler to SpecularSampler in the OpenGL renderer
3:03:54Rename LightDepthSampler to SpecularSampler in the OpenGL renderer
3:04:15Consider sampling from the specular map rather than the diffuse map
📖
3:04:15Consider sampling from the specular map rather than the diffuse map
📖
3:04:15Consider sampling from the specular map rather than the diffuse map
📖
3:05:39Yearn for the ability in C++ to #include a file as a string
💢
🗩
3:05:39Yearn for the ability in C++ to #include a file as a string
💢
🗩
3:05:39Yearn for the ability in C++ to #include a file as a string
💢
🗩
3:07:19Remove GetIrradiance()
3:07:19Remove GetIrradiance()
3:07:19Remove GetIrradiance()
3:08:41wocket251 I think std::embed got killed sadly
🗪
3:08:41wocket251 I think std::embed got killed sadly
🗪
3:08:41wocket251 I think std::embed got killed sadly
🗪
3:12:28youngsterglenn Enough of those committees and you can work towards eliminating all bad decisions
🗪
3:12:28youngsterglenn Enough of those committees and you can work towards eliminating all bad decisions
🗪
3:12:28youngsterglenn Enough of those committees and you can work towards eliminating all bad decisions
🗪
3:13:37skaman512 The problem is about embedding a shader in your code? I think inside a constexpr you can read a file and return an array (and do it at compile time)
🗪
3:13:37skaman512 The problem is about embedding a shader in your code? I think inside a constexpr you can read a file and return an array (and do it at compile time)
🗪
3:13:37skaman512 The problem is about embedding a shader in your code? I think inside a constexpr you can read a file and return an array (and do it at compile time)
🗪
3:14:00ryanfleury I just always have my own path for #embed in my metaprogram, and throw my shaders into metacode
🗪
3:14:00ryanfleury I just always have my own path for #embed in my metaprogram, and throw my shaders into metacode
🗪
3:14:00ryanfleury I just always have my own path for #embed in my metaprogram, and throw my shaders into metacode
🗪
3:14:23Reacquaint ourselves with SampleLighting()
📖
3:14:23Reacquaint ourselves with SampleLighting()
📖
3:14:23Reacquaint ourselves with SampleLighting()
📖
3:15:12nedboulter If you don't like C++ why are you using C++?
🗪
3:15:12nedboulter If you don't like C++ why are you using C++?
🗪
3:15:12nedboulter If you don't like C++ why are you using C++?
🗪
3:15:46Reacquaint ourselves with specular and diffuse map usage in SampleLighting()
📖
3:15:46Reacquaint ourselves with specular and diffuse map usage in SampleLighting()
📖
3:15:46Reacquaint ourselves with specular and diffuse map usage in SampleLighting()
📖
3:17:31Check out our light
🏃
3:17:31Check out our light
🏃
3:17:31Check out our light
🏃
3:17:47Toggle from radial to our manual bilinear interpolation in SampleLighting()
3:17:47Toggle from radial to our manual bilinear interpolation in SampleLighting()
3:17:47Toggle from radial to our manual bilinear interpolation in SampleLighting()
3:18:02Our light looks the same
🏃
3:18:02Our light looks the same
🏃
3:18:02Our light looks the same
🏃
3:18:18Toggle off our manual interpolation path in CompileZBiasProgram()
3:18:18Toggle off our manual interpolation path in CompileZBiasProgram()
3:18:18Toggle off our manual interpolation path in CompileZBiasProgram()
3:18:25Our light looks the same
🏃
3:18:25Our light looks the same
🏃
3:18:25Our light looks the same
🏃
3:18:58Double-check that we call SampleLighting()
📖
3:18:58Double-check that we call SampleLighting()
📖
3:18:58Double-check that we call SampleLighting()
📖
3:19:51Toggle off DebugDrawOctahedralValues() in UpdateLighting()
3:19:51Toggle off DebugDrawOctahedralValues() in UpdateLighting()
3:19:51Toggle off DebugDrawOctahedralValues() in UpdateLighting()
3:19:56Our light interpolation looks a little squarer
🏃
3:19:56Our light interpolation looks a little squarer
🏃
3:19:56Our light interpolation looks a little squarer
🏃
3:20:53Toggle on our radial interpolation in SampleLighting9)
3:20:53Toggle on our radial interpolation in SampleLighting9)
3:20:53Toggle on our radial interpolation in SampleLighting9)
3:20:57Our light looks the same
🏃
3:20:57Our light looks the same
🏃
3:20:57Our light looks the same
🏃
3:21:03Try making SampleLighting() colour the light red
3:21:03Try making SampleLighting() colour the light red
3:21:03Try making SampleLighting() colour the light red
3:21:25We're reloading shaders
🏃
3:21:25We're reloading shaders
🏃
3:21:25We're reloading shaders
🏃
3:21:30Let SampleLighting() work as normal, toggling from our radial to the regular bilinear interpolation
3:21:30Let SampleLighting() work as normal, toggling from our radial to the regular bilinear interpolation
3:21:30Let SampleLighting() work as normal, toggling from our radial to the regular bilinear interpolation
3:21:46Consider the regular bilinear sampling to be fine
🏃
3:21:46Consider the regular bilinear sampling to be fine
🏃
3:21:46Consider the regular bilinear sampling to be fine
🏃
3:22:17Remove our fancier interpolation code from SampleLighting() and use v3 rather than v4
3:22:17Remove our fancier interpolation code from SampleLighting() and use v3 rather than v4
3:22:17Remove our fancier interpolation code from SampleLighting() and use v3 rather than v4
3:23:49Our light looks the same
🏃
3:23:49Our light looks the same
🏃
3:23:49Our light looks the same
🏃
3:23:59Fix indentation of SumLight()
3:23:59Fix indentation of SumLight()
3:23:59Fix indentation of SumLight()
3:24:57psarokroketa Is there really no way to indent multiple lines together in 4coder?
🗪
3:24:57psarokroketa Is there really no way to indent multiple lines together in 4coder?
🗪
3:24:57psarokroketa Is there really no way to indent multiple lines together in 4coder?
🗪
3:25:42Rename LightColorSampler to DiffuseSampler in the OpenGL renderer
3:25:42Rename LightColorSampler to DiffuseSampler in the OpenGL renderer
3:25:42Rename LightColorSampler to DiffuseSampler in the OpenGL renderer
3:26:18Our light looks the same
🏃
3:26:18Our light looks the same
🏃
3:26:18Our light looks the same
🏃
3:26:25Make SampleLighting() use the SpecularSampler
3:26:25Make SampleLighting() use the SpecularSampler
3:26:25Make SampleLighting() use the SpecularSampler
3:26:49Our light now looks unpleasant and shiny
🏃
3:26:49Our light now looks unpleasant and shiny
🏃
3:26:49Our light now looks unpleasant and shiny
🏃
3:27:29Reacquaint ourselves with the reflection directionality in SumLight()
📖
3:27:29Reacquaint ourselves with the reflection directionality in SumLight()
📖
3:27:29Reacquaint ourselves with the reflection directionality in SumLight()
📖
3:28:48psarokroketa So you can just say move these 10 lines one to the left without it messing it up? This sounds painful
🗪
3:28:48psarokroketa So you can just say move these 10 lines one to the left without it messing it up? This sounds painful
🗪
3:28:48psarokroketa So you can just say move these 10 lines one to the left without it messing it up? This sounds painful
🗪
3:29:51Check out our specular light
🏃
3:29:51Check out our specular light
🏃
3:29:51Check out our specular light
🏃
3:30:09Switch SumLight() to use the reflection vector
3:30:09Switch SumLight() to use the reflection vector
3:30:09Switch SumLight() to use the reflection vector
3:30:50Check out our actual specular light
🏃
3:30:50Check out our actual specular light
🏃
3:30:50Check out our actual specular light
🏃
3:32:04recyrillic handmade_hero You can use a macro like '#define shader_code(a) #a' and then on 'char *shader = shader_code(<insert shader here>);' the <shader code> gets auto indented. At least that works for me. (Sorry if you read the previous one and ignored it on purpose)
🗪
3:32:04recyrillic handmade_hero You can use a macro like '#define shader_code(a) #a' and then on 'char *shader = shader_code(<insert shader here>);' the <shader code> gets auto indented. At least that works for me. (Sorry if you read the previous one and ignored it on purpose)
🗪
3:32:04recyrillic handmade_hero You can use a macro like '#define shader_code(a) #a' and then on 'char *shader = shader_code(<insert shader here>);' the <shader code> gets auto indented. At least that works for me. (Sorry if you read the previous one and ignored it on purpose)
🗪
3:33:07Introduce OctFrom() for SumLight() to call and compute both the specular and diffuse atlases to pass to SampleLighting()
3:33:07Introduce OctFrom() for SumLight() to call and compute both the specular and diffuse atlases to pass to SampleLighting()
3:33:07Introduce OctFrom() for SumLight() to call and compute both the specular and diffuse atlases to pass to SampleLighting()
3:36:34Our light kind of looks right
🏃
3:36:34Our light kind of looks right
🏃
3:36:34Our light kind of looks right
🏃
3:37:04Make SampleLighting() sum together the specular and diffuse atlases
3:37:04Make SampleLighting() sum together the specular and diffuse atlases
3:37:04Make SampleLighting() sum together the specular and diffuse atlases
3:37:26Check out our half-and-half specular / diffuse lighting
🏃
3:37:26Check out our half-and-half specular / diffuse lighting
🏃
3:37:26Check out our half-and-half specular / diffuse lighting
🏃
3:37:46Set up SampleLighting() to interpolate between our specular and diffuse atlases using a Material
3:37:46Set up SampleLighting() to interpolate between our specular and diffuse atlases using a Material
3:37:46Set up SampleLighting() to interpolate between our specular and diffuse atlases using a Material
3:38:46Check out our light
🏃
3:38:46Check out our light
🏃
3:38:46Check out our light
🏃
3:39:23#define EmbedShader()
3:39:23#define EmbedShader()
3:39:23#define EmbedShader()
3:40:55Hit a "Shader validation failed" error
🏃
3:40:55Hit a "Shader validation failed" error
🏃
3:40:55Hit a "Shader validation failed" error
🏃
3:42:00Scour our EmbedShader() calls for syntax errors
📖
3:42:00Scour our EmbedShader() calls for syntax errors
📖
3:42:00Scour our EmbedShader() calls for syntax errors
📖
3:42:51anelysian I think the preprocessor isn't going to preserve the #if's
🗪
3:42:51anelysian I think the preprocessor isn't going to preserve the #if's
🗪
3:42:51anelysian I think the preprocessor isn't going to preserve the #if's
🗪
3:43:45Try removing the #if's from our EmbedShader() calls
3:43:45Try removing the #if's from our EmbedShader() calls
3:43:45Try removing the #if's from our EmbedShader() calls
3:44:09Run without hitting a "Shader validation failed" error
🏃
3:44:09Run without hitting a "Shader validation failed" error
🏃
3:44:09Run without hitting a "Shader validation failed" error
🏃
3:44:21Revert our introducing of EmbedShader()
3:44:21Revert our introducing of EmbedShader()
3:44:21Revert our introducing of EmbedShader()
3:45:16Consider our light to be too bright
🏃
3:45:16Consider our light to be too bright
🏃
3:45:16Consider our light to be too bright
🏃
3:45:47Prevent CreateOrphanage() from adding light outdoors
3:45:47Prevent CreateOrphanage() from adding light outdoors
3:45:47Prevent CreateOrphanage() from adding light outdoors
3:46:38Our moonlight is still a little too bright
🏃
3:46:38Our moonlight is still a little too bright
🏃
3:46:38Our moonlight is still a little too bright
🏃
3:47:20Darken the moonlight from 0.2 to 0.01 in GenerateRoom()
3:47:20Darken the moonlight from 0.2 to 0.01 in GenerateRoom()
3:47:20Darken the moonlight from 0.2 to 0.01 in GenerateRoom()
3:47:45Our moonlight seems better
🏃
3:47:45Our moonlight seems better
🏃
3:47:45Our moonlight seems better
🏃
3:48:36Decrease tUpdateBlend from 6/60 to 3/60 in UpdateLighting()
3:48:36Decrease tUpdateBlend from 6/60 to 3/60 in UpdateLighting()
3:48:36Decrease tUpdateBlend from 6/60 to 3/60 in UpdateLighting()
3:48:57Our light doesn't look very flickery
🏃
3:48:57Our light doesn't look very flickery
🏃
3:48:57Our light doesn't look very flickery
🏃
3:49:23Decrease tUpdateBlend from 3/60 to 1/60 in UpdateLighting()
3:49:23Decrease tUpdateBlend from 3/60 to 1/60 in UpdateLighting()
3:49:23Decrease tUpdateBlend from 3/60 to 1/60 in UpdateLighting()
3:49:28Our light still doesn't flicker
🏃
3:49:28Our light still doesn't flicker
🏃
3:49:28Our light still doesn't flicker
🏃
3:49:42Increase tUpdateBlend from 1/60 to 20/60 in UpdateLighting()
3:49:42Increase tUpdateBlend from 1/60 to 20/60 in UpdateLighting()
3:49:42Increase tUpdateBlend from 1/60 to 20/60 in UpdateLighting()
3:49:51Our light flickers
🏃
3:49:51Our light flickers
🏃
3:49:51Our light flickers
🏃
3:50:03Decrease tUpdateBlend from 20/60 to 12/60 in UpdateLighting()
3:50:03Decrease tUpdateBlend from 20/60 to 12/60 in UpdateLighting()
3:50:03Decrease tUpdateBlend from 20/60 to 12/60 in UpdateLighting()
3:50:16Our light is a little flickery
🏃
3:50:16Our light is a little flickery
🏃
3:50:16Our light is a little flickery
🏃
3:53:00Increase RayCount from 8 to 16 in GridRayCast()
3:53:00Increase RayCount from 8 to 16 in GridRayCast()
3:53:00Increase RayCount from 8 to 16 in GridRayCast()
3:53:12Our light minimally flickers
🏃
3:53:12Our light minimally flickers
🏃
3:53:12Our light minimally flickers
🏃
3:54:36Determine to tackle forward-rasterisation next week
📖
3:54:36Determine to tackle forward-rasterisation next week
📖
3:54:36Determine to tackle forward-rasterisation next week
📖
3:54:59Toggle off room lights in StandardLightingPattern()
3:54:59Toggle off room lights in StandardLightingPattern()
3:54:59Toggle off room lights in StandardLightingPattern()
3:55:12Admire our spooky orphanage
🏃
3:55:12Admire our spooky orphanage
🏃
3:55:12Admire our spooky orphanage
🏃
3:56:22Make CreateOrphanage() put a Snake in BedroomA, and darken the light from 5 to 1 in SnakePattern()
3:56:22Make CreateOrphanage() put a Snake in BedroomA, and darken the light from 5 to 1 in SnakePattern()
3:56:22Make CreateOrphanage() put a Snake in BedroomA, and darken the light from 5 to 1 in SnakePattern()
3:58:24Watch the snake in BedroomA
🏃
3:58:24Watch the snake in BedroomA
🏃
3:58:24Watch the snake in BedroomA
🏃
3:58:51Darken the light from 1 to 0.25 in SnakePattern()
3:58:51Darken the light from 1 to 0.25 in SnakePattern()
3:58:51Darken the light from 1 to 0.25 in SnakePattern()
3:59:02i_am_seabass I think the glove needs some glowy light emitting particle effects now
🗪
3:59:02i_am_seabass I think the glove needs some glowy light emitting particle effects now
🗪
3:59:02i_am_seabass I think the glove needs some glowy light emitting particle effects now
🗪
3:59:08Watch the snake get stuck in the corner
🏃
3:59:08Watch the snake get stuck in the corner
🏃
3:59:08Watch the snake get stuck in the corner
🏃
3:59:26Make CreateOrphanage() put Snakes in BedroomB and BedroomC
3:59:26Make CreateOrphanage() put Snakes in BedroomB and BedroomC
3:59:26Make CreateOrphanage() put Snakes in BedroomB and BedroomC
3:59:57Our snakes lock up in the corner
🏃
3:59:57Our snakes lock up in the corner
🏃
3:59:57Our snakes lock up in the corner
🏃
4:00:30Prevent CreateOrphanage() from putting snakes in the bedrooms, and make StandardLightingPattern() create dimmer and randomly coloured room lights
4:00:30Prevent CreateOrphanage() from putting snakes in the bedrooms, and make StandardLightingPattern() create dimmer and randomly coloured room lights
4:00:30Prevent CreateOrphanage() from putting snakes in the bedrooms, and make StandardLightingPattern() create dimmer and randomly coloured room lights
4:01:08Admire our fantastic light
🏃
4:01:08Admire our fantastic light
🏃
4:01:08Admire our fantastic light
🏃
4:02:01Plan to fix the overlapped emitter and light probe dimming bug, and maybe bundle our rays
🗩
4:02:01Plan to fix the overlapped emitter and light probe dimming bug, and maybe bundle our rays
🗩
4:02:01Plan to fix the overlapped emitter and light probe dimming bug, and maybe bundle our rays
🗩
4:02:53mindmark42 So we're just ignoring the feedback issue?
🗪
4:02:53mindmark42 So we're just ignoring the feedback issue?
🗪
4:02:53mindmark42 So we're just ignoring the feedback issue?
🗪
4:04:37wylem Is the feedback thing just because the lighting has a temporal element, kind of turning it into a system where you have energy going in each frame and damping from absorption? And if the energy going in exceeds the damping, you get feedback?
🗪
4:04:37wylem Is the feedback thing just because the lighting has a temporal element, kind of turning it into a system where you have energy going in each frame and damping from absorption? And if the energy going in exceeds the damping, you get feedback?
🗪
4:04:37wylem Is the feedback thing just because the lighting has a temporal element, kind of turning it into a system where you have energy going in each frame and damping from absorption? And if the energy going in exceeds the damping, you get feedback?
🗪
4:06:34That's it for today
🗩
4:06:34That's it for today
🗩
4:06:34That's it for today
🗩