// mcpro24fps HLG 95% to Rec.709 // ver. 2020-04-13 __CONSTANT__ float A = 0.17883277; __CONSTANT__ float B = 0.28466892; __CONSTANT__ float C = 0.55991073; __CONSTANT__ float BLACK = 0.02; __CONSTANT__ float WHITE = 0.95; __DEVICE__ float3 transform(int p_Width, int p_Height, int p_X, int p_Y, float p_R, float p_G, float p_B) { float3 rgb; rgb.x = p_R; rgb.y = p_G; rgb.z = p_B; //HLG 95 if(rgb.x < BLACK) rgb.x = 0.0; else { rgb.x = (rgb.x - BLACK)/(WHITE - BLACK); rgb.x = rgb.x < 0.5 ? _powf(rgb.x,2.0)/3.0 : (_expf((rgb.x-C)/A) + B)/12.0; } if(rgb.y < BLACK) rgb.y = 0.0; else { rgb.y = (rgb.y - BLACK)/(WHITE - BLACK); rgb.y = rgb.y < 0.5 ? _powf(rgb.y,2.0)/3.0 : (_expf((rgb.y-C)/A) + B)/12.0; } if(rgb.z < BLACK) rgb.z = 0.0; else { rgb.z = (rgb.z - BLACK)/(WHITE - BLACK); rgb.z = rgb.z < 0.5 ? _powf(rgb.z,2.0)/3.0 : (_expf((rgb.z-C)/A) + B)/12.0; } //Rec.709 rgb.x = rgb.x < 0.018 ? 4.5*rgb.x : 1.099*_powf(rgb.x, 0.45f) - 0.099; rgb.y = rgb.y < 0.018 ? 4.5*rgb.y : 1.099*_powf(rgb.y, 0.45f) - 0.099; rgb.z = rgb.z < 0.018 ? 4.5*rgb.z : 1.099*_powf(rgb.z, 0.45f) - 0.099; return rgb; }