LYGIA Shader Library

oklab2rgb (lygia/color/space/oklab2rgb)

Oklab to linear RGB https://bottosson.github.io/posts/oklab/

Use:

<vec3\vec4> oklab2rgb(<vec3|vec4> oklab)

Check it on Github


#ifndef MAT_OKLAB2RGB
#define MAT_OKLAB2RGB
const mat3 OKLAB2RGB_A = mat3(
    1.0,           1.0,           1.0,
    0.3963377774, -0.1055613458, -0.0894841775,
    0.2158037573, -0.0638541728, -1.2914855480);

const mat3 OKLAB2RGB_B = mat3(
    4.0767416621, -1.2684380046, -0.0041960863,
    -3.3077115913, 2.6097574011, -0.7034186147,
    0.2309699292, -0.3413193965, 1.7076147010);
#endif

#ifndef FNC_OKLAB2RGB
#define FNC_OKLAB2RGB
vec3 oklab2rgb(const in vec3 oklab) {
    vec3 lms = OKLAB2RGB_A * oklab;
    return OKLAB2RGB_B * (lms * lms * lms);
}
vec4 oklab2rgb(const in vec4 oklab) { return vec4(oklab2rgb(oklab.xyz), oklab.a); }
#endif

Use:

<float3\float4> oklab2rgb(<float3|float4> oklab)

Check it on Github


#ifndef MAT_OKLAB2RGB
#define MAT_OKLAB2RGB
const float3x3 OKLAB2RGB_A = float3x3(
    1.0,           1.0,           1.0,
    0.3963377774, -0.1055613458, -0.0894841775,
    0.2158037573, -0.0638541728, -1.2914855480);

const float3x3 OKLAB2RGB_B = float3x3(
    4.0767416621, -1.2684380046, -0.0041960863,
    -3.3077115913, 2.6097574011, -0.7034186147,
    0.2309699292, -0.3413193965, 1.7076147010);
#endif

#ifndef FNC_OKLAB2RGB
#define FNC_OKLAB2RGB
float3 oklab2rgb(float3 oklab) {
    float3 lms = mul(OKLAB2RGB_A, oklab);
    return mul(OKLAB2RGB_B, (lms * lms * lms));
}
float4 oklab2rgb(float4 oklab) { return float4(oklab2rgb(oklab.xyz), oklab.a); }
#endif

Check it on Github


const OKLAB2RGB_A : mat3x3<f32>  = mat3x3<f32>(
    vec3f(1.0, 1.0, 1.0),
    vec3f(0.3963377774, -0.1055613458, -0.0894841775),
    vec3f(0.2158037573, -0.0638541728, -1.2914855480) );

const OKLAB2RGB_B : mat3x3<f32>  = mat3x3<f32>(
    vec3f(4.0767416621, -1.2684380046, -0.0041960863),
    vec3f(-3.3077115913, 2.6097574011, -0.7034186147),
    vec3f(0.2309699292, -0.3413193965, 1.7076147010) );

fn oklab2rgb(oklab: vec3f) -> vec3f {
    let lms = OKLAB2RGB_A * oklab;
    return OKLAB2RGB_B * (lms * lms * lms);
}

Licenses

LYGIA is dual-licensed under the Prosperity License and the Patron License for sponsors and contributors.

Sponsors and contributors are automatically added to the Patron License and they can ignore the any non-commercial rule of the Prosperity Licensed software (please take a look to the exception).

It's also possible to get a permanent comercial license hook to a single and specific version of LYGIA.

Get the latest news and releases

Sign up for the news letter bellow, joing the LYGIA's channel on Discord or follow the Github repository