什么技术需要可变纹理存储

时间:2013-07-30 12:20:11

标签: opengl textures

我刚刚读到了不可变纹理存储的优点。虽然我明白,使用可变存储,我可以根据需要调整纹理存储的大小,我不明白为什么我想要。

哪些技术以不可能的方式使用可变纹理存储或在不可变纹理存储中表现不佳?

2 个答案:

答案 0 :(得分:3)

请允许我引用ARB在ARB_texture_storage extension中的讨论。请注意,这些是来自实施OpenGL的IHV 的问题和讨论,这些人比我们大多数人更了解他们的GPU:

  

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

     

决议:是的。

     

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

     

5:使用对TexStorage *的新调用完全替换纹理是否合法?

     

解决。这是不允许的。

     

讨论:这对于使纹理的所有级别无效非常有用。允许在这里更改元数据似乎比尝试定义更改元数据意味着什么的可移植定义更容易(例如,如果您第一次使用未实现的内部格式,第二次使用相应大小的内部格式,或者反之亦然)?

     

然而,虽然这很大程度上类似于删除旧纹理对象并将其替换为新纹理对象,但它确实失去了不可变性的一些优点。具体来说,因为这样做不会重置绑定,所以它不允许迁移到API,以便在绑定时验证纹理格式。

     

6:如果不影响元数据,在TexStorage *之后使用TexImage *是否合法?

     

决议:否。

     

讨论:一个潜在的用例是允许使用NULL指针使单个级别的纹理无效。但是,如上所述,确定改变的构成是非常重要的。

请允许我换一种说法:如果ARB认为原位纹理修改是一个好主意,那么他们就不会明确禁止glTexStorage

答案 1 :(得分:2)

有几种情况下可变纹理很有用。这里有一些不在我的脑海里。

  1. 在GPGPU应用程序中,通常情况下输入数据不是完全网格化的,而是稀疏的。在这种情况下,我不得不浪费内存 - 可变纹理允许调整大小以防止这种情况发生。
  2. 冒名顶替者/广告牌LOD - 当小事做什么时不需要分配大的纹理
  3. 使用纹理进行数据相关的数学运算,比如基于计算掩码/大小的卷积
  4. 缓存“昂贵的”渲染输出以进行合成。动态调整这些存储纹理的大小可以节省宝贵的GPU内存。
  5. 还有更多我可能会失踪,但我希望你能得到主旨。