渲染到纹理的 mipmap 级别

Rendering to the mipmap level of a texture

我想写入特定的纹理贴图级别。问题是 OpenGL 说 "GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT​" 和 "Framebuffer is not completed" 如果我之前没有生成 mipmaps(glGenerateMipmap(GL_TEXTURE_2D);).

在写入之前生成 mipmap 是可行的,但这是一个愚蠢的性能成本,因为永远不会使用自动生成的 mipmap 级别。

是否可以避免这种情况?

注意:我知道不直接写入关卡并调用 glGenerateMipmaps 会更快,但我需要这样做。

您似乎根本没有为您尝试渲染的 mipmap 级别创建存储,glTexImage[n]D() 这样做 - 它只创建一个存储对于一个单独的 mipmap 级别。您需要分别创建每个 mipmap 级别。 glGenerateMipmaps 隐含地执行此操作。但是,您实际上只需要它所做的一小部分,因此最好避免在这里使用它。您最好的选择是手动创建从级别 0 到您需要的级别的 mipmap 链。

对于真正现代的 GL,我建议您使用 GL_ARB_texture_storage 中的 不可变纹理glTexStorage() 函数允许在单个调用中为所有必需的 mipmap 级别创建存储。使用不可变纹理,您仍然可以随时更改内容,唯一不能的是创建新的数据存储(可能具有不同的格式或大小),因此您不能在此类纹理对象上重复调用 glTexImage[n]D() .但是,如果需要,您仍然可以删除整个对象并创建一个新对象。