在OpenGL3.3中先加入了採樣器對象( sampler object ),記得以前做OpenGL程式的時候,有時會遇到需要相同的紋理資料只是filter模式不同而已,但當時由於不支援多個不同屬性集共用同一個紋理對象,因此必須分別建立2個不同的紋理對象(當然使多個紋理對象共用同一個pixel buffer來達到此目的),顯得很笨拙和浪費。新加入的採樣器對象就使這個工作變得容易且合乎邏輯和直覺的“美感”
一個採樣器對象實際上時定義了諸如過濾,定址模式等屬性,但不包括紋理的寬度和高度。之所以這樣也是想當然的,因為通常採樣器可以為多個紋理對象共用,當這些紋理對象的紋理記憶體尺寸不同時也不會造成歧義。
使用過程大致如下:
glGenSamplers( 1, &samplerID );</p><p> glSamplerParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );</p><p> glSamplerParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );</p><p> //set orther sampler attributes</p><p> glActiveTexture( GL_TEXTURE0 );</p><p> glBindSampler( GL_TEXTURE0, samplerID );</p><p> glActiveTexture( GL_TEXTURE1 );</p><p> glBindSampler( GL_TEXTURE1, samplerID );</p><p> ...</p><p>
一個採樣器可以被多個紋理單元共用,且當該採樣器對象的屬性改變時,將影響所有與之關聯的紋理單元鎖綁定的紋理對象:如上代碼,將一個採樣器對象綁定到兩個不同的紋理單元,假設這兩個紋理單元分別於紋理對象tex0, tex1綁定,那麼tex1和tex2將具有相同的過濾和定址模式,且tex1,tex2不需要具有相同的尺寸。當關聯到到同一個採樣器對象的多個紋理具有相同的尺寸,資料類型以及通道數時(雖然這實際上不是必須的,因為諸如glTexImage2D這樣的函數提供了internalFormat和format參數可以確保程式正確執行,但出于謹慎和正確性考慮也應如此),那麼這個特點另一個隱藏的價值就是前面所說的可以共用同一個資料來源。
這個特性也被引入到CUDA3.0中,
在PTX 1.*之前,需要這樣聲明紋理:
.tex .u32 texid</p><p>CUDA3.0為了向前相容也繼續提供支援,但不被推薦。3.0中紋理的使用分為統一模式( unified mode )和正交模式( independent mode ),在 PTX 中:</p><p>.target texmode_independent //if nessesary</p><p>.global .texref texRef;</p><p>.global .samplerref sampler={ addr_mode0=clamp, addr_mode1=clamp, filter_mode=linear };</p><p>...</p><p>//紋理對象texRef再從紋理內從取資料時將使用線性濾波和夾持定址模式(注意與紋理記憶體綁定的是texRef對象,</p><p>//sampler只是設定了與之關聯的紋理對象的屬性集)</p><p>tex.2d.v4.f32.f32 { %f0, %f1, %f2, %f3 }, [ texRef, sampler, { %r0, %r1 } ];<br />