Hacker News new | ask | show | jobs
by leguminous 491 days ago
Using `mix()` isn't necessarily bad. Using boolean operations like `lessThan()` is probably better than `step()`. I just tested two ways of converting linear RGB to sRGB. On AMD, they compile to the same assembly.

Method 1.

    float linear_to_srgb(float v) {
        return v < 0.0031308 ? v * 12.92 : 1.055 * pow(v, 1.0 / 2.4) - 0.055;
    }
    
    vec3 linear_to_srgb(vec3 rgb) {
        return vec3(linear_to_srgb(rgb.r), linear_to_srgb(rgb.g), linear_to_srgb(rgb.b));
    }
Method 2:

    vec3 linear_to_srgb(vec3 rgb) {
        bvec3 cutoff = lessThan(rgb, vec3(0.0031308));
        vec3 upper = vec3(1.055) * pow(rgb, vec3(1.0 / 2.4)) - vec3(0.055);
        vec3 lower = rgb * vec3(12.92);
        return mix(upper, lower, cutoff);
    }