Spiral and Blue Noise Distributions on the Sphere

?

?# 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

## 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)

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)

a

w

s

s

d

h
j
k
l

←

↑

↓

↓

→

Esc Close menu / unfocus timestamp

X, ShiftSpace Toggle category and focus previous

v Invert topics / media as per focus

⏫

Previous: 'Removing the CRT from the Win32 Loader'

⏫

0:03Recap and set the stage for the day using sine and cosine to improve the lighting sampling quality

🗩

0:03Recap and set the stage for the day using sine and cosine to improve the lighting sampling quality

🗩

🗩

2:08Run the game to show the debug visualisation of our lighting's hemisphere sampling

🏃

2:08Run the game to show the debug visualisation of our lighting's hemisphere sampling

🏃

2:08Run the game to show the debug visualisation of our lighting's hemisphere sampling

🏃

4:27Describe the hemisphere sampling in ComputeLightPropagation()

📖

4:27Describe the hemisphere sampling in ComputeLightPropagation()

📖

4:27Describe the hemisphere sampling in ComputeLightPropagation()

📖

5:33Hemisphere sample distribution

🖌

5:33Hemisphere sample distribution

🖌

5:33Hemisphere sample distribution

🖌

7:26Run the game to show our hemisphere sampling

🏃

7:26Run the game to show our hemisphere sampling

🏃

7:26Run the game to show our hemisphere sampling

🏃

8:52Begin to change ComputeLightPropagation() to perform spiral sampling^{1}^{,2} of the lighting, as suggested by Kelimion

8:52Begin to change ComputeLightPropagation() to perform spiral sampling^{1}^{,2} of the lighting, as suggested by Kelimion

17:20Change ComputeLightPropagation() to use polar coordinates for our randomly sampled hemisphere

17:20Change ComputeLightPropagation() to use polar coordinates for our randomly sampled hemisphere

17:20Change ComputeLightPropagation() to use polar coordinates for our randomly sampled hemisphere

18:29Run the game to see our hemisphere sampling

🏃

18:29Run the game to see our hemisphere sampling

🏃

18:29Run the game to see our hemisphere sampling

🏃

18:50Change ComputeLightPropagation() to produce spiral sampling around a sphere^{3} with a note about Vogel's method^{4}

18:50Change ComputeLightPropagation() to produce spiral sampling around a sphere^{3} with a note about Vogel's method^{4}

29:53Run the game to see the sample distribution

🏃

29:53Run the game to see the sample distribution

🏃

29:53Run the game to see the sample distribution

🏃

30:13Increase the sample count from 16 to 64 in ComputeLightPropagation()

30:13Increase the sample count from 16 to 64 in ComputeLightPropagation()

30:13Increase the sample count from 16 to 64 in ComputeLightPropagation()

30:25Run the game to see the nice covering of the sphere

🏃

30:25Run the game to see the nice covering of the sphere

🏃

30:25Run the game to see the nice covering of the sphere

🏃

30:49Make ComputeLightPropagation() produce hemispherical data

30:49Make ComputeLightPropagation() produce hemispherical data

30:49Make ComputeLightPropagation() produce hemispherical data

31:24Run the game to see the hemispherical data

🏃

31:24Run the game to see the hemispherical data

🏃

31:24Run the game to see the hemispherical data

🏃

32:01Reduce the sample count back to 16 and randomly jitter them in ComputeLightPropagation()

32:01Reduce the sample count back to 16 and randomly jitter them in ComputeLightPropagation()

32:01Reduce the sample count back to 16 and randomly jitter them in ComputeLightPropagation()

33:50Run the game to see that this is back to being clumpy

🏃

33:50Run the game to see that this is back to being clumpy

🏃

33:50Run the game to see that this is back to being clumpy

🏃

34:04Try to alleviate the clumpiness in ComputeLightPropagation()

34:04Try to alleviate the clumpiness in ComputeLightPropagation()

34:04Try to alleviate the clumpiness in ComputeLightPropagation()

36:05Run the game to see the varying samples

🏃

36:05Run the game to see the varying samples

🏃

36:05Run the game to see the varying samples

