Handmade Hero»Episode Guide
Adding Octahedral Light Atlases
?
?

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:04Recap last stream's Octahedral Encoding paper research and set the stage for the day
🗩
0:04Recap last stream's Octahedral Encoding paper research and set the stage for the day
🗩
0:04Recap last stream's Octahedral Encoding paper research and set the stage for the day
🗩
1:58Consider Octahedral Encoding: Texture Array vs Atlas1
📖
1:58Consider Octahedral Encoding: Texture Array vs Atlas1
📖
1:58Consider Octahedral Encoding: Texture Array vs Atlas1
📖
7:03Skim read 'Dynamic Diffuse Global Illumination with Ray-Traced Irradiance Fields'2
📖
7:03Skim read 'Dynamic Diffuse Global Illumination with Ray-Traced Irradiance Fields'2
📖
7:03Skim read 'Dynamic Diffuse Global Illumination with Ray-Traced Irradiance Fields'2
📖
10:55Consult IrradianceField.cpp from the Code and Video supplement of 'Dynamic Diffuse Global Illumination with Ray-Traced Irradiance Fields'3
📖
10:55Consult IrradianceField.cpp from the Code and Video supplement of 'Dynamic Diffuse Global Illumination with Ray-Traced Irradiance Fields'3
📖
10:55Consult IrradianceField.cpp from the Code and Video supplement of 'Dynamic Diffuse Global Illumination with Ray-Traced Irradiance Fields'3
📖
14:16Embark on Octahedral Encoding: 1) Setup Texture Atlas; 2) Draw Texture Atlas; 3) Place Octahedral Unwrapped Quads into the World
🗩
14:16Embark on Octahedral Encoding: 1) Setup Texture Atlas; 2) Draw Texture Atlas; 3) Place Octahedral Unwrapped Quads into the World
🗩
14:16Embark on Octahedral Encoding: 1) Setup Texture Atlas; 2) Draw Texture Atlas; 3) Place Octahedral Unwrapped Quads into the World
🗩
16:39Build and run the game
🏃
16:39Build and run the game
🏃
16:39Build and run the game
🏃
16:56Augment open_gl with LightAtlasHandle
16:56Augment open_gl with LightAtlasHandle
16:56Augment open_gl with LightAtlasHandle
19:18Note the use of depth textures in 'Dynamic Diffuse Global Illumination with Ray-Traced Irradiance Fields'4
📖
19:18Note the use of depth textures in 'Dynamic Diffuse Global Illumination with Ray-Traced Irradiance Fields'4
📖
19:18Note the use of depth textures in 'Dynamic Diffuse Global Illumination with Ray-Traced Irradiance Fields'4
📖
22:03Modify open_gl replacing the texture array with Color and Depth texture atlases for Octahedral Encoding
22:03Modify open_gl replacing the texture array with Color and Depth texture atlases for Octahedral Encoding
22:03Modify open_gl replacing the texture array with Color and Depth texture atlases for Octahedral Encoding
27:33Consider our Octahedral Texture Atlas storage in open_gl
27:33Consider our Octahedral Texture Atlas storage in open_gl
27:33Consider our Octahedral Texture Atlas storage in open_gl
28:45Update OpenGLInit() to set up our new Octahedral Texture Atlases
28:45Update OpenGLInit() to set up our new Octahedral Texture Atlases
28:45Update OpenGLInit() to set up our new Octahedral Texture Atlases
31:14Calculate the storage (and GPU-submission) requirements of our Octahedral Texture Atlas: 32^3*10^2*4 = 13,107,200 bytes
🗹
31:14Calculate the storage (and GPU-submission) requirements of our Octahedral Texture Atlas: 32^3*10^2*4 = 13,107,200 bytes
🗹
31:14Calculate the storage (and GPU-submission) requirements of our Octahedral Texture Atlas: 32^3*10^2*4 = 13,107,200 bytes
🗹
35:31Continue updating OpenGLInit() to set up our Octahedral Texture Atlases5
35:31Continue updating OpenGLInit() to set up our Octahedral Texture Atlases5
35:31Continue updating OpenGLInit() to set up our Octahedral Texture Atlases5
39:52Update OpenGLBeginFrame() and game_render_commands in line with our new Octahedral Texture Atlases
39:52Update OpenGLBeginFrame() and game_render_commands in line with our new Octahedral Texture Atlases
39:52Update OpenGLBeginFrame() and game_render_commands in line with our new Octahedral Texture Atlases
41:21Update OpenGLEndFrame() to bind and use our new Octahedral Texture Atlases, doubling the X dimension
41:21Update OpenGLEndFrame() to bind and use our new Octahedral Texture Atlases, doubling the X dimension
41:21Update OpenGLEndFrame() to bind and use our new Octahedral Texture Atlases, doubling the X dimension
47:43Set up CompileZBiasProgram() to use our new Octahedral Texture Atlases
47:43Set up CompileZBiasProgram() to use our new Octahedral Texture Atlases
47:43Set up CompileZBiasProgram() to use our new Octahedral Texture Atlases
51:26Update EndLightingComputation() in line with our new Octahedral Texture Atlases
51:26Update EndLightingComputation() in line with our new Octahedral Texture Atlases
51:26Update EndLightingComputation() in line with our new Octahedral Texture Atlases
51:56Hit OpenGL Error "GL_INVALID_ENUM"
🏃
51:56Hit OpenGL Error "GL_INVALID_ENUM"
🏃
51:56Hit OpenGL Error "GL_INVALID_ENUM"
🏃
53:15Fix GL_TEXTURE_3D to GL_TEXTURE_2D in OpenGLInit()
53:15Fix GL_TEXTURE_3D to GL_TEXTURE_2D in OpenGLInit()
53:15Fix GL_TEXTURE_3D to GL_TEXTURE_2D in OpenGLInit()
54:04Hit OpenGL Error "GL_INVALID_ENUM"
🏃
54:04Hit OpenGL Error "GL_INVALID_ENUM"
🏃
54:04Hit OpenGL Error "GL_INVALID_ENUM"
🏃
54:48Fix GL_R to GL_RED in OpenGLInit()
54:48Fix GL_R to GL_RED in OpenGLInit()
54:48Fix GL_R to GL_RED in OpenGLInit()
54:58Hit exception "Access violation reading location"
🏃
54:58Hit exception "Access violation reading location"
🏃
54:58Hit exception "Access violation reading location"
🏃
55:41Step through to OpenGLEndFrame()
🏃
55:41Step through to OpenGLEndFrame()
🏃
55:41Step through to OpenGLEndFrame()
🏃
57:13Fix OpenGLEndFrame() to pass GL_RED rather than (the larger) GL_RGB to glTexSubImage2D()
57:13Fix OpenGLEndFrame() to pass GL_RED rather than (the larger) GL_RGB to glTexSubImage2D()
57:13Fix OpenGLEndFrame() to pass GL_RED rather than (the larger) GL_RGB to glTexSubImage2D()
57:34Run the game without lighting, with the determination to output standard spherical lighting into octahedrons
🏃
57:34Run the game without lighting, with the determination to output standard spherical lighting into octahedrons
🏃
57:34Run the game without lighting, with the determination to output standard spherical lighting into octahedrons
🏃
58:30Introduce OctahedralFromUnitVector() and UnitVectorFromOctahedral()
58:30Introduce OctahedralFromUnitVector() and UnitVectorFromOctahedral()
58:30Introduce OctahedralFromUnitVector() and UnitVectorFromOctahedral()
1:04:31Explain the Octahedral wrap / unwrap6
📖
1:04:31Explain the Octahedral wrap / unwrap6
📖
1:04:31Explain the Octahedral wrap / unwrap6
📖
1:05:55Continue to implement OctahedralFromUnitVector() and UnitVectorFromOctahedral()7
📖
1:05:55Continue to implement OctahedralFromUnitVector() and UnitVectorFromOctahedral()7
📖
1:05:55Continue to implement OctahedralFromUnitVector() and UnitVectorFromOctahedral()7
📖
1:11:50Octahedral to Unit
🖌
1:11:50Octahedral to Unit
🖌
1:11:50Octahedral to Unit
🖌
1:17:25Solving the Octahedral to Unit equation
🖌
1:17:25Solving the Octahedral to Unit equation
🖌
1:17:25Solving the Octahedral to Unit equation
🖌
1:20:28Understanding the Octahedral to Unit mapping diagrammatically
🖌
1:20:28Understanding the Octahedral to Unit mapping diagrammatically
🖌
1:20:28Understanding the Octahedral to Unit mapping diagrammatically
🖌
1:24:12How to solve the Octahedral to Unit equation if we know Oz²
🖌
1:24:12How to solve the Octahedral to Unit equation if we know Oz²
🖌
1:24:12How to solve the Octahedral to Unit equation if we know Oz²
🖌
1:26:17Finish implementing UnitVectorFromOctahedral()
1:26:17Finish implementing UnitVectorFromOctahedral()
1:26:17Finish implementing UnitVectorFromOctahedral()
1:31:55Check our implementation with 'Dynamic Diffuse Global Illumination with Ray-Traced Irradiance Fields'8
📖
1:31:55Check our implementation with 'Dynamic Diffuse Global Illumination with Ray-Traced Irradiance Fields'8
📖
1:31:55Check our implementation with 'Dynamic Diffuse Global Illumination with Ray-Traced Irradiance Fields'8
📖
1:33:26Fix the swizzle in UnitVectorFromOctahedral() in line with 'Dynamic Diffuse Global Illumination with Ray-Traced Irradiance Fields'9
1:33:26Fix the swizzle in UnitVectorFromOctahedral() in line with 'Dynamic Diffuse Global Illumination with Ray-Traced Irradiance Fields'9
1:33:26Fix the swizzle in UnitVectorFromOctahedral() in line with 'Dynamic Diffuse Global Illumination with Ray-Traced Irradiance Fields'9
1:34:55Modify light_voxel_cell for Octahedral Encoding
1:34:55Modify light_voxel_cell for Octahedral Encoding
1:34:55Modify light_voxel_cell for Octahedral Encoding
1:38:02Stub out ComputeVoxelIrradianceAt(), SpamVoxelSlice(), GetLightAmount() and EndLightingComputation() for Octahedral Encoding
1:38:02Stub out ComputeVoxelIrradianceAt(), SpamVoxelSlice(), GetLightAmount() and EndLightingComputation() for Octahedral Encoding
1:38:02Stub out ComputeVoxelIrradianceAt(), SpamVoxelSlice(), GetLightAmount() and EndLightingComputation() for Octahedral Encoding
1:41:41Toggle to TEST_LIGHT_SPHERE in EndLightingComputation() and implement that path for Octahedral Encoding
1:41:41Toggle to TEST_LIGHT_SPHERE in EndLightingComputation() and implement that path for Octahedral Encoding
1:41:41Toggle to TEST_LIGHT_SPHERE in EndLightingComputation() and implement that path for Octahedral Encoding
1:57:02Run the game
🏃
1:57:02Run the game
🏃
1:57:02Run the game
🏃
1:57:48Capture a frame in RenderDoc
🏃
1:57:48Capture a frame in RenderDoc
🏃
1:57:48Capture a frame in RenderDoc
🏃
2:01:14Fix the ElIndexC and ElIndexD computations in EndLightingComputation()
2:01:14Fix the ElIndexC and ElIndexD computations in EndLightingComputation()
2:01:14Fix the ElIndexC and ElIndexD computations in EndLightingComputation()
2:05:10Capture a frame in RenderDoc
🏃
2:05:10Capture a frame in RenderDoc
🏃
2:05:10Capture a frame in RenderDoc
🏃
2:06:14Q&A
🗩
2:06:14Q&A
🗩
2:06:14Q&A
🗩
2:06:49somebody_took_my_name Q: Quick note, you overwrite the x value which is used for the y value with encoding / decoding octahedrals
🗪
2:06:49somebody_took_my_name Q: Quick note, you overwrite the x value which is used for the y value with encoding / decoding octahedrals
🗪
2:06:49somebody_took_my_name Q: Quick note, you overwrite the x value which is used for the y value with encoding / decoding octahedrals
🗪
2:07:01Fix UnitVectorFromOctahedral() to use O.x and O.y in the Ox and Oy settings
2:07:01Fix UnitVectorFromOctahedral() to use O.x and O.y in the Ox and Oy settings
2:07:01Fix UnitVectorFromOctahedral() to use O.x and O.y in the Ox and Oy settings
2:07:35somebody_took_my_name And I think the Oz doesn't need to be negated in the UnitVectorFromOctahedral() function
🗪
2:07:35somebody_took_my_name And I think the Oz doesn't need to be negated in the UnitVectorFromOctahedral() function
🗪
2:07:35somebody_took_my_name And I think the Oz doesn't need to be negated in the UnitVectorFromOctahedral() function
🗪
2:08:58somebody_took_my_name Q: Does it always have to be positive?
🗪
2:08:58somebody_took_my_name Q: Does it always have to be positive?
🗪
2:08:58somebody_took_my_name Q: Does it always have to be positive?
🗪
2:09:23Fix UnitVectorFromOctahedral() to set the Result from Ox, Oy and Oz
2:09:23Fix UnitVectorFromOctahedral() to set the Result from Ox, Oy and Oz
2:09:23Fix UnitVectorFromOctahedral() to set the Result from Ox, Oy and Oz
2:09:31Fix OctahedralFromUnitVector() to compute Ox and Oy as temporary variables
2:09:31Fix OctahedralFromUnitVector() to compute Ox and Oy as temporary variables
2:09:31Fix OctahedralFromUnitVector() to compute Ox and Oy as temporary variables
2:10:18howdydutty Q: If 1 - SumXY is less than 0, then Oz would already be negative
🗪
2:10:18howdydutty Q: If 1 - SumXY is less than 0, then Oz would already be negative
🗪
2:10:18howdydutty Q: If 1 - SumXY is less than 0, then Oz would already be negative
🗪
2:10:49Prevent UnitVectorFromOctahedral() from negating Oz
2:10:49Prevent UnitVectorFromOctahedral() from negating Oz
2:10:49Prevent UnitVectorFromOctahedral() from negating Oz
2:11:13sagian2005 Q: Reference code10 uses a "signNotZero" function instead of "signOf"
🗪
2:11:13sagian2005 Q: Reference code10 uses a "signNotZero" function instead of "signOf"
🗪
2:11:13sagian2005 Q: Reference code10 uses a "signNotZero" function instead of "signOf"
🗪
2:12:00xxthebigfoxx Q: I think you have a typo on the Trilerp code where you index by [Ty][Ty] and [Tx][Tx] instead of [Ty][Tx] in both places
🗪
2:12:00xxthebigfoxx Q: I think you have a typo on the Trilerp code where you index by [Ty][Ty] and [Tx][Tx] instead of [Ty][Tx] in both places
🗪
2:12:00xxthebigfoxx Q: I think you have a typo on the Trilerp code where you index by [Ty][Ty] and [Tx][Tx] instead of [Ty][Tx] in both places
🗪
2:12:17sagian2005 Q: But it's returning positive for 0
🗪
2:12:17sagian2005 Q: But it's returning positive for 0
🗪
2:12:17sagian2005 Q: But it's returning positive for 0
🗪
2:12:33sagian2005 Q: It should return 0 for 011
🗪
2:12:33sagian2005 Q: It should return 0 for 011
🗪
2:12:33sagian2005 Q: It should return 0 for 011
🗪
2:15:22xxthebigfoxx Q: I think you have a typo on the Trilerp code where you index by [Ty][Ty] and [Tx][Tx] instead of [Ty][Tx] in both places
🗪
2:15:22xxthebigfoxx Q: I think you have a typo on the Trilerp code where you index by [Ty][Ty] and [Tx][Tx] instead of [Ty][Tx] in both places
🗪
2:15:22xxthebigfoxx Q: I think you have a typo on the Trilerp code where you index by [Ty][Ty] and [Tx][Tx] instead of [Ty][Tx] in both places
🗪
2:15:51somebody_took_my_name Q: Another RenderDoc image?
🗪
2:15:51somebody_took_my_name Q: Another RenderDoc image?
🗪
2:15:51somebody_took_my_name Q: Another RenderDoc image?
🗪
2:16:04Capture a frame in RenderDoc
🏃
2:16:04Capture a frame in RenderDoc
🏃
2:16:04Capture a frame in RenderDoc
🏃
2:16:59somebody_took_my_name Q: Is Oxy supposed to be mapped between 0 and 1 or -1 and 1 in the setup light code?
🗪
2:16:59somebody_took_my_name Q: Is Oxy supposed to be mapped between 0 and 1 or -1 and 1 in the setup light code?
🗪
2:16:59somebody_took_my_name Q: Is Oxy supposed to be mapped between 0 and 1 or -1 and 1 in the setup light code?
🗪
2:17:51Fix EndLightingComputation() to map Oxy from -1 to 1
2:17:51Fix EndLightingComputation() to map Oxy from -1 to 1
2:17:51Fix EndLightingComputation() to map Oxy from -1 to 1
2:18:54Capture a frame in RenderDoc
🏃
2:18:54Capture a frame in RenderDoc
🏃
2:18:54Capture a frame in RenderDoc
🏃
2:19:48tinspin Q: If it's okay to ask something off-topic? Why aren't more engines using dynamic .dll / .so for hot-deployment of game code?
🗪
2:19:48tinspin Q: If it's okay to ask something off-topic? Why aren't more engines using dynamic .dll / .so for hot-deployment of game code?
🗪
2:19:48tinspin Q: If it's okay to ask something off-topic? Why aren't more engines using dynamic .dll / .so for hot-deployment of game code?
🗪
2:20:11jimdopango Q: Do you find it annoying to keep hopping between editor and debugger when you are programming? In your ideal environment would these two tools be unified in the same window?
🗪
2:20:11jimdopango Q: Do you find it annoying to keep hopping between editor and debugger when you are programming? In your ideal environment would these two tools be unified in the same window?
🗪
2:20:11jimdopango Q: Do you find it annoying to keep hopping between editor and debugger when you are programming? In your ideal environment would these two tools be unified in the same window?
🗪
2:21:36vaualbus Q: Could be a good idea to add to the debug system a way to look at the OpenGL texture? So we could switch less from the game?
🗪
2:21:36vaualbus Q: Could be a good idea to add to the debug system a way to look at the OpenGL texture? So we could switch less from the game?
🗪
2:21:36vaualbus Q: Could be a good idea to add to the debug system a way to look at the OpenGL texture? So we could switch less from the game?
🗪
2:21:51x1bzzr Q: Don't you think using a .cpp file instead of a batch file for build setup and configuration would be better since batch files are so bad?
🗪
2:21:51x1bzzr Q: Don't you think using a .cpp file instead of a batch file for build setup and configuration would be better since batch files are so bad?
🗪
2:21:51x1bzzr Q: Don't you think using a .cpp file instead of a batch file for build setup and configuration would be better since batch files are so bad?
🗪
2:22:19maliusarth Q: Unreal only does it fairly recently using an external tool which cost them almost zero implementation effort
🗪
2:22:19maliusarth Q: Unreal only does it fairly recently using an external tool which cost them almost zero implementation effort
🗪
2:22:19maliusarth Q: Unreal only does it fairly recently using an external tool which cost them almost zero implementation effort
🗪
2:23:41Wind it down
🗩
2:23:41Wind it down
🗩
2:23:41Wind it down
🗩