纹理对象和采样器对象->CUDA3.0&OpenGL3.3

在OpenGL3.3中先加入了采样器对象( sampler object ),记得以前做OpenGL程序的时候,有时会遇到需要相同的纹理数据只是filter模式不同而已,但当时由于不支持多个不同属性集共享同一个纹理对象,因此必须分别建立2个不同的纹理对象(当然使多个纹理对象共享同一个pixel buffer来达到此目的),显得很笨拙和浪费。新加入的采样器对象就使这个工作变得容易且合乎逻辑和直觉的“美感”
一个采样器对象实际上时定义了诸如过滤,寻址模式等属性,但不包括纹理的宽度和高度。之所以这样也是想当然的,因为通常采样器可以为多个纹理对象共享,当这些纹理对象的纹理内存尺寸不同时也不会造成歧义。

使用过程大致如下:

view plaincopy to clipboardprint?
glGenSamplers( 1, &samplerID );

glSamplerParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );

glSamplerParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );

//set orther sampler attributes

glActiveTexture( GL_TEXTURE0 );

glBindSampler( GL_TEXTURE0, samplerID );

glActiveTexture( GL_TEXTURE1 );

glBindSampler( GL_TEXTURE1, samplerID );


glGenSamplers( 1, &samplerID );

glSamplerParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
glSamplerParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
//set orther sampler attributes

glActiveTexture( GL_TEXTURE0 );
glBindSampler( GL_TEXTURE0, samplerID );

glActiveTexture( GL_TEXTURE1 );
glBindSampler( GL_TEXTURE1, samplerID );

一个采样器可以被多个纹理单元共享,且当该采样器对象的属性改变时,将影响所有与之关联的纹理单元锁绑定的纹理对象:如上代码,将一个采样器对象绑定到两个不同的纹理单元,假设这两个纹理单元分别于纹理对象tex0, tex1绑定,那么tex1和tex2将具有相同的过滤和寻址模式,且tex1,tex2不需要具有相同的尺寸。当关联到到同一个采样器对象的多个纹理具有相同的尺寸,数据类型以及通道数时(虽然这实际上不是必须的,因为诸如glTexImage2D这样的函数提供了internalFormat和format参数可以确保程序正确执行,但出于谨慎和正确性考虑也应如此),那么这个特点另一个隐藏的价值就是前面所说的可以共享同一个数据源。

这个特性也被引入到CUDA3.0中,
在PTX 1.*之前,需要这样声明纹理:
view plaincopy to clipboardprint?
.tex .u32 texid

CUDA3.0为了向前兼容也继续提供支持,但不被推荐。3.0中纹理的使用分为统一模式( unified mode )和正交模式( independent mode ),在 PTX 中:

.target texmode_independent //if nessesary

.global .texref texRef;

.global .samplerref sampler={ addr_mode0=clamp, addr_mode1=clamp, filter_mode=linear };

//纹理对象texRef再从纹理内从取数据时将使用线性滤波和夹持寻址模式(注意与纹理内存绑定的是texRef对象,

//sampler只是设置了与之关联的纹理对象的属性集)

tex.2d.v4.f32.f32 { %f0, %f1, %f2, %f3 }, [ texRef, sampler, { %r0, %r1 } ];

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/Cyrosly/archive/2010/03/30/5431963.aspx