🏃

36:53Make ComputeLightPropagation() only randomise the Rho value

36:53Make ComputeLightPropagation() only randomise the Rho value

36:53Make ComputeLightPropagation() only randomise the Rho value

37:33Run the game to see this coverage

🏃

37:33Run the game to see this coverage

🏃

37:33Run the game to see this coverage

🏃

37:40Make ComputeLightPropagation() use one randomised RhoOffset for the whole sphere

37:40Make ComputeLightPropagation() use one randomised RhoOffset for the whole sphere

37:40Make ComputeLightPropagation() use one randomised RhoOffset for the whole sphere

38:48Run the game to see this coverage

🏃

38:48Run the game to see this coverage

🏃

38:48Run the game to see this coverage

🏃

38:55Let ComputeLightPropagation() run the sampling over 20 frames for us to visualise the coverage

38:55Let ComputeLightPropagation() run the sampling over 20 frames for us to visualise the coverage

38:55Let ComputeLightPropagation() run the sampling over 20 frames for us to visualise the coverage

39:56Run the game to see this extended coverage

🏃

39:56Run the game to see this extended coverage

🏃

39:56Run the game to see this extended coverage

🏃

40:26Make ComputeLightPropagation() multiple Theta, rather than Tau, in to the RhoOffset

40:26Make ComputeLightPropagation() multiple Theta, rather than Tau, in to the RhoOffset

40:26Make ComputeLightPropagation() multiple Theta, rather than Tau, in to the RhoOffset

40:46Run the game to see this extended coverage

🏃

40:46Run the game to see this extended coverage

🏃

40:46Run the game to see this extended coverage

🏃

41:09Change ComputeLightPropagation() to jitter the 64 points sampling more fairly

41:09Change ComputeLightPropagation() to jitter the 64 points sampling more fairly

41:09Change ComputeLightPropagation() to jitter the 64 points sampling more fairly

42:50Run the game to see this jittered coverage

🏃

42:50Run the game to see this jittered coverage

🏃

42:50Run the game to see this jittered coverage

🏃

43:01Make ComputeLightPropagation() jitter the i value

43:01Make ComputeLightPropagation() jitter the i value

43:01Make ComputeLightPropagation() jitter the i value

43:29Run the game to see this coverage biasing towards the spiral

🏃

43:29Run the game to see this coverage biasing towards the spiral

🏃

43:29Run the game to see this coverage biasing towards the spiral

🏃

44:48Make ComputeLightPropagation() jitter the normal of each ray

44:48Make ComputeLightPropagation() jitter the normal of each ray

44:48Make ComputeLightPropagation() jitter the normal of each ray

46:18Run the game to see this distribution

🏃

46:18Run the game to see this distribution

🏃

46:18Run the game to see this distribution

🏃

47:19Make ComputeLightPropagation() bias the distribution towards upwards

47:19Make ComputeLightPropagation() bias the distribution towards upwards

47:19Make ComputeLightPropagation() bias the distribution towards upwards

49:02Run the game to see this more upwards facing distribution, and consider how to concentrate the samples at the top

🏃

49:02Run the game to see this more upwards facing distribution, and consider how to concentrate the samples at the top

🏃

🏃

52:01Make ComputeLightPropagation() produce a handwritten distribution of 64 points

52:01Make ComputeLightPropagation() produce a handwritten distribution of 64 points

52:01Make ComputeLightPropagation() produce a handwritten distribution of 64 points

56:49Run the game to see this distribution, tweaking the MinimumDistanceSq until we crash

🏃

🖮

56:49Run the game to see this distribution, tweaking the MinimumDistanceSq until we crash

🏃

🖮

56:49Run the game to see this distribution, tweaking the MinimumDistanceSq until we crash

🏃

🖮

57:17Make ComputeLightPropagation set MinimumDistanceSq to 0.25²

57:17Make ComputeLightPropagation set MinimumDistanceSq to 0.25²

57:17Make ComputeLightPropagation set MinimumDistanceSq to 0.25²

57:28Run the game see to see our uniformly covered sphere

🏃

🖮

