最終更新: mikk_ni3_92 2010年03月10日(水) 17:48:55履歴
現在地 >> メニュー >> CUDA >> CUDA編05 >> CUDA編05::TextureReference
次>> CUDA編05::線形メモリ or CUDA編05::cuArray?
まずはTexture Reference(テクスチャオブジェクトのこと)を作成する。
これによって、使用するテクスチャのデータ型は何なのか、次元数はいくつなのか…等を
CUDAに知らせることができる。
とりだすテクセル値のフォーマットを決める。
取り出す要素の型設定を行うために、「cudaChannelFormatDesc型」を用意する。
作成には、cudaCreateChannelDesc関数使う。
テクセル値を拾ってくる時のビット数。
例えば、
float型でテクセルを拾う時には、(x,y,z,w)=(32,0,0,0)。
float2型でテクセル値を拾う時には(x,y,z,w)=(32,32,0,0)
のような感じ(だったはず)。
【f】
どのようなデータ型か指定する。以下の3つが指定できる。
次>> CUDA編05::線形メモリ or CUDA編05::cuArray?
まずはTexture Reference(テクスチャオブジェクトのこと)を作成する。
これによって、使用するテクスチャのデータ型は何なのか、次元数はいくつなのか…等を
CUDAに知らせることができる。
「Texture Reference」は「texture型」というものを宣言する。
データの型を指定する。指定できるのは、基本的な整数型、単精度浮動小数点(float型)、
あるいは、CUDAで定義しているベクトル型(float2とか)。
【Dim】
次元数。1,2,3,が指定可能。デフォルトは1。
【ReadMode】
文字通り読み込みモードを指定する。
※『 cudaReadModeNormalizedFloat+(16bit or 8bitの整数型) 』を指定すると、
符号なしの場合は「0.0〜1.0」、符号あり場合は「-1.0〜1.0」の範囲になるように
正規化される。
texture<Type, Dim, ReadMode> texRef;【Type】
データの型を指定する。指定できるのは、基本的な整数型、単精度浮動小数点(float型)、
あるいは、CUDAで定義しているベクトル型(float2とか)。
【Dim】
次元数。1,2,3,が指定可能。デフォルトは1。
【ReadMode】
文字通り読み込みモードを指定する。
- cudaReadModeNormalizedFloat:正規化されたfloatで読み込む
- cudaReadModeElementType(デフォルト):指定要素の型で読み込む
※『 cudaReadModeNormalizedFloat+(16bit or 8bitの整数型) 』を指定すると、
符号なしの場合は「0.0〜1.0」、符号あり場合は「-1.0〜1.0」の範囲になるように
正規化される。
より正確にいうと「texture型」は次の構造体からの派生クラスである。
テクスチャのフィルタモードや、境界処理を指定することになる。
【normalized】
「0」以外を指定すると、テクスチャ座標が「0〜1」の範囲になる。
「0」の場合は、テクスチャのサイズそのものになる。
【filterMode】
フィルタモードを指定する。
【addressMode】
テクスチャ座標が範囲外の時の処理を指定する。
それぞれテクスチャ座標の要素では([0],[1],[2])=(s,t,r)に対応する。
【channelDesc】
後述。テクセル値のフォーマットを決める。
※これは、別に設定しておいて、cudaBindTexture()関数等でバインドして設定する。
【例】:2次元のfloat型のテクスチャオブジェクト
struct textureReference { int normalized; enum cudaTextureFilterMode filterMode; enum cudaTextureAddressMode addressMode[3]; struct cudaChannelFormatDesc channelDesc; };つまり、メンバ内のこれらの設定をするということは、
テクスチャのフィルタモードや、境界処理を指定することになる。
【normalized】
「0」以外を指定すると、テクスチャ座標が「0〜1」の範囲になる。
「0」の場合は、テクスチャのサイズそのものになる。
【filterMode】
フィルタモードを指定する。
- cudaFilterModePoint:最も近いテクスチャ座標を使用する
- cudaFilterModeLinear:線形補間フィルタ(返り値の型が浮動小数点数の場合のみ)
【addressMode】
テクスチャ座標が範囲外の時の処理を指定する。
それぞれテクスチャ座標の要素では([0],[1],[2])=(s,t,r)に対応する。
- cudaAddressModeClamp:クランプ型(範囲固定で丸めこむ)
- cudaAddressModeWrap:くりかえし型(正規化された座標系でのみOK)
【channelDesc】
後述。テクセル値のフォーマットを決める。
※これは、別に設定しておいて、cudaBindTexture()関数等でバインドして設定する。
【例】:2次元のfloat型のテクスチャオブジェクト
texture<float,2,cudaReadModeElementType> texRef; texRef.addressMode[0] = cudaAddressModeClamp; texRef.addressMode[1] = cudaAddressModeClamp; texRef.filterMode = cudaFilterModeLinear;//テクセルの返り値float型のみOK texRef.normalized = true;//正規化(0〜1)の範囲
とりだすテクセル値のフォーマットを決める。
取り出す要素の型設定を行うために、「cudaChannelFormatDesc型」を用意する。
作成には、cudaCreateChannelDesc関数使う。
//low-levelでの記述 ■struct cudaChannelFormatDesc cudaCreateChannelDesc (int x, int y, int z, int w, enum cudaChannelFormatKind f) //C++での記述 ■template<class T > cudaChannelFormatDesc cudaCreateChannelDesc (void)【x,y,z,w】
テクセル値を拾ってくる時のビット数。
例えば、
float型でテクセルを拾う時には、(x,y,z,w)=(32,0,0,0)。
float2型でテクセル値を拾う時には(x,y,z,w)=(32,32,0,0)
のような感じ(だったはず)。
【f】
どのようなデータ型か指定する。以下の3つが指定できる。
- cudaChannelFormatKindSigned:符号あり
- cudaChannelFormatKindUnsigned:符号なし
- cudaChannelFormatKindFloat:単精度浮動小数点(float型ということ)
low-levelの場合は、各引数に1つ1つ指定しなくてはいけない。
【例】:low-levelでの記述
しかし、C++版書き方では次のようになる
【例】:C++版の書き方
この場合は、上の【例】:low-levelでの記述と同じ結果を得る事ができる。
次>> CUDA編05::線形メモリ or CUDA編05::cuArray?
【例】:low-levelでの記述
cudaChannelFormatDesc channelDesc = cudaCreateChannelDesc(32,0,0,0,cudaChannelFormatKindFloat);
しかし、C++版書き方では次のようになる
【例】:C++版の書き方
cudaChannelFormatDesc channelDesc = cudaCreateChannelDesc<float>();与えられたテンプレート引数から自動的にやってくれる。
この場合は、上の【例】:low-levelでの記述と同じ結果を得る事ができる。
次>> CUDA編05::線形メモリ or CUDA編05::cuArray?