Я использую ядро, которое принимает INT_16 изображение в качестве ввода.
Я пытаюсь прочитать интерполированные значения из этого изображения, используя сэмплер, объявленный с CLK_FILTER_LINEAR .
У меня правильные значения с использованием метода read_imagei : например, если я читаю между пикселем «200» и пикселем «300», я получаю результат «220» (в зависимости от координат чтения)
Теперь я пытаюсь читать, используя read_imagef значения, чтобы получить более точные значения:
- изображение объявлено как CL_SNORM_INT16
- сэмплер объявлен с использованием CLK_FILTER_LINEAR
- считанные значения умножаются на 32767.0f (для преобразования из диапазона [-1.0; +1.0] CL_SNORM_INT16 в диапазон INT_16)
Здесь я могу прочитать те же значения, что и раньше (используя read_imagei).
Но я никогда не получаю значения, такие как "220.56" или "220.76", я всегда получаю округленные значения.
Точно так же, как если бы внутренняя интерполяция на GPU была вычислена с использованием регистров INT_16, а не регистров с плавающей запятой.
Я не видел ничего в спецификации OpenCL о том, как следует вычислять интерполяцию между значениями INT_16.
Вопрос:
Нормально ли всегда получать округленные значения, а не значения с плавающей запятой при использовании read_imagef из CL_SNORM_INT16 изображения, сэмплированного в режиме CLK_FILTER_LINEAR ?
(мне нужно использовать изображение INT_16 для ограничения использования памяти, но я хотел бы иметь точность точек с плавающей точкой в результатах интерполяции)