グラフィックスでは、テクスチャはサーフェスの外観を表すサンプルのセットです。サンプルはポイントです。つまり、サイズはありません(物理的なサイズを持つピクセルとは対照的に)。サンプルを使用してピクセルの色を決定する場合、各サンプルは対応するピクセルの正確な中央に配置されます。整数座標を持つピクセルを扱うとき、与えられたピクセルの正確な中心は、(各次元の)0.5のオフセットを加えた整数座標になります。
つまり、テクスチャ座標に0.5を追加すると、それらの座標から読み込むときに、そのピクセルのサンプルの正確な値が返されます。
ただし、テクスチャのfilterMode
がcudaFilterModeLinear
に設定されている場合にのみ、テクスチャから読み取られる値がピクセル内で変化することがあります。そのモードでは、ピクセルの正確な中心にない座標からの読み取りは、指定されたピクセルのサンプルと近傍のピクセルのサンプルの間で補間された値を返します。したがって、整数の座標に0.5を加算すると、cudaFilterModeLinear
モードが無効になります。しかし、テクスチャ座標に0.5を加えるにはカーネルでサイクルがかかるので、filterMode
をcudaFilterModePoint
に設定して補間を単にオフにする方が良いでしょう。次に、ピクセル内の任意の座標から読み取ると、そのピクセルの正確なテクスチャサンプル値が返されるため、テクスチャサンプルは整数を使用して直接読み取ることができます。
cudaFilterModePoint
を使用する場合は、浮動小数点演算がテクスチャ座標の計算に関与する場合、浮動小数点の不正確さによってテクスチャ座標が目的のピクセルの範囲外にならないように注意する必要があります。
また、コメントに記載されているように、コードに問題がある可能性があります。テクスチャ座標に0.5fを追加すると、cudaFilterModeLinear
モードが使用されていますが、そのモードはintではなくfloatを返します。
あなたは、テクスチャの座標は実際にピクセル中心を指していると言っています。座標0,0の要素にアクセスしてスキームを使用すると、1,1ピクセルになります。 – geek
@ marina.k:あなたが何を意味するのか分かりません。答えに問題はありますか? –
@Roger Dahlありがとう、とても素敵な答え。 浮動小数点の不正確さによって、座標が目的のピクセルの範囲外になることがありますか?浮動小数点の精度はどういう意味ですか? –