Gamma 校正内核
让我们看一下伽马校正内核
__constant sampler_t sampler = CLK_NORMALIZED_COORDS_FALSE |
CLK_ADDRESS_CLAMP_TO_EDGE |
CLK_FILTER_LINEAR;
__kernel void Gamma(__read_only image2d_t input, __write_only image2d_t output, __constant float gamma) {
int2 gid = (int2)(get_global_id(0), get_global_id(1));
int2 size = get_image_dim(input);
if(all(gid < size)){
uint4 pixel = read_imageui(input, sampler, gid);
float4 color = convert_float4(pixel) / 255;
color = pow(color, (float4)(gamma));
pixel = convert_uint4_rte(color * 255);
write_imageui(output, gid, pixel);
}
}
现在让我们一步一步地浏览该代码。第一行在 sampler_t 类型的__constant 内存区域中创建一个变量。此采样器用于进一步指定对图像数据的访问。有关完整文档,请参阅 Khronos 文档。
在我们调用内核之前,我们将输入分配为 read_only,输出分配为 write_only,因此我们在此处添加这些修饰符。
image2d 和 image3d 总是在全局内存中分配,因此我们可以省略__global 修饰符。我们的 gamma 值位于__constant 内存中,因此我们也指定了它。
然后我们得到我们的线程 id,它定义了我们要进行伽玛校正的像素。我们还查询大小以确保我们的线程不访问未分配的内存。如果你忘记了,这将定义你的内核崩溃。
在我们确定我们是合法线程之后,我们从输入图像中读取了像素。然后我们将它转换为 float 以避免丢失小数位,进行一些计算,将其转换回来并将其写入输出。