11

ARB_texture_storage被引入 OpenGL 4.2 核心。

你能解释一下纹理对象的不变性是什么意思吗?

为什么它比以前的纹理使用更好,这个功能有什么缺点?

我知道我可以阅读这个扩展的规范(我做过:)),但我想看看一些例子或其他解释。

4

1 回答 1

18

只需阅读扩展本身的介绍:

The texture image specification commands in OpenGL allow each level
to be separately specified with different sizes, formats, types and
so on, and only imposes consistency checks at draw time. This adds
overhead for implementations.

This extension provides a mechanism for specifying the entire
structure of a texture in a single call, allowing certain
consistency checks and memory allocations to be done up front. Once
specified, the format and dimensions of the image array become
immutable, to simplify completeness checks in the implementation.

When using this extension, it is no longer possible to supply texture
data using TexImage*. Instead, data can be uploaded using TexSubImage*,
or produced by other means (such as render-to-texture, mipmap generation,
or rendering to a sibling EGLImage).

This extension has complicated interactions with other extensions.
The goal of most of these interactions is to ensure that a texture
is always mipmap complete (and cube complete for cubemap textures).

明显的优点是该实现可以在运行时删除完整性/一致性检查,并且您的代码更加健壮,因为您不会意外创建错误的纹理。


详细说明:这里的“不可变”意味着纹理存储(纹理的三个组成部分之一:存储、采样、参数)被分配一次并且已经完成。请注意,存储并不意味着存储内容——它们可以随时更改;它指的是为这些内容(如 malloc)获取资源的逻辑过程。

使用非不可变纹理,您可以随时通过glTexImage<N>D调用更改存储。以这种方式射击自己的脚有很多方法:

  • 您可以创建mipmap 不完整的纹理(可能是纹理最常见的新手错误,因为默认情况下纹理有 1000 个 mipmap 级别,人们只上传一张图像)
  • 您可以在不同的 mipmap 级别创建具有不同格式的纹理(非法)
  • 您可以创建立方体贴图不完整的立方体贴图(非法)
  • 您可以在不同的面上创建具有不同格式的立方体贴图(非法)

由于您可以随时调用glTexImage<N>D,因此实现必须始终在绘制时检查您的纹理是否合法。不可变存储总是以正确的格式一次性分配所有内容(所有 mipmap 级别、所有立方体贴图面等),从而为您做正确的事情。因此,您不能再(轻松地)搞砸纹理,并且实现可以删除一些检查,从而加快速度。每个人都很高兴:)

于 2013-07-25T07:23:16.500 回答