57:28Run the game see to see our uniformly covered sphere

🏃

🖮

57:28Run the game see to see our uniformly covered sphere

🏃

🖮

57:45Make ComputeLightPropagation() concentrate our distribution towards the top

57:45Make ComputeLightPropagation() concentrate our distribution towards the top

57:45Make ComputeLightPropagation() concentrate our distribution towards the top

1:03:23Run the game to see our tighter distribution

🏃

🖮

1:03:23Run the game to see our tighter distribution

🏃

🖮

1:03:23Run the game to see our tighter distribution

🏃

🖮

1:03:34Let ComputeLightPropagation() run the sampling over 20 frames for us to visualise the coverage

1:03:34Let ComputeLightPropagation() run the sampling over 20 frames for us to visualise the coverage

1:04:12Run the game to see this extended coverage, and consider how to produce bundles of 4 points, accounting for the spread

🏃

1:04:12Run the game to see this extended coverage, and consider how to produce bundles of 4 points, accounting for the spread

🏃

🏃

1:06:12Euclidean straight-line vs "great arc" parabolic distance

🖌

1:06:12Euclidean straight-line vs "great arc" parabolic distance

🖌

1:06:12Euclidean straight-line vs "great arc" parabolic distance

🖌

1:08:17Change ComputeLightPropagation() to distribute the sampling points by their parabolic rather than straight-line distance

1:08:17Change ComputeLightPropagation() to distribute the sampling points by their parabolic rather than straight-line distance

1:22:50Run the game to see our extended parabolic distribution

🏃

1:22:50Run the game to see our extended parabolic distribution

🏃

1:22:50Run the game to see our extended parabolic distribution

🏃

1:22:59Make ComputeLightPropagation() jitter our randomly distributed sampling points over 20 frames

1:22:59Make ComputeLightPropagation() jitter our randomly distributed sampling points over 20 frames

1:22:59Make ComputeLightPropagation() jitter our randomly distributed sampling points over 20 frames

1:25:41Run the game to see the random patches

🏃

1:25:41Run the game to see the random patches

🏃

1:25:41Run the game to see the random patches

🏃

1:26:09Make ComputeLightPropagation() concentrate the points towards the top

1:26:09Make ComputeLightPropagation() concentrate the points towards the top

1:26:09Make ComputeLightPropagation() concentrate the points towards the top

1:28:10Run the game to see our distribution, and consider distributing all 64 separately

🏃

1:28:10Run the game to see our distribution, and consider distributing all 64 separately

🏃

1:28:10Run the game to see our distribution, and consider distributing all 64 separately

🏃

1:28:19Make ComputeLightPropagation() distribute all 64 points unbundled

1:28:19Make ComputeLightPropagation() distribute all 64 points unbundled

1:28:19Make ComputeLightPropagation() distribute all 64 points unbundled

1:31:15Run the game to see our 64 distributed points

🏃

1:31:15Run the game to see our 64 distributed points

🏃

1:31:15Run the game to see our 64 distributed points

🏃

1:33:19Q&A

🗩

1:33:19Q&A

🗩

1:33:19Q&A

🗩

1:35:39Lateral distribution

🖌

1:35:39Lateral distribution

🖌

1:35:39Lateral distribution

🖌

1:38:02Consider doing quadrant-based distribution

🗩

1:38:02Consider doing quadrant-based distribution

🗩

1:38:02Consider doing quadrant-based distribution

🗩

1:41:53Step in to the asm of rand() from the CRT^{5}

🏃

1:41:53Step in to the asm of rand() from the CRT^{5}

🏃

1:41:53Step in to the asm of rand() from the CRT^{5}

🏃

1:45:54Point out the blue noise graph in 'The Color of Noise'^{6}

📖

1:45:54Point out the blue noise graph in 'The Color of Noise'^{6}

📖

1:45:54Point out the blue noise graph in 'The Color of Noise'^{6}

📖

1:47:23Wrap things up

🗩

1:47:23Wrap things up

🗩

1:47:23Wrap things up

🗩

⏬

Next: 'Switching to Precomputed Hemisphere Distributions'

⏬