如何在OpenGL中动态启用/禁用纹理mipmaps?

4
所以,glGenerateMipMap很棒。我有几个疑问:
  • 假设纹理图像是通过glTexSubImage2D更改的,是否需要再次调用glGenerateMipMap -- 足够 / 必要 / 不必要?
  • 假设最终用户应能够“随时启用/禁用mip-maps”,当然必须相应地设置GL_TEXTURE_MIN_FILTER以进行mipmap或不进行mipmap。但之前生成的mip-maps仍留存在GPU VRAM中,对吧?--可以向驱动程序“提示”删除它们吗?我是否必须重新上传原始纹理图像(但现在min-filtering不再设置为mipmap)以清除包含先前生成的、现在不再需要的mip-maps的内存?

背景 --- 在需要更深入了解上述问题的其他用例中,我还想跟踪应用程序消耗的近似GPU VRAM量(出于各种原因,如可扩展的任意纹理/顶点流)--- 通过跟踪被应用程序填充的GL缓冲区以及上传的纹理(当然只是近似,但足够好)。然后跟踪它们的mip-maps也是必要的,因此知道何时以及如何由当前GL实现清除它们将非常有用。

1个回答

4
假设纹理图像通过glTexSubImage2D更改,另一个调用glGenerateMipMap是否足够/必需/不必要?如果您希望mipmap正确反映上传的基本级别,则是的。 glGenerateMipmaps是一次性操作,而不是您在纹理上切换的开关。
然而,以前生成的mip-maps仍然保留在GPU VRAM中,对吗?驱动程序可以被“提示”删除它们吗?不要费心了。告诉驱动程序这样取消分配内存总是不明智的。事实上,除非您上传立方体贴图面,否则多次调用glTexImage*以获取相同的mipmap级别是不明智的。
为了更清楚地解释这一点,请考虑相对较新的OpenGL函数glTexStorage2D。使用此函数使纹理的存储不可变。它具有您说的数量的mipmaps,永远存在(当然,直到您将其删除)。
为什么?好吧,从ARB_texture_storage扩展中:

4: 是否应该使用这些入口点使元数据(格式和尺寸)不可变?

决议:是的。

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

ARB看到了其中的好处。确实,ARB_texture_view 在没有它的情况下可能是不可能的(或者至少非常低效)。因此,显然这就是他们希望人们使用的。

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

无论如何,这也无关紧要,因为OpenGL没有处理解除分配mipmap层的方法。


如果你想让用户能够翻转开关并实际上恢复一些内存,那么就要做好:创建一个新的纹理对象,其内容与旧的相同。-- 谢谢,这正是我在寻找的提示。但也感谢您提供了详细深入的解释。(顺便说一句——顺便说一下,您在arcsynthesis.org上的GL教程非常棒,一直在推荐它。如果这本书以可购买的PDF电子书形式出版,我会很高兴为每个设备订购一份...) - metaleap

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接