8.1 OpenGL纹理和采样器:纹理对象

纹理对象 Texture Objects

GL中的纹理由命名对象表示。纹理对象的命名空间是无符号整数,其中零被GL保留用于表示默认纹理对象。默认纹理对象在上下文初始化期间绑定到TEXTURE_1DTEXTURE_2DTEXTURE_3DTEXTURE_1D_ARRAYTEXTURE_2D_ARRAYTEXTURE_RECTANGLETEXTURE_BUFFERTEXTURE_CUBE_MAPTEXTURE_CUBE_MAP_ARRAYTEXTURE_2D_MULTISAMPLETEXTURE_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中的条目为零时,将重置在本节开始列出的每个纹理图像单元对应的目标,以恢复其默认纹理。
  • 如果texturesNULL,则将从firstfirst + 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 状态的设置影响。如果删除了一个纹理对象,则所有绑定到该纹理对象的纹理单元将重新绑定到纹理对象零。

  • 5
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值