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 以避免丢失小数位,进行一些计算,将其转换回来并将其写入输出。