我是OpenCL的新手,但我有一个在OpenCL做的项目,我被卡住了。 我需要加载图像(bmp),将其投入GPU,更改一些像素并将其保存到新的bmp文件中。当我只是复制图像或反转红色/绿色调色板时,一切正常。但是当我试图将2,4,6 ....像素列更改为黑色时,我得到了错误: CL_INVALID_KERNEL_NAME。 正如我所说,我是一个新手,我缺乏想法。但我确信整个主要代码是100%有效的,问题在于内核:
#pragma OPENCL EXTENSION cl_khr_byte_addressable_store : enable
__kernel void image_change(__read_only image2d_t image1, __write_only image2d_t image2)
{
const sampler_t sampler=CLK_NORMALIZED_COORDS_FALSE | CLK_ADDRESS_CLAMP | CLK_FILTER_NEAREST;
int x = get_global_id(0);
int y = get_global_id(1);
int2 pixelcoord;
float4 pixel = read_imagef(image1, sampler, pixelcoord(x,y));
float4 blackpixel = (float4)(0,0,0,0);
width = get_image_width(image1);
height = get_image_height(image1);
for (pixelcoord.x=x-width; pixelcoord.x<width; pixelcoord.y++)
{
if(pixelcoord.x % 2 == 0)
{
for (pixelcoord.y=y-height; pixelcoord.y<height; pixelcoord.y++)
write_imagef(image2, pixelcoord, pixel);
}
else
{
for (pixelcoord.y=y-height; pixelcoord.y<height; pixelcoord.y++)
write_imagef(image2, pixelcoord, blackpixel);
}
}
}
我确信第一个“for”的代码中有一些不好的内容。
如果有人能指导我,我会很高兴。
答案 0 :(得分:1)
解决了!我发现了一个帖子,它解释了它是如何工作的。首先,我没有初始化宽度和高度(孩子的错误)。其余的更容易了。 代码:
__kernel void image_change(__read_only image2d_t image1, __write_only image2d_t image2)
{
const sampler_t sampler=CLK_NORMALIZED_COORDS_FALSE | CLK_ADDRESS_CLAMP | CLK_FILTER_NEAREST;
int width = get_image_width(image1);
int height = get_image_height(image1);
int2 pixelcoord = (int2) (get_global_id(0), get_global_id(1));
if (pixelcoord.x < width && pixelcoord.y < height)
{
float4 pixel = read_imagef(image1, sampler, (int2)(pixelcoord.x, pixelcoord.y));
float4 black = (float4)(0,0,0,0);
if (pixelcoord.x % 2== 1)
{
const float4 outColor = black;
write_imagef(image2, pixelcoord, outColor);
}
else
write_imagef(image2, pixelcoord, pixel);
}
}