Я делаю линейную интерполяцию с OpenCL, но результат не такой, как ожидалось. Поэтому я сделал простой тест, код ядра показан ниже:
const sampler_t sampler = CLK_NORMALIZED_COORDS_TRUE | CLK_FILTER_LINEAR | CLK_ADDRESS_CLAMP_TO_EDGE;
// Kernel block.
kernel void interpolate(
global float4*input,
image3d_t image,
global float4*output)
{
size_t i = get_global_id(0);
float4 coord = input[i];
float4 tap = read_imagef(image, sampler, coord);
output[i] = tap;
}
Пиксели (в RGBA) изображения 2x2x2, как показано ниже:
cl_float4 image_data[8] = {
{0, 0, 0, 0},
{100, 0, 0, 0},
{0, 100, 0, 0},
{100, 100, 0, 0},
{0, 0, 100, 0},
{100, 0, 100, 0},
{0, 100, 100, 0},
{100, 100, 100, 0},
};
Я использовал 11 координат ((0, 0, 0), (0,1, 0,1, 0,1)... (1, 1, 1), от 0 до 1 с шагом 0,1), чтобы прочитать изображение, и я ожидаю, что результаты будут быть (0, 0, 0), (10, 10, 10)... (100, 100, 100), но я получил:
coordinate:0.000000, result: 0.000000
coordinate:0.100000, result: 0.000000
coordinate:0.200000, result: 0.000000
coordinate:0.300000, result: 10.156250
coordinate:0.400000, result: 30.078125
coordinate:0.500000, result: 50.000000
coordinate:0.600000, result: 69.921875
coordinate:0.700000, result: 89.843750
coordinate:0.800000, result: 100.000000
coordinate:0.900000, result: 100.000000
coordinate:1.000000, result: 100.000000
Он просто возвращает значение края, когда координаты меньше 0,25 или больше 0,75.
Кто-нибудь может это объяснить? Спасибо.