2012-05-17 15 views
8

を私は次のコードに遭遇しているテクスチャメモリを使用している間: -テクスチャメモリtex2Dの基本

uint f = (blockIdx.x * blockDim.x) + threadIdx.x; 
uint c = (blockIdx.y * blockDim.y) + threadIdx.y; 

uint read = tex2D(refTex, c+0.5f, f+0.5f); 

私の質問は、なぜ私たちはcfの両方に0.5fを追加しますか? これは混乱します。 thankyou

答えて

14

グラフィックスでは、テクスチャはサーフェスの外観を表すサンプルのセットです。サンプルはポイントです。つまり、サイズはありません(物理的なサイズを持つピクセルとは対照的に)。サンプルを使用してピクセルの色を決定する場合、各サンプルは対応するピクセルの正確な中央に配置されます。整数座標を持つピクセルを扱うとき、与えられたピクセルの正確な中心は、(各次元の)0.5のオフセットを加えた整数座標になります。

つまり、テクスチャ座標に0.5を追加すると、それらの座標から読み込むときに、そのピクセルのサンプルの正確な値が返されます。

ただし、テクスチャのfilterModecudaFilterModeLinearに設定されている場合にのみ、テクスチャから読み取られる値がピクセル内で変化することがあります。そのモードでは、ピクセルの正確な中心にない座標からの読み取りは、指定されたピクセルのサンプルと近傍のピクセルのサンプルの間で補間された値を返します。したがって、整数の座標に0.5を加算すると、cudaFilterModeLinearモードが無効になります。しかし、テクスチャ座標に0.5を加えるにはカーネルでサイクルがかかるので、filterModecudaFilterModePointに設定して補間を単にオフにする方が良いでしょう。次に、ピクセル内の任意の座標から読み取ると、そのピクセルの正確なテクスチャサンプル値が返されるため、テクスチャサンプルは整数を使用して直接読み取ることができます。

cudaFilterModePointを使用する場合は、浮動小数点演算がテクスチャ座標の計算に関与する場合、浮動小数点の不正確さによってテクスチャ座標が目的のピクセルの範囲外にならないように注意する必要があります。

また、コメントに記載されているように、コードに問題がある可能性があります。テクスチャ座標に0.5fを追加すると、cudaFilterModeLinearモードが使用されていますが、そのモードはintではなくfloatを返します。

+0

あなたは、テクスチャの座標は実際にピクセル中心を指していると言っています。座標0,0の要素にアクセスしてスキームを使用すると、1,1ピクセルになります。 – geek

+0

@ marina.k:あなたが何を意味するのか分かりません。答えに問題はありますか? –

+0

@Roger Dahlありがとう、とても素敵な答え。 浮動小数点の不正確さによって、座標が目的のピクセルの範囲外になることがありますか?浮動小数点の精度はどういう意味ですか? –

0

テクスチャのプロパティによっては、tex2Dによって返される値が直線的に補間される場合があります。したがって、「指標」fおよびcは整数ではなく、各次元の限界間の連続値です。

この例で少し奇妙なのは、戻り値が任意の線形補間を区分的に定数にする整数であることです。

詳細については、「CUDAプログラミングガイド」のセクション3.2.10を参照してください。

+0

"' cudaFilterModeLinear'は浮動小数点型の戻り値に対してのみ有効です。 "、したがって補間はできません。' cudaFilterModePoint'のみ – aland

+0

@aland:正しいですが、どのタイプ'refTex'は、' float'や 'int'などで宣言されています。 – Pedro

+0

0.0〜1.0以外の座標を使用すると、 'cudaFilterModePoint'にはなりません – geek