Текстурная память-основы 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);
мой вопрос в том, почему мы добавляем 0.5f
как c
и f
?
Это сбивает меня с толку..
спасибо
2 ответов
в графике текстура представляет собой набор образцов, описывающих внешний вид поверхности. Образец-это точка. То есть, он не имеет размер (в отличие от пикселя, который имеет физический размер). При использовании выборок для определения цвета пикселей каждая выборка располагается в точном центре соответствующего пикселя. При адресации пикселей с координатами целого числа точный центр для данного пикселя становится его координатой целого числа плюс смещение 0,5 (в каждом измерение.)
другими словами, добавление 0.5 к координатам текстуры гарантирует, что при чтении из этих координат возвращается точное значение образца для этого пикселя.
однако, это только когда filterMode
для текстуры установлено значение cudaFilterModeLinear
значение, считываемое из текстуры, изменяется в пределах пикселя. В этом режиме чтение из координат, которые не находятся в точном центре пикселя, возвращает значения, интерполированные между образцом для данного пиксель и образцы для соседних пикселей. Таким образом, добавление 0.5 ко всем координатам числа эффективно отрицает cudaFilterModeLinear
режим. Но, поскольку добавление 0.5 к координатам текстуры занимает циклы в ядре, лучше просто отключить интерполяцию, установив filterMode
до cudaFilterModePoint
. Затем чтение из любой координаты в пикселе возвращает точное значение образца текстуры для этого пикселя, и поэтому образцы текстуры можно читать непосредственно с помощью целых чисел.
при использовании cudaFilterModePoint
, если какая-либо математика с плавающей запятой участвует в вычислении координат текстуры, необходимо позаботиться о том, чтобы неточности с плавающей запятой не заставляли координаты текстуры выходить за пределы диапазона для целевого пикселя.
кроме того, как упоминают комментарии, в вашем коде может быть проблема. Добавление 0.5 f к координатам текстуры подразумевает, что cudaFilterModeLinear
используется режим, но этот режим возвращает float, а не int.
В зависимости от свойств текстуры, значение, возвращаемое tex2D
может быть линейно интерполированы. "Индексы"f
и - это не целые числа, а непрерывные значения между пределами каждого измерения.
что немного странно в этом примере, так это то, что возвращаемое значение является целым числом, которое в любом случае сделает любой линейный интерполятор кусочно-постоянным.
для получения более подробной информации см. раздел 3.2.10 руководства по программированию CUDA.