GPU MIP Mapping
?
?

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 our new ground cover, with the need to light our sprites
🏃
0:40Demo our new ground cover, with the need to light our sprites
🏃
0:40Demo our new ground cover, with the need to light our sprites
🏃
1:49MIP mapping our sprites
🏃
1:49MIP mapping our sprites
🏃
1:49MIP mapping our sprites
🏃
8:14Distributing our grass more naturally
🏃
8:14Distributing our grass more naturally
🏃
8:14Distributing our grass more naturally
🏃
9:55Plan to work on our rendering quality
🏃
9:55Plan to work on our rendering quality
🏃
9:55Plan to work on our rendering quality
🏃
11:08MIP (Multum In Parvo) maps
🖌
11:08MIP (Multum In Parvo) maps
🖌
11:08MIP (Multum In Parvo) maps
🖌
14:00Texture sampling
🖌
14:00Texture sampling
🖌
14:00Texture sampling
🖌
18:05MIP map pre-filtering
🖌
18:05MIP map pre-filtering
🖌
18:05MIP map pre-filtering
🖌
23:15Anisotropic filtering
🖌
23:15Anisotropic filtering
🖌
23:15Anisotropic filtering
🖌
30:31MIP map memory bandwidth savings and efficiency
🖌
30:31MIP map memory bandwidth savings and efficiency
🖌
30:31MIP map memory bandwidth savings and efficiency
🖌
32:55Understanding glTexSubImage3D()1
📖
32:55Understanding glTexSubImage3D()1
📖
32:55Understanding glTexSubImage3D()1
📖
35:09Understanding the "level" parameter of glCompressedTexSubImage3D()2
🖌
35:09Understanding the "level" parameter of glCompressedTexSubImage3D()2
🖌
35:09Understanding the "level" parameter of glCompressedTexSubImage3D()2
🖌
36:38Set up OpenGLManageTextures() to specify the texture subimage of multiple MIP map levels
36:38Set up OpenGLManageTextures() to specify the texture subimage of multiple MIP map levels
36:38Set up OpenGLManageTextures() to specify the texture subimage of multiple MIP map levels
37:38Understanding glGenerateMipmap()3
📖
37:38Understanding glGenerateMipmap()3
📖
37:38Understanding glGenerateMipmap()3
📖
39:00Experimentally revert OpenGLManageTextures() and instead call glGenerateMipmap()4 to do all the MIP mapping
39:00Experimentally revert OpenGLManageTextures() and instead call glGenerateMipmap()4 to do all the MIP mapping
39:00Experimentally revert OpenGLManageTextures() and instead call glGenerateMipmap()4 to do all the MIP mapping
41:03Better understanding glGenerateMipmap()5
📖
41:03Better understanding glGenerateMipmap()5
📖
41:03Better understanding glGenerateMipmap()5
📖
43:59Abandon glGenerateMipmap() and make LoadAssetWork() to generate the MIP maps ourselves
43:59Abandon glGenerateMipmap() and make LoadAssetWork() to generate the MIP maps ourselves
43:59Abandon glGenerateMipmap() and make LoadAssetWork() to generate the MIP maps ourselves
55:49Make OpenGLManageTextures() specify the texture subimage of multiple MIP map levels
55:49Make OpenGLManageTextures() specify the texture subimage of multiple MIP map levels
55:49Make OpenGLManageTextures() specify the texture subimage of multiple MIP map levels
58:08Introduce Downsample2x() for LoadAssetWork() and our original Downsample() to call
58:08Introduce Downsample2x() for LoadAssetWork() and our original Downsample() to call
58:08Introduce Downsample2x() for LoadAssetWork() and our original Downsample() to call
1:03:03Create handmade_image.cpp and .h
1:03:03Create handmade_image.cpp and .h
1:03:03Create handmade_image.cpp and .h
1:09:17Introduce GenerateSequentialMIPs() for LoadAssetWork() to call, IterateMIPs() and the mip_iterator versions of IsValid() and Advance()
1:09:17Introduce GenerateSequentialMIPs() for LoadAssetWork() to call, IterateMIPs() and the mip_iterator versions of IsValid() and Advance()
1:09:17Introduce GenerateSequentialMIPs() for LoadAssetWork() to call, IterateMIPs() and the mip_iterator versions of IsValid() and Advance()
1:15:23Consider how best to indicate special textures to BeginTextureOp()
📖
1:15:23Consider how best to indicate special textures to BeginTextureOp()
📖
1:15:23Consider how best to indicate special textures to BeginTextureOp()
📖
1:19:47Change BeginTextureOp() to take a SizeRequested for LoadBitmap() to pass, introducing GetTotalSizeForMIPs()
1:19:47Change BeginTextureOp() to take a SizeRequested for LoadBitmap() to pass, introducing GetTotalSizeForMIPs()
1:19:47Change BeginTextureOp() to take a SizeRequested for LoadBitmap() to pass, introducing GetTotalSizeForMIPs()
1:24:35Implement GetTotalSizeForMIPs(), IterateMIPs() and the mip_iterator versions of IsValid() and Advance()
1:24:35Implement GetTotalSizeForMIPs(), IterateMIPs() and the mip_iterator versions of IsValid() and Advance()
1:24:35Implement GetTotalSizeForMIPs(), IterateMIPs() and the mip_iterator versions of IsValid() and Advance()
1:31:09Step through BeginTextureOp() to debug our new MIP mapping work
🏃
1:31:09Step through BeginTextureOp() to debug our new MIP mapping work
🏃
1:31:09Step through BeginTextureOp() to debug our new MIP mapping work
🏃
1:33:14Fix GetTotalSizeForMIPs() to correctly accumulate the size, and the mip_iterator version of Advance() to operate the opposite way round
1:33:14Fix GetTotalSizeForMIPs() to correctly accumulate the size, and the mip_iterator version of Advance() to operate the opposite way round
1:33:14Fix GetTotalSizeForMIPs() to correctly accumulate the size, and the mip_iterator version of Advance() to operate the opposite way round
1:33:49Step through GetTotalSizeForMIPs() and out to LoadBitmap()
🏃
1:33:49Step through GetTotalSizeForMIPs() and out to LoadBitmap()
🏃
1:33:49Step through GetTotalSizeForMIPs() and out to LoadBitmap()
🏃
1:36:33Hit a GL_INVALID_VALUE OpenGL error in OpenGLDebugCallback()
🏃
1:36:33Hit a GL_INVALID_VALUE OpenGL error in OpenGLDebugCallback()
🏃
1:36:33Hit a GL_INVALID_VALUE OpenGL error in OpenGLDebugCallback()
🏃
1:39:15Fix LoadBitmap() to set the TextureOp->GenMipMaps
1:39:15Fix LoadBitmap() to set the TextureOp->GenMipMaps
1:39:15Fix LoadBitmap() to set the TextureOp->GenMipMaps
1:39:50Step through GenerateSequentialMIPs() to see that we're not dealing with powers of 2 sizes
🏃
1:39:50Step through GenerateSequentialMIPs() to see that we're not dealing with powers of 2 sizes
🏃
1:39:50Step through GenerateSequentialMIPs() to see that we're not dealing with powers of 2 sizes
🏃
1:42:02Enable the mip_iterator version of Advance and Downsample2x() to handle non-powers of 2 sizes
1:42:02Enable the mip_iterator version of Advance and Downsample2x() to handle non-powers of 2 sizes
1:42:02Enable the mip_iterator version of Advance and Downsample2x() to handle non-powers of 2 sizes
1:48:40Step through GenerateSequentialMIPs() successfully
🏃
1:48:40Step through GenerateSequentialMIPs() successfully
🏃
1:48:40Step through GenerateSequentialMIPs() successfully
🏃
1:49:32Investigate the GL_INVALID_VALUE OpenGL error in OpenGLDebugCallback()6
📖
1:49:32Investigate the GL_INVALID_VALUE OpenGL error in OpenGLDebugCallback()6
📖
1:49:32Investigate the GL_INVALID_VALUE OpenGL error in OpenGLDebugCallback()6
📖
1:51:19Make OpenGLInit() announce all of our MIP levels
1:51:19Make OpenGLInit() announce all of our MIP levels
1:51:19Make OpenGLInit() announce all of our MIP levels
1:53:03Find that OpenGL is accepting our textures, but we have glitches
🏃
1:53:03Find that OpenGL is accepting our textures, but we have glitches
🏃
1:53:03Find that OpenGL is accepting our textures, but we have glitches
🏃
1:55:05Understanding the GL_TEXTURE_MIN_FILTER value for glTexParameteri()7
📖
1:55:05Understanding the GL_TEXTURE_MIN_FILTER value for glTexParameteri()7
📖
1:55:05Understanding the GL_TEXTURE_MIN_FILTER value for glTexParameteri()7
📖
1:56:25Temporarily prevent LoadAssetWork() from calling GenerateSequentialMIPs()
1:56:25Temporarily prevent LoadAssetWork() from calling GenerateSequentialMIPs()
1:56:25Temporarily prevent LoadAssetWork() from calling GenerateSequentialMIPs()
1:56:44See that our rendering glitches are gone, and consider our possible bugs
🏃
1:56:44See that our rendering glitches are gone, and consider our possible bugs
🏃
1:56:44See that our rendering glitches are gone, and consider our possible bugs
🏃
1:57:15Scour Downsample2x() and GenerateSequentialMIPs() for bugs
📖
1:57:15Scour Downsample2x() and GenerateSequentialMIPs() for bugs
📖
1:57:15Scour Downsample2x() and GenerateSequentialMIPs() for bugs
📖
1:58:45Slightly simplify GenerateSequentialMIPs()
1:58:45Slightly simplify GenerateSequentialMIPs()
1:58:45Slightly simplify GenerateSequentialMIPs()
1:59:50Step through GenerateSequentialMIPs()
🏃
1:59:50Step through GenerateSequentialMIPs()
🏃
1:59:50Step through GenerateSequentialMIPs()
🏃
2:03:42remedygb bug: Clicking values of entered variables
🗹
2:03:42remedygb bug: Clicking values of entered variables
🗹
2:03:42remedygb bug: Clicking values of entered variables
🗹
2:04:40x13pixels Just fixed that about 20 minutes ago
🗪
2:04:40x13pixels Just fixed that about 20 minutes ago
🗪
2:04:40x13pixels Just fixed that about 20 minutes ago
🗪
2:05:01Step through Downsample2x()
🏃
2:05:01Step through Downsample2x()
🏃
2:05:01Step through Downsample2x()
🏃
2:07:08Add a space-checking assertion in GenerateSequentialMIPs()
2:07:08Add a space-checking assertion in GenerateSequentialMIPs()
2:07:08Add a space-checking assertion in GenerateSequentialMIPs()
2:08:57Fail to hit that assertion in GenerateSequentialMIPs()
🏃
2:08:57Fail to hit that assertion in GenerateSequentialMIPs()
🏃
2:08:57Fail to hit that assertion in GenerateSequentialMIPs()
🏃
2:09:18Investigate our rendering glitches, scouring LoadBitmap()
📖
2:09:18Investigate our rendering glitches, scouring LoadBitmap()
📖
2:09:18Investigate our rendering glitches, scouring LoadBitmap()
📖
2:10:00Slightly simplify LoadBitmap()
2:10:00Slightly simplify LoadBitmap()
2:10:00Slightly simplify LoadBitmap()
2:11:21Continue to investigate our rendering glitches
📖
2:11:21Continue to investigate our rendering glitches
📖
2:11:21Continue to investigate our rendering glitches
📖
2:13:56Slightly simplify OpenGLManageTextures()
2:13:56Slightly simplify OpenGLManageTextures()
2:13:56Slightly simplify OpenGLManageTextures()
2:14:09Continue to investigate our rendering glitches
📖
2:14:09Continue to investigate our rendering glitches
📖
2:14:09Continue to investigate our rendering glitches
📖
2:15:02See our rendering glitches
🏃
2:15:02See our rendering glitches
🏃
2:15:02See our rendering glitches
🏃
2:15:22Temporarily prevent Downsample2x() from writing the pixels
2:15:22Temporarily prevent Downsample2x() from writing the pixels
2:15:22Temporarily prevent Downsample2x() from writing the pixels
2:15:41See that our glitches are gone
🏃
2:15:41See that our glitches are gone
🏃
2:15:41See that our glitches are gone
🏃
2:15:44Let Downsample2x() write the pixels
2:15:44Let Downsample2x() write the pixels
2:15:44Let Downsample2x() write the pixels
2:16:17Assert in GenerateSequentialMIPs() that the end of one bitmap is the start of the next
2:16:17Assert in GenerateSequentialMIPs() that the end of one bitmap is the start of the next
2:16:17Assert in GenerateSequentialMIPs() that the end of one bitmap is the start of the next
2:17:38Fail to hit that assertion but still see the glitches
🏃
2:17:38Fail to hit that assertion but still see the glitches
🏃
2:17:38Fail to hit that assertion but still see the glitches
🏃
2:18:23Change GenerateSequentialMIPs() to fill the MIP map with a different colour per level, introducing FillImage()
2:18:23Change GenerateSequentialMIPs() to fill the MIP map with a different colour per level, introducing FillImage()
2:18:23Change GenerateSequentialMIPs() to fill the MIP map with a different colour per level, introducing FillImage()
2:21:52See no rendering glitches
🏃
2:21:52See no rendering glitches
🏃
2:21:52See no rendering glitches
🏃
2:22:05Scour Downsample2x() for bugs
📖
2:22:05Scour Downsample2x() for bugs
📖
2:22:05Scour Downsample2x() for bugs
📖
2:22:35Fix Downsample2x() to output the correct sized image
2:22:35Fix Downsample2x() to output the correct sized image
2:22:35Fix Downsample2x() to output the correct sized image
2:23:30See that our glitches are gone, and we are not using our MIP maps
🏃
2:23:30See that our glitches are gone, and we are not using our MIP maps
🏃
2:23:30See that our glitches are gone, and we are not using our MIP maps
🏃
2:23:48Enable MIP maps in OpenGLInit()
2:23:48Enable MIP maps in OpenGLInit()
2:23:48Enable MIP maps in OpenGLInit()
2:25:32Admire our smoother, MIP mapped textures
🏃
2:25:32Admire our smoother, MIP mapped textures
🏃
2:25:32Admire our smoother, MIP mapped textures
🏃
2:27:34Q&A
🗩
2:27:34Q&A
🗩
2:27:34Q&A
🗩
2:28:04s0imn Q: Would you want to add shaders to the asset system?
🗪
2:28:04s0imn Q: Would you want to add shaders to the asset system?
🗪
2:28:04s0imn Q: Would you want to add shaders to the asset system?
🗪
2:29:01pragmascrypt Q: Which textures are considered "special textures", and why do they not want MIP mapping?
🗪
2:29:01pragmascrypt Q: Which textures are considered "special textures", and why do they not want MIP mapping?
🗪
2:29:01pragmascrypt Q: Which textures are considered "special textures", and why do they not want MIP mapping?
🗪
2:30:37nonsensation Q: (Off-topic) Can you explain these light blue kind of selection bars in 4coder?
🗪
2:30:37nonsensation Q: (Off-topic) Can you explain these light blue kind of selection bars in 4coder?
🗪
2:30:37nonsensation Q: (Off-topic) Can you explain these light blue kind of selection bars in 4coder?
🗪
2:30:59bulmanator Q: Request to change the name of mip_iterator to mipterator
🗪
2:30:59bulmanator Q: Request to change the name of mip_iterator to mipterator
🗪
2:30:59bulmanator Q: Request to change the name of mip_iterator to mipterator
🗪
2:31:06mattiamanzati Q: Through stream is difficult to notice. Can we please see an image sent through chat difference between before and after MIP maps?
🗪
2:31:06mattiamanzati Q: Through stream is difficult to notice. Can we please see an image sent through chat difference between before and after MIP maps?
🗪
2:31:06mattiamanzati Q: Through stream is difficult to notice. Can we please see an image sent through chat difference between before and after MIP maps?
🗪
2:31:50Enable OpenGLChangeToSettings() to toggle MIP maps and nearest texel filtering
2:31:50Enable OpenGLChangeToSettings() to toggle MIP maps and nearest texel filtering
2:31:50Enable OpenGLChangeToSettings() to toggle MIP maps and nearest texel filtering
2:41:46Try toggling nearest texel filtering and MIP maps
🏃
2:41:46Try toggling nearest texel filtering and MIP maps
🏃
2:41:46Try toggling nearest texel filtering and MIP maps
🏃
2:43:07kniffel5 Q: Is there an easy way to view the MIP maps sent to the GPU and, if so, why didn't you use that feature for debugging purposes before?
🗪
2:43:07kniffel5 Q: Is there an easy way to view the MIP maps sent to the GPU and, if so, why didn't you use that feature for debugging purposes before?
🗪
2:43:07kniffel5 Q: Is there an easy way to view the MIP maps sent to the GPU and, if so, why didn't you use that feature for debugging purposes before?
🗪
2:44:32nonsensation Q: Some file formats like DDS have MIP maps already baked in. Is generating them better nowadays or does it actually matter any longer?
🗪
2:44:32nonsensation Q: Some file formats like DDS have MIP maps already baked in. Is generating them better nowadays or does it actually matter any longer?
🗪
2:44:32nonsensation Q: Some file formats like DDS have MIP maps already baked in. Is generating them better nowadays or does it actually matter any longer?
🗪
2:46:17abarishu Q: If we add some packing, would MIP maps interfere with that?
🗪
2:46:17abarishu Q: If we add some packing, would MIP maps interfere with that?
🗪
2:46:17abarishu Q: If we add some packing, would MIP maps interfere with that?
🗪
2:47:39variandra I don't watch you much but I was wondering: Are those settings you toggle, can / do you have a GUI so users can interact, or is that different?
🗪
2:47:39variandra I don't watch you much but I was wondering: Are those settings you toggle, can / do you have a GUI so users can interact, or is that different?
🗪
2:47:39variandra I don't watch you much but I was wondering: Are those settings you toggle, can / do you have a GUI so users can interact, or is that different?
🗪
2:49:22Close up shop
🗩
2:49:22Close up shop
🗩
2:49:22Close up shop
🗩