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

本文介绍了OpenGL中的采样器对象,包括如何生成、绑定、设置参数以及管理这些对象的状态。采样器对象封装了纹理对象的采样状态,其状态会覆盖绑定到纹理单元的对象。使用GenSamplers和CreateSamplers创建新采样器,BindSampler绑定到纹理单元,而SamplerParameter用于设置参数值。
摘要由CSDN通过智能技术生成

采样器对象 Sampler Objects

如第8.22节所述,用于纹理处理的状态可以分为两类。GL纹理对象包括这两类状态。第一类表示维度和其他图像参数,第二类表示采样状态。此外,可以创建一个采样器对象,仅封装纹理对象的采样状态。

生成采样器对象
void glGenSamplers( sizei count, uint *samplers );

返回在samplers中的count个之前未使用的采样器对象名称。0被GL保留,表示未将采样器绑定到采样器单元。

它们只有在首次用作BindSamplerSamplerParameterGetSamplerParameter*IsSampler函数的参数时才会获取状态。首次在这些函数中使用时,生成的采样器对象将使用表23.18中列出的所有状态和相同的初始值进行初始化。

创建采样器对象
void glCreateSamplers( sizei n, uint *samplers );

返回n个先前未使用的采样器名称,每个名称代表一个新的采样器对象,它是一个状态向量,包含表23.18中列出的所有状态和相同的初始值。

绑定采样器对象
void glBindSampler( uint unit, uint sampler );

当一个采样器对象绑定到一个纹理单元时,它的状态将覆盖绑定到该纹理单元的纹理对象的状态。如果采样器名称为零被绑定到一个纹理单元,那么当前绑定纹理的采样器状态将变为活动状态。一个采样器对象可以同时绑定到多个纹理单元。

unit为绑定采样器的纹理单元的从零开始的索引,sampler设置为从先前调用GenSamplers返回的采样器对象的名称。

如果绑定成功,绑定的采样器对象的状态不会发生变化,并且任何先前绑定到该单元的绑定都将被中断。

如果在绑定到纹理单元的采样器对象中存在状态,在调用TexParameter*为绑定到该单元的纹理进行调用时会被拒绝,实现的行为就好像纹理是不完整的一样。例如,如果绑定到纹理单元的采样器对象上设置了TEXTURE_WRAP_STEXTURE_WRAP_TREPEATMIRRORED_REPEATMIRROR_CLAMP_TO_EDGE,并且绑定到该单元的纹理是一个矩形纹理,则该纹理将被视为不完整。

不影响绑定到纹理单元的纹理类型的采样的采样器对象状态,比如对于矩形纹理的TEXTURE_WRAP_R,不会影响完整性。

可以通过调用GetIntegerv并将pname设置为SAMPLER_BINDING来查询当前绑定的采样器。当从纹理单元解绑采样器对象(通过将名称为零的采样器对象绑定到该单元)时,修改后的状态将再次被与绑定到该纹理单元的纹理对象相关联的采样器状态所替代。

多个采样器对象绑定
void glBindSamplers( uint first, sizei count, const uint *samplers );

count个现有的采样器对象绑定到从firstfirst+count−1编号的纹理图像单元。如果samplers不是NULL,则它指定了一个包含count个值的数组,其中每个值必须为零或现有采样器对象的名称。如果samplersNULL,则从firstfirst+count−1的每个受影响的纹理图像单元将被重置为没有绑定的采样器对象。

// 相当于
for (int i = 0; i < count; i++) {
    if (samplers == NULL) {
        BindSampler(first + i, 0);
    } else {
        BindSampler(first + i, samplers[i]);
    }
}
设置采样器对象的每个参数

由采样器对象表示的参数是第8.10节中描述的参数的子集。通过调用以下函数之一设置采样器对象的每个参数:

void glSamplerParameter{if}( uint sampler, enum pname, T param );
void glSamplerParameter{if}v( uint sampler, enum pname, const T *param );
void glSamplerParameterI{i ui}v( uint sampler, enum pname, const T *params );

其中,sampler是先前通过调用GenSamplers保留的采样器对象的名称。pname是要修改的参数的名称,param是该参数的新值。pname必须是表23.18中的采样器状态名称之一。

未在此处和表23.18中列出的纹理状态(在表23.16-23.17中列出)以及采样器状态中的纹理状态不是采样器状态的一部分,并保留在纹理对象中。数据转换按照第2.2.1节中指定的规则执行,但有以下例外:

  • 如果使用SamplerParameterIivSamplerParameterIuiv指定TEXTURE_BORDER_COLOR的值,则它们不会被修改,并使用整数的内部数据类型存储。如果使用SamplerParameteriv指定,它们将使用等式2.2将被转换为浮点数。否则,这些值不会被修改并以浮点数形式存储。

修改采样器对象的参数会影响到该采样器对象绑定到的所有纹理单元。调用TexParameter对于绑定到活动纹理单元的采样器对象没有影响。它将修改绑定到该单元的纹理对象的参数。

删除采样器
void glDeleteSamplers( sizei count, const uint *samplers );

删除采样器对象后,其名称再次变为未使用状态。如果删除一个当前绑定到一个或多个纹理单元的采样器对象,就好像对每个绑定到采样器的纹理单元调用了一次BindSampler函数,其中unit设置为纹理单元,sampler设置为零。

是否为采样器对象
boolean glIsSampler( uint sampler );

如果sampler是先前从调用GenSamplers返回的采样器对象的名称,则IsSampler将返回TRUE,否则返回FALSE。零不是采样器对象的名称。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值