OpenGL中使用glTextureStorage2D后调用glGenerateTextureMipmap需预留空间吗?
OpenGL glTextureStorage2D与glGenerateTextureMipmap内存分配疑问解答
核心问题解答
1. glTextureStorage2D配合glGenerateTextureMipmap是否需要预留空间?
必须预留。glTextureStorage2D是一次性分配纹理所有mipmap层级的存储空间,属于不可变存储,调用后无法修改纹理的格式、尺寸或层级总数。如果后续要调用glGenerateTextureMipmap生成完整mipmap链,必须在调用glTextureStorage2D时将levels参数设为完整的mipmap层级总数(例如宽高为2的幂的纹理,层级数为floor(log2(max(width, height))) + 1)。若levels设为1,后续调用glGenerateTextureMipmap会直接失败,因为没有多余空间存储生成的mipmap层级。
2. glGenerateMipmap是否会分配额外空间?
这取决于纹理的存储类型:
- 若使用
glTexImage2D创建纹理:每次调用仅分配单个mipmap层级的内存,此时调用glGenerateMipmap(GL_TEXTURE_2D),OpenGL会自动为缺失的mipmap层级分配内存,并生成对应图像数据。 - 若使用
glTextureStorage2D分配纹理:glGenerateMipmap不会分配新内存,仅会在已预分配的存储空间内填充mipmap数据——这也是必须提前预留足够层级的原因。
两种纹理创建方式差异
glTextureStorage2D:不可变存储,一旦分配完成就无法修改存储参数,性能更优,OpenGL可进行更多底层优化。glTexImage2D:可变存储,可动态添加或修改单个mipmap层级,灵活性更高,但性能略低于前者。
内容的提问来源于stack exchange,提问作者SZYoo
相关产品推荐
相关产品推荐

