纹理视图 Texture Views
可以创建一个引用另一个纹理的数据存储并以不同的格式解释数据的纹理,并且/或者选择另一个纹理的子集的级别和/或层。这样的纹理的数据存储与原始纹理的数据存储共享。使用原始纹理更新共享数据存储会影响使用新纹理读取的纹理值,反之亦然。纹理数据存储保持存在状态,直到删除所有引用它的纹理为止。
命令
void glTextureView( uint texture, enum target, uint origtexture, enum internalformat, uint minlevel, uint numlevels, uint minlayer, uint numlayers );
将名为texture
的纹理初始化为由target
指定的目标。纹理的数据存储从名为origtexture
的纹理继承,但数据存储的元素根据internalformat
指定的内部格式进行解释。此外,如果origtexture
是一个数组或具有多个mipmap
级别,则minlayer
、numlayers
、minlevel
和numlevels
参数控制哪些切片和级别被视为纹理的一部分。
minlevel
和minlayer
参数是相对于origtexture
的视图的。如果numlayers
或numlevels
超出origtexture
,则它们会被截断为原始纹理的最大范围。
如果命令成功,texture
中的纹理参数将更新如下:
TEXTURE_IMMUTABLE_FORMAT
设置为TRUE
。TEXTURE_IMMUTABLE_LEVELS
设置为origtexture
的TEXTURE_IMMUTABLE_LEVELS
的值。TEXTURE_VIEW_MIN_LEVEL
设置为minleve
l加上origtexture
的TEXTURE_VIEW_MIN_LEVEL
的值。TEXTURE_VIEW_MIN_LAYER
设置为minlayer
加上origtexture
的TEXTURE_VIEW_MIN_LAYER
的值。TEXTURE_VIEW_NUM_LEVELS
设置为numlevels
和origtexture
的TEXTURE_VIEW_NUM_LEVELS
的值减去minlevel
中较小的一个。TEXTURE_VIEW_NUM_LAYERS
设置为numlayers
和origtexture
的TEXTURE_VIEW_NUM_LAYERS
的值减去minlayer
中较小的一个。
新纹理的目标必须与origtexture
的目标兼容,如Table 8.21
所定义。
numlayers
和纹理尺寸的许多约束取决于目标和origtexture
的目标。这些约束在错误部分中总结如下。
- 当
origtexture
的目标是TEXTURE_CUBE_MAP
时,层参数的解释顺序与它是一个带有6个层面的TEXTURE_CUBE_MAP_ARRAY
时相同。 - 如果内部格式存在于
Table 8.22
中,则两个纹理的内部格式必须兼容。如果不在表中,则内部格式必须相同。 - 如果内部格式相同但为基本内部格式,则每个纹理的实现有效内部格式(参见第8.5节末尾)必须相同。
- 如果内部格式与原始纹理的内部格式不完全匹配,则内存内容将以与第8.26节中描述的图像绑定相同的方式重新解释。
- 接受
level
或layer
参数的纹理命令(例如TexSubImage2D
)将该参数解释为相对于纹理视图的。即,通过TexSubImage2D
更新的数据存储的mipmap
级别将是level
和TEXTURE_VIEW_MIN_LEVEL
值的总和。
Original target | Valid new targets |
---|---|
TEXTURE_1D | TEXTURE_1D, TEXTURE_1D_ARRAY |
TEXTURE_2D | TEXTURE_2D, TEXTURE_2D_ARRAY |
TEXTURE_3D | TEXTURE_3D |
TEXTURE_CUBE_MAP | TEXTURE_CUBE_MAP, TEXTURE_2D, TEXTURE_2D_ARRAY, TEXTURE_CUBE_MAP_ARRAY |
TEXTURE_RECTANGLE | TEXTURE_RECTANGLE |
TEXTURE_BUFFER | none |
TEXTURE_1D_ARRAY | TEXTURE_1D_ARRAY, TEXTURE_1D |
TEXTURE_2D_ARRAY | TEXTURE_2D_ARRAY, TEXTURE_2D,TEXTURE_CUBE_MAP, TEXTURE_CUBE_MAP_ARRAY |
TEXTURE_CUBE_MAP_ARRAY | TEXTURE_CUBE_MAP_ARRAY, TEXTURE_2D_ARRAY, TEXTURE_2D, TEXTURE_CUBE_MAP |
TEXTURE_2D_MULTISAMPLE | TEXTURE_2D_MULTISAMPLE, TEXTURE_2D_MULTISAMPLE_ARRAY |
TEXTURE_2D_MULTISAMPLE_ARRAY | TEXTURE_2D_MULTISAMPLE, TEXTURE_2D_MULTISAMPLE_ARRAY |
Table 8.21: Legal texture targets for TextureView
Class Internal | formats |
---|---|
VIEW_CLASS_128_BITS | RGBA32F, RGBA32UI, RGBA32I |
VIEW_CLASS_96_BITS | RGB32F, RGB32UI, RGB32I |
VIEW_CLASS_64_BITS | RGBA16F, RG32F, RGBA16UI, RG32UI, RGBA16I, RG32I, RGBA16, RGBA16_SNORM |
VIEW_CLASS_48_BITS | RGB16, RGB16_SNORM, RGB16F, RGB16UI, RGB16I |
VIEW_CLASS_32_BITS | RG16F, R11F_G11F_B10F, R32F, RGB10_A2UI, RGBA8UI, RG16UI, R32UI, RGBA8I, RG16I, R32I, RGB10_A2, RGBA8, RG16, RGBA8_SNORM, RG16_SNORM, SRGB8_ALPHA8, RGB9_E5 |
VIEW_CLASS_24_BITS | RGB8, RGB8_SNORM, SRGB8, RGB8UI, RGB8I |
VIEW_CLASS_16_BITS | R16F, RG8UI, R16UI, RG8I, R16I, RG8, R16, RG8_SNORM, R16_SNORM |
VIEW_CLASS_8_BITS | R8UI, R8I, R8, R8_SNORM |
VIEW_CLASS_RGTC1_RED | COMPRESSED_RED_RGTC1, COMPRESSED_SIGNED_RED_RGTC1 |
VIEW_CLASS_RGTC2_RG | COMPRESSED_RG_RGTC2, COMPRESSED_SIGNED_RG_RGTC2 |
VIEW_CLASS_BPTC_UNORM | COMPRESSED_RGBA_BPTC_UNORM, COMPRESSED_SRGB_ALPHA_BPTC_UNORM |
VIEW_CLASS_BPTC_FLOAT | COMPRESSED_RGB_BPTC_SIGNED_FLOAT, COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT |
Table 8.22: Compatible internal formats for TextureView. Formats in the same row may be cast to each other