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