我想写一个特定的纹理mipmap级别。问题是OpenGL说" GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT"和#34; Framebuffer未完成"如果我之前没有生成mipmap(glGenerateMipmap(GL_TEXTURE_2D);)。
在写入mipmap之前生成mipmap是有效的,但这是一个愚蠢的性能成本,因为永远不会使用自动生成的mipmap级别。
有可能避免这种情况吗?
注意:我知道不直接写入关卡并调用glGenerateMipmaps更快,但我需要这样做。
答案 0 :(得分:3)
您似乎根本没有为您尝试渲染的mipmap级别创建存储,glTexImage[n]D()
不执行此操作 - 它只为单个mipmap级别创建存储。您需要单独创建每个mipmap级别。 glGenerateMipmaps
隐含地做到这一点。但是,你实际上只需要它所做的一点点,所以最好在这里避免它。您最好的选择是创建从0级到手动所需级别的mipmap链。
对于非常现代的GL,我建议您使用GL_ARB_texture_storage中的 immutable texures 。 glTexStorage()
功能允许在单个调用中为所有必需的mipmap级别创建存储。使用不可变纹理,您仍然可以随时更改内容,唯一不能创建新数据存储(可能具有不同的格式或大小),因此您无法重复调用glTexImage[n]D()
在这样的纹理对象上。但是,如果需要,您仍然可以删除整个对象并创建一个新对象。