現在地 >> メニュー >> CUDA >> CUDA編05 >> CUDA編05::TextureReference
次>> CUDA編05::線形メモリ or CUDA編05::cuArray?

Texture Reference


まずはTexture Reference(テクスチャオブジェクトのこと)を作成する。
これによって、使用するテクスチャのデータ型は何なのか、次元数はいくつなのか…等を
CUDAに知らせることができる。

texture型

「Texture Reference」は「texture型」というものを宣言する。

texture<Type, Dim, ReadMode> texRef;
【Type】
データの型を指定する。指定できるのは、基本的な整数型、単精度浮動小数点(float型)、
あるいは、CUDAで定義しているベクトル型(float2とか)。

【Dim】
次元数。1,2,3,が指定可能。デフォルトは1。

【ReadMode】
文字通り読み込みモードを指定する。
  • cudaReadModeNormalizedFloat:正規化されたfloatで読み込む
  • cudaReadModeElementType(デフォルト):指定要素の型で読み込む
の2つが指定可能。

※『 cudaReadModeNormalizedFloat+(16bit or 8bitの整数型) 』を指定すると、
符号なしの場合は「0.0〜1.0」、符号あり場合は「-1.0〜1.0」の範囲になるように
正規化される。


各種フィルタなど設定

より正確にいうと「texture型」は次の構造体からの派生クラスである。
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型


とりだすテクセル値のフォーマットを決める。
取り出す要素の型設定を行うために、「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での記述
cudaChannelFormatDesc channelDesc = cudaCreateChannelDesc(32,0,0,0,cudaChannelFormatKindFloat);

しかし、C++版書き方では次のようになる
【例】:C++版の書き方
cudaChannelFormatDesc channelDesc = cudaCreateChannelDesc<float>();
与えられたテンプレート引数から自動的にやってくれる。
この場合は、上の【例】:low-levelでの記述と同じ結果を得る事ができる。


次>> CUDA編05::線形メモリ or CUDA編05::cuArray?

目次

― その他 ―

Wiki内検索

計測中...(07.10.8〜)

Save The World






▲よろしければ広告のクリックもお願いします


▲ランキングに参加しました

管理人/副管理人のみ編集できます