如何在OpenGL中动态启用/禁用纹理mip-maps?

时间:2012-10-22 06:31:15

标签: opengl mipmaps

所以, glGenerateMipMap 很棒。我想知道几件事:

  • 假设纹理图像是通过 glTexSubImage2D 更改的,另一个对glGenerateMipMap的调用是 - 够/必需/不必要?
  • 假设最终用户应该能够“动态启用/禁用mip-maps”,当然GL_TEXTURE_MIN_FILTER必须相应地设置为mipmap。但是,先前生成的mip-maps仍保留在GPU VRAM中,对吧? - 司机可以“暗示”删除那些?我是否必须重新上传原始纹理图像(但现在最小过滤不再设置为mipmap)以清除包含先前生成的和现在不需要的mip-maps的内存?

背景 - 除了需要更多深入了解上述问题的其他用例之外,我还想“跟踪应用程序消耗的大约GPU VRAM”(出于各种原因,例如可扩展的任意纹理) / vertex streaming)---不仅跟踪应用程序填充的GL缓冲区,还跟踪上传的纹理(确定它只是近似但足够好)。因此,跟踪他们的mip-maps也是必要的,因此知道如何清除它们或当它们被当前GL实现清除时将非常有用。

1 个答案:

答案 0 :(得分:3)

  

假设纹理图像是通过glTexSubImage2D更改的,另一个对glGenerateMipMap的调用是 - 足够/必需/不必要吗?

如果您希望mipmap正确反映上传的基本级别,请执行。 glGenerateMipmaps是一次性操作,而不是您在纹理上翻转的开关。

  

但是,以前生成的mip-maps仍保留在GPU VRAM中,对吗? - 司机可以“暗示”删除那些吗?

不要打扰。告诉驱动程序像这样无法分配内存总是一个坏主意。实际上,在相同的mipmap级别调用glTexImage *不止一次(除非你上传立方体贴图面)是一个坏主意。

为了更清楚地解释原因,请考虑相对较新的OpenGL函数glTexStorage2D。使用此函数可使纹理的存储不可变。它有你说的mipmaps数量,永远(直到你删除它为止)。

为什么呢?好吧,来自ARB_texture_storage扩展名:

  

4:应该使用这些入口点使元数据(格式和维度)不可变吗?

     

决议:是的。

     

讨论:知道元数据无法改变的好处可能会超过在每个纹理规范调用上检查TEXTURE_IMMUTABLE_FORMAT标志的额外成本。

ARB看到了这方面的好处。实际上,如果没有它,ARB_texture_view可能是不可能的(或者至少非常低效)。很明显,这就是他们希望人们使用的东西。

如果您希望用户能够翻转该开关并实际重新获得一些内存,那么请正确执行:创建一个与旧内容具有相同内容的 new 纹理对象。

无论如何,无论如何都没关系,因为OpenGL无法解除分配mipmap图层。