纹理对象 Texture Objects
GL中的纹理由命名对象表示。纹理对象的命名空间是无符号整数,其中零被GL保留用于表示默认纹理对象。默认纹理对象在上下文初始化期间绑定到TEXTURE_1D
、TEXTURE_2D
、TEXTURE_3D
、TEXTURE_1D_ARRAY
、TEXTURE_2D_ARRAY
、TEXTURE_RECTANGLE
、TEXTURE_BUFFER
、TEXTURE_CUBE_MAP
、TEXTURE_CUBE_MAP_ARRAY
、TEXTURE_2D_MULTISAMPLE
和TEXTURE_2D_MULTISAMPLE_ARRAY
目标之一。
生成n
个未使用的纹理名称
void glGenTextures( sizei n, uint *textures );
只有在首次绑定时,新生成的纹理对象才会根据所绑定的目标获得相应的维度和状态信息。
绑定纹理对象
void glBindTexture( enum target, uint texture );
其中target
设置为所需的纹理目标,texture
设置为未使用的名称。结果产生的纹理对象是一个新的状态向量,包含所有状态并具有第8.22节中列出的相同初始值。绑定到目标的新纹理对象是指定目标维度和类型的纹理,直到它被删除。
glBindTexture
也可以用于将现有纹理对象绑定到任何目标上。如果绑定成功,则绑定的纹理对象的状态不会改变,并且对目标的任何先前绑定都将被取消。
一次性绑定多个纹理对象
void glBindTextures( uint first, sizei count, const uint *textures );
现有的纹理对象绑定到从first
开始到first + count - 1
结束的一系列纹理图像单元上。
- 如果
textures
不为NULL
,则它指定了一个包含count
个值的数组,每个值必须为零或现有纹理对象的名称。- 当
textures
中的条目是现有纹理对象的名称时,该对象绑定到与该对象创建时指定的目标相对应的纹理单元。 - 当
textures
中的条目为零时,将重置在本节开始列出的每个纹理图像单元对应的目标,以恢复其默认纹理。
- 当
- 如果
textures
为NULL
,则将从first
到first + count - 1
中的每个受影响的纹理图像单元的每个目标都重置为其默认纹理。
// 等价于
for (i = 0; i < count; i++) {
uint texture;
if (textures == NULL) {
texture = 0;
} else {
texture = textures[i];
}
ActiveTexture(TEXTURE0 + first + i);
if (texture != 0) {
enum target = /* target of textures[i] */;
BindTexture(target, textures[i]);
} else {
for (target in all supported targets) {
BindTexture(target, 0);
}
}
}
需要注意的是,命令执行完成后,活动纹理选择器将保留其原始值,并且如果纹理对象不存在,则不会创建纹理对象。每个纹理图像单元的指定值将分别进行检查。如果特定纹理图像单元的值无效,则该单元的状态将保持不变,并生成错误。然而,如果其他纹理图像单元的对应值有效,则它们的状态仍将更改。
将一个已存在的纹理对象绑定到编号为unit
的纹理单元上
void glBindTextureUnit( uint unit, uint texture );
texture
参数必须为零或现有纹理对象的名称。
- 当
texture
是现有纹理对象的名称时,该对象将绑定到创建时指定的目标纹理单元上。 - 当
texture
为零时,该命令会将本节开头列举的每个目标重置为相应纹理图像单元的默认纹理。
创建纹理
void glCreateTextures( enum target, sizei n, uint *textures );
CreateTextures 函数会将 n 个先前未使用的纹理名称返回到 textures 数组中,每个名称代表一个新的纹理对象,它是一个状态向量,包含了章节 8.22 中列出的所有状态和相同的初始值。新的纹理对象是指定目标维度和类型的纹理,直到它们被删除为止。
删除纹理
void glDeleteTextures( sizei n, const uint *textures );
参数 textures 包含了要删除的 n 个纹理对象的名称。纹理对象被删除后,其不再具有任何内容或维度,并且其名称再次未使用。如果要删除的纹理当前绑定到 BindTexture 的任何目标绑定中,则它就像执行了相同目标和纹理零的 BindTexture 一样。此外,当删除纹理时,如果纹理的任何图像附加到帧缓冲对象中,则必须特别小心。有关详细信息,请参阅第 9.2.8 节。
是否为纹理对象
boolean glIsTexture( uint texture );
如果 texture 是一个纹理对象的名称,则返回 TRUE。如果 texture 是零,或者是一个非零值但不是纹理对象的名称,或者发生错误条件,则 IsTexture 返回 FALSE。
纹理对象名称空间包括初始的一维、二维和三维、一维和二维数组、矩形、缓冲区、立方体贴图、立方体贴图数组、二维多重采样和二维多重采样数组纹理对象,这些都是在所有纹理单元之间共享的。一个纹理对象可以同时绑定到多个纹理单元上。绑定纹理对象后,对该目标对象的任何 GL 操作都会影响到与同一纹理对象绑定的任何其他纹理单元。
纹理绑定受 ACTIVE_TEXTURE 状态的设置影响。如果删除了一个纹理对象,则所有绑定到该纹理对象的纹理单元将重新绑定到纹理对象零。