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 以避免丟失小數位,進行一些計算,將其轉換回來並將其寫入輸出。