// Phantom Input DCTL - Linearise Phantom Log 1 or 2
DEFINE_UI_PARAMS(p_SPACE, Input, DCTLUI_COMBO_BOX, 0, { PLOG1, PLOG2, PLOG2A }, { Phantom Log 1, Phantom Log 2, Alt Phantom Log 2 })
DEFINE_UI_PARAMS(EXPOSURE, Exposure, DCTLUI_SLIDER_FLOAT, 0, -5, 5, 0.001)
// Phantom Log1 to linear
__DEVICE__ float3 Log1ToLinear(float3 log1) {
const float r = log1.x > 0.182f ? _expf((log1.x - 0.377675f) / 0.182f) / 30.0f: 0.0625f * log1.x;
const float g = log1.y > 0.182f ? _expf((log1.y - 0.377675f) / 0.182f) / 30.0f: 0.0625f * log1.y;
const float b = log1.z > 0.182f ? _expf((log1.z - 0.377675f) / 0.182f) / 30.0f: 0.0625f * log1.z;
return make_float3(r, g, b);
}
// Phantom Log2 to linear
__DEVICE__ float3 Log2ToLinear(float3 log2) {
const float r = log2.x > 0.158f ? _expf((log2.x - 0.459732f) / 0.158f) / 30.0f: 0.03125 * log2.x;
const float g = log2.y > 0.158f ? _expf((log2.y - 0.459732f) / 0.158f) / 30.0f: 0.03125 * log2.y;
const float b = log2.z > 0.158f ? _expf((log2.z - 0.459732f) / 0.158f) / 30.0f: 0.03125 * log2.z;
return make_float3(r, g, b);
}
// Tweaked Phantom Log2 to linear
__DEVICE__ float3 Log2aToLinear(float3 log2a) {
const float r = log2a.x > 0.1593f ? _expf((log2a.x - 0.4609f) / 0.1593f) / 30.0f: 0.03125 * log2a.x;
const float g = log2a.y > 0.1593f ? _expf((log2a.y - 0.4609f) / 0.1593f) / 30.0f: 0.03125 * log2a.y;
const float b = log2a.z > 0.1593f ? _expf((log2a.z - 0.4609f) / 0.1593f) / 30.0f: 0.03125 * log2a.z;
return make_float3(r, g, b);
}
// Apply chosen Log to Linear Transform followed by exposure
__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 = make_float3(p_R, p_G, p_B);
float3 result;
if (p_SPACE == PLOG1) {
result = Log1ToLinear(rgb);
}
else if (p_SPACE == PLOG2) {
result = Log2ToLinear(rgb);
}
else if (p_SPACE == PLOG2A) {
result = Log2aToLinear(rgb);
}
result = result * pow(2.0, EXPOSURE);
return result;
}