我正在学习 OpenCL 中的内存缓冲区和图像。据我了解,OpenCL 中的图像只是一种抽象数据结构,与类似照片的图像(x、y、r、g、b 或 x、y、h、s、l、a , 管他呢)。
在我正在阅读的这本书中,它们提供了一个从 HDD 读取 .bmp 文件并将其转换为浮点数组的函数
然后他们将浮点数组写入 cl_mem 变量:
// GET THE .BMP AS A FLOAT[]
float* inputImage = readImage(inputFile, &imageWidth, &imageHeight);
// DEFINE THE IMAGE AND FORMAT
cl_image_desc desc;
desc.image_type = CL_MEM_OBJECT_IMAGE2D;
desc.image_width = imageWidth;
desc.image_height = imageHeight;
desc.image_depth = 0;
desc.image_array_size = 0;
desc.image_row_pitch = 0;
desc.image_slice_pitch = 0;
desc.num_mip_levels = 0;
desc.num_samples = 0;
desc.buffer = NULL;
cl_image_format format;
format.image_channel_order = CL_R;
format.image_channel_data_type = CL_FLOAT;
// DEFINE AND WRITE THE IMAGE
cl_mem d_inputImage = clCreateImage(context, CL_MEM_READ_ONLY, &format, &desc, NULL, NULL);
ize_t origin[3] = { 0, 0, 0 };
size_t region[3] = { imageWidth, imageHeight, 1 };
clEnqueueWriteImage(queue, d_inputImage, CL_FALSE, origin, region, 0, 0, inputImage, 0, NULL, NULL);
那么这是否告诉 OpenCL 我们正在处理类似照片的图像,或者我们只是定义了一个数据结构?在本书的内核中,他们使用:
// sourceImage is d_inputImage from the previous block of code. its type is image2d_t
float4 pixel;
pixel = read_imagef(sourceImage, sampler, coords);
sum.x += pixel.x * filter[filterIdx++];
OpenCL 只是松散地将这些数据结构用作类似照片的图像,还是以任何类似于 .NET 的方式,您可以从许多不同的来源创建位图对象,然后一旦有了该对象,您就可以用它做任何您想做的事情?