ARB_texture_storage被引入OpenGL 4.2核心。
你能解释一下纹理对象的不变性意味着什么吗?
为什么它比以前的纹理使用更好,这个功能的缺点是什么?
我知道我可以阅读这个扩展的规范(我做了:),但我想看看一些例子或其他解释。
只需阅读扩展本身的介绍:
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级别中创建具有不同格式的纹理(非法)
- 您可能会创建cubemap不完整的cubemap(非法)
- 你可以在不同的面上创建不同格式的立方体(非法)
由于允许您在的任何时间调用glTexImage<N>D
,因此实现必须始终在drawintime检查您的纹理是否合法。不可变存储总是以正确的格式一次性分配所有内容(所有mipmap级别、所有立方体映射面等),为您做正确的事情。因此,你再也不能(轻易)破坏纹理了,而且实现可以删除一些检查,这会加快速度。每个人都很高兴:)