Handmade Hero»Episode Guide
Analyzing the Diffuse Blur
?
?

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:02Recap and set the stage for the day
🗩
0:02Recap and set the stage for the day
🗩
0:02Recap and set the stage for the day
🗩
0:40Demo the lighting with different resolution spatial and lighting grids
🏃
0:40Demo the lighting with different resolution spatial and lighting grids
🏃
0:40Demo the lighting with different resolution spatial and lighting grids
🏃
2:22Determine to optimise the lighting pipeline, and work on quality, smoothing out the rectilinear pattern and reducing flicker
🏃
2:22Determine to optimise the lighting pipeline, and work on quality, smoothing out the rectilinear pattern and reducing flicker
🏃
2:22Determine to optimise the lighting pipeline, and work on quality, smoothing out the rectilinear pattern and reducing flicker
🏃
5:02Determine to compile at least the lighting in clang, to gauge the SIMD performance
🏃
5:02Determine to compile at least the lighting in clang, to gauge the SIMD performance
🏃
5:02Determine to compile at least the lighting in clang, to gauge the SIMD performance
🏃
6:50How the ABI works on Microsoft Windows, in terms of register use
🗩
6:50How the ABI works on Microsoft Windows, in terms of register use
🗩
6:50How the ABI works on Microsoft Windows, in terms of register use
🗩
10:01On the possible work getting the code to compile with clang, including its exploitation of undefined behaviour
🗩
10:01On the possible work getting the code to compile with clang, including its exploitation of undefined behaviour
🗩
10:01On the possible work getting the code to compile with clang, including its exploitation of undefined behaviour
🗩
13:46hhlightprof total seconds elapsed: 4.221848
🏃
13:46hhlightprof total seconds elapsed: 4.221848
🏃
13:46hhlightprof total seconds elapsed: 4.221848
🏃
13:52Determine to optimise the diffuse blur
📖
13:52Determine to optimise the diffuse blur
📖
13:52Determine to optimise the diffuse blur
📖
14:31Toggle off the diffuse blur in ComputeLightPropagationWork()
14:31Toggle off the diffuse blur in ComputeLightPropagationWork()
14:31Toggle off the diffuse blur in ComputeLightPropagationWork()
14:50hhlightprof total seconds elapsed: 3.233531
🏃
14:50hhlightprof total seconds elapsed: 3.233531
🏃
14:50hhlightprof total seconds elapsed: 3.233531
🏃
15:15Briefly describe our diffuse blur in ComputeLightPropagationWork()
📖
15:15Briefly describe our diffuse blur in ComputeLightPropagationWork()
📖
15:15Briefly describe our diffuse blur in ComputeLightPropagationWork()
📖
15:59"Seperable" Filters
🖌
15:59"Seperable" Filters
🖌
15:59"Seperable" Filters
🖌
18:55Example filter: Linear blend
🖌
18:55Example filter: Linear blend
🖌
18:55Example filter: Linear blend
🖌
23:53Example filter: Bilinear blend
🖌
23:53Example filter: Bilinear blend
🖌
23:53Example filter: Bilinear blend
🖌
27:20Example seperable filter: two-pass, one-dimensional blends
🖌
27:20Example seperable filter: two-pass, one-dimensional blends
🖌
27:20Example seperable filter: two-pass, one-dimensional blends
🖌
29:16Get some tissues
🗹
29:16Get some tissues
🗹
29:16Get some tissues
🗹
30:01Return with tissues
🗹
30:01Return with tissues
🗹
30:01Return with tissues
🗹
30:20Our current cosine-weighted falloff equation
🖌
30:20Our current cosine-weighted falloff equation
🖌
30:20Our current cosine-weighted falloff equation
🖌
35:47Walk through UnitVectorFromOctahedral()
📖
35:47Walk through UnitVectorFromOctahedral()
📖
35:47Walk through UnitVectorFromOctahedral()
📖
37:38Determine to print the weight map table
📖
37:38Determine to print the weight map table
📖
37:38Determine to print the weight map table
📖
39:11Regular tea break
🗹
39:11Regular tea break
🗹
39:11Regular tea break
🗹
40:06Return with the realisation that we're at risk of infringing Jon Blow's on-stream tea-making patent
🗹
40:06Return with the realisation that we're at risk of infringing Jon Blow's on-stream tea-making patent
🗹
40:06Return with the realisation that we're at risk of infringing Jon Blow's on-stream tea-making patent
🗹
40:27Make ProfileRun() print the DiffuseWeightMap to stdout
40:27Make ProfileRun() print the DiffuseWeightMap to stdout
40:27Make ProfileRun() print the DiffuseWeightMap to stdout
46:29hhlightprof DiffuseWeightMap: Many 0s
🏃
46:29hhlightprof DiffuseWeightMap: Many 0s
🏃
46:29hhlightprof DiffuseWeightMap: Many 0s
🏃
46:51Reacquaint ourselves with the use of DiffuseWeightMap in ComputeLightPropagationWork
📖
46:51Reacquaint ourselves with the use of DiffuseWeightMap in ComputeLightPropagationWork
📖
46:51Reacquaint ourselves with the use of DiffuseWeightMap in ComputeLightPropagationWork
📖
48:46Make ProfileRun() print out the DiffuseWeightMap, based on BuildDiffuseLightMaps()
48:46Make ProfileRun() print out the DiffuseWeightMap, based on BuildDiffuseLightMaps()
48:46Make ProfileRun() print out the DiffuseWeightMap, based on BuildDiffuseLightMaps()
51:56hhlightprof DiffuseWeightMap: Sensibly populated
🏃
51:56hhlightprof DiffuseWeightMap: Sensibly populated
🏃
51:56hhlightprof DiffuseWeightMap: Sensibly populated
🏃
52:20Make ProfileRun() print dashes when the Entry is 0
52:20Make ProfileRun() print dashes when the Entry is 0
52:20Make ProfileRun() print dashes when the Entry is 0
52:49hhlightprof DiffuseWeightMap: More visible shape
🏃
52:49hhlightprof DiffuseWeightMap: More visible shape
🏃
52:49hhlightprof DiffuseWeightMap: More visible shape
🏃
53:10Regular tea break
🗹
53:10Regular tea break
🗹
53:10Regular tea break
🗹
54:40Return, with the tea now steeping
🗹
54:40Return, with the tea now steeping
🗹
54:40Return, with the tea now steeping
🗹
54:45Analyse the DiffuseWeightMap printout for reused values
📖
54:45Analyse the DiffuseWeightMap printout for reused values
📖
54:45Analyse the DiffuseWeightMap printout for reused values
📖
58:43Approaches to making the cosine falloff seperable: 1) Produce a somewhat similar, but regular pattern; 2) Classify values by their position
📖
58:43Approaches to making the cosine falloff seperable: 1) Produce a somewhat similar, but regular pattern; 2) Classify values by their position
📖
58:43Approaches to making the cosine falloff seperable: 1) Produce a somewhat similar, but regular pattern; 2) Classify values by their position
📖
59:32There's the tea
🗹
59:32There's the tea
🗹
59:32There's the tea
🗹
1:00:17Return and pour the tea
🗹
1:00:17Return and pour the tea
🗹
1:00:17Return and pour the tea
🗹
1:00:50Try making ProfileRun() print out the DiffuseWeightMap 16×16, to see the shape when it wraps
1:00:50Try making ProfileRun() print out the DiffuseWeightMap 16×16, to see the shape when it wraps
1:00:50Try making ProfileRun() print out the DiffuseWeightMap 16×16, to see the shape when it wraps
1:02:03hhlightprof DiffuseWeightMap: 16×16 shapes, and identical rows between maps
🏃
1:02:03hhlightprof DiffuseWeightMap: 16×16 shapes, and identical rows between maps
🏃
1:02:03hhlightprof DiffuseWeightMap: 16×16 shapes, and identical rows between maps
🏃
1:05:17Consider changing the cosine falloff function to a basic blur
📖
1:05:17Consider changing the cosine falloff function to a basic blur
📖
1:05:17Consider changing the cosine falloff function to a basic blur
📖
1:06:28Accidentally add a threshold of 0.01f to BuildDiffuseLightMaps()
1:06:28Accidentally add a threshold of 0.01f to BuildDiffuseLightMaps()
1:06:28Accidentally add a threshold of 0.01f to BuildDiffuseLightMaps()
1:07:20hhlightprof DiffuseWeightMap: Without threshold
🏃
1:07:20hhlightprof DiffuseWeightMap: Without threshold
🏃
1:07:20hhlightprof DiffuseWeightMap: Without threshold
🏃
1:07:38Add a threshold to the DiffuseWeightMap printout
1:07:38Add a threshold to the DiffuseWeightMap printout
1:07:38Add a threshold to the DiffuseWeightMap printout
1:08:13hhlightprof DiffuseWeightMap: Still without threshold
🏃
1:08:13hhlightprof DiffuseWeightMap: Still without threshold
🏃
1:08:13hhlightprof DiffuseWeightMap: Still without threshold
🏃
1:08:24Eyeball ProfileRun() for threshold bugs
📖
1:08:24Eyeball ProfileRun() for threshold bugs
📖
1:08:24Eyeball ProfileRun() for threshold bugs
📖
1:09:52Step in to ProfileRun() and inspect W
🏃
1:09:52Step in to ProfileRun() and inspect W
🏃
1:09:52Step in to ProfileRun() and inspect W
🏃
1:10:35Fix the DiffuseWeightMap printout threshold in ProfileRun()
1:10:35Fix the DiffuseWeightMap printout threshold in ProfileRun()
1:10:35Fix the DiffuseWeightMap printout threshold in ProfileRun()
1:11:25hhlightprof DiffuseWeightMap: With threshold, blank columns
🏃
1:11:25hhlightprof DiffuseWeightMap: With threshold, blank columns
🏃
1:11:25hhlightprof DiffuseWeightMap: With threshold, blank columns
🏃
1:13:45Try various thresholds for the DiffuseWeightMap printout
🏃
🖮
1:13:45Try various thresholds for the DiffuseWeightMap printout
🏃
🖮
1:13:45Try various thresholds for the DiffuseWeightMap printout
🏃
🖮
1:14:54Make ProfileRun() print out the DiffuseWeightMap 8×8
1:14:54Make ProfileRun() print out the DiffuseWeightMap 8×8
1:14:54Make ProfileRun() print out the DiffuseWeightMap 8×8
1:15:05hhlightprof DiffuseWeightMap: 8×8 shapes, with threshold
🏃
1:15:05hhlightprof DiffuseWeightMap: 8×8 shapes, with threshold
🏃
1:15:05hhlightprof DiffuseWeightMap: 8×8 shapes, with threshold
🏃
1:15:47Make ProfileRun() print out the X, Y and Z directions of a DiffuseWeightMap Element
1:15:47Make ProfileRun() print out the X, Y and Z directions of a DiffuseWeightMap Element
1:15:47Make ProfileRun() print out the X, Y and Z directions of a DiffuseWeightMap Element
1:18:15hhlightprof DiffuseWeightMap: Element directions
🏃
1:18:15hhlightprof DiffuseWeightMap: Element directions
🏃
1:18:15hhlightprof DiffuseWeightMap: Element directions
🏃
1:18:42Make ProfileRun() add a dash to its 0 printout
1:18:42Make ProfileRun() add a dash to its 0 printout
1:18:42Make ProfileRun() add a dash to its 0 printout
1:18:56hhlightprof DiffuseWeightMap: Element directions, completely symmetric
🏃
1:18:56hhlightprof DiffuseWeightMap: Element directions, completely symmetric
🏃
1:18:56hhlightprof DiffuseWeightMap: Element directions, completely symmetric
🏃
1:22:35Our cosine falloff equation, and its reusable terms
🖌
1:22:35Our cosine falloff equation, and its reusable terms
🖌
1:22:35Our cosine falloff equation, and its reusable terms
🖌
1:31:53Rephrasing the DiffuseWeightMap generation in a seperable way
🖌
1:31:53Rephrasing the DiffuseWeightMap generation in a seperable way
🖌
1:31:53Rephrasing the DiffuseWeightMap generation in a seperable way
🖌
1:40:28Determine to ruminate on the DiffuseWeightMap
📖
1:40:28Determine to ruminate on the DiffuseWeightMap
📖
1:40:28Determine to ruminate on the DiffuseWeightMap
📖
1:40:55Q&A
🗩
1:40:55Q&A
🗩
1:40:55Q&A
🗩
1:41:35mindmark42 Q: Couldn't at least the tetrahedron unit vector function use a lookup table and lerp?
🗪
1:41:35mindmark42 Q: Couldn't at least the tetrahedron unit vector function use a lookup table and lerp?
🗪
1:41:35mindmark42 Q: Couldn't at least the tetrahedron unit vector function use a lookup table and lerp?
🗪
1:42:38mindmark42 Q: Speed up that function, if it gets called a lot
🗪
1:42:38mindmark42 Q: Speed up that function, if it gets called a lot
🗪
1:42:38mindmark42 Q: Speed up that function, if it gets called a lot
🗪
1:43:47Toggle on the diffuse blur in ComputeLightPropagationWork()
1:43:47Toggle on the diffuse blur in ComputeLightPropagationWork()
1:43:47Toggle on the diffuse blur in ComputeLightPropagationWork()
1:43:52Our desire to do the cosine falloff seperable, if we can
📖
1:43:52Our desire to do the cosine falloff seperable, if we can
📖
1:43:52Our desire to do the cosine falloff seperable, if we can
📖
1:45:21Wrap it up
🗩
1:45:21Wrap it up
🗩
1:45:21Wrap it up
🗩