10

テクスチャメモリを使用しているときに、次のコードに遭遇しました:-

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);

私の質問は、なぜ0.5fとの両方に追加するのcですfか?これは私を混乱させます..ありがとう

4

2 に答える 2

15

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

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

ただし、テクスチャから読み取られる値がピクセル内で変化するのはfilterMode、テクスチャが設定されている場合のみです。cudaFilterModeLinearそのモードでは、ピクセルの正確な中心にない座標から読み取ると、特定のピクセルのサンプルと隣接するピクセルのサンプルの間で補間された値が返されます。したがって、整数座標に0.5を追加すると、cudaFilterModeLinearモードが事実上無効になります。filterModeただし、テクスチャ座標に0.5を追加するとカーネルでサイクルが発生するため、に設定して補間をオフにすることをお勧めしますcudaFilterModePoint。次に、ピクセル内の任意の座標から読み取ると、そのピクセルの正確なテクスチャサンプル値が返されるため、整数を使用してテクスチャサンプルを直接読み取ることができます。

を使用するcudaFilterModePoint場合、浮動小数点の計算にテクスチャ座標の計算が含まれる場合は、浮動小数点の不正確さがテクスチャ座標を目的のターゲットピクセルの範囲外にしないように注意する必要があります。

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

于 2012-05-19T17:34:32.157 に答える
1

テクスチャのプロパティによっては、によって返される値tex2Dが線形補間される場合があります。その場合、「指標」は整数fcはなく、各次元の限界間の連続値である必要があります。

この例で少し奇妙なのは、戻り値が整数であるということです。これにより、線形補間が区分的に一定になります。

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

于 2012-05-17T21:56:49.250 に答える