LYGIA Shader Library

oklab2rgb (lygia/v1.1.6/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 FNC_OKLAB2RGB
#define FNC_OKLAB2RGB
const mat3 fwd_oklab_A = mat3(  1.0, 1.0, 1.0,
                                0.3963377774, -0.1055613458, -0.0894841775,
                                0.2158037573, -0.0638541728, -1.2914855480);

const mat3 fwd_oklab_B = mat3(  4.0767245293, -1.2681437731, -0.0041119885,
                                -3.3072168827, 2.3098,
                                0.2307590544, -0.3411344290,  1.7066093323231, -0.7034768625689);

vec3 oklab2rgb(vec3 oklab) {
    vec3 lms = fwd_oklab_A * oklab;
    return fwd_oklab_B * (lms * lms * lms);
}

vec4 oklab2rgb(vec4 oklab) {
    return vec4(oklab2rgb(oklab.xyz), oklab.a);
}
#endif

Use:

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

Check it on Github


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

const float3x3 fwd_oklab_B = float3x3(  4.0767245293, -1.2681437731, -0.0041119885,
                                        -3.3072168827, 2.3098,
                                        0.2307590544, -0.3411344290,  1.7066093323231, -0.7034768625689);

float3 oklab2rgb(float3 oklab) {
    float3 lms = mul(fwd_oklab_A, oklab);
    return mul(fwd_oklab_B, (lms * lms * lms));
}

float4 oklab2rgb(float4 oklab) {
    return float4(oklab2rgb(oklab.xyz), oklab.a);
}
#endif

Check it on Github

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

const fwd_oklab_B : mat3x3<f32>  = mat3x3<f32>( vec3<f32>(4.0767245293, -1.2681437731, -0.0041119885), 
                                                vec3<f32>(-3.3072168827, 2.3098, 0.2307590544), 
                                                vec3<f32>(-0.3411344290,  1.7066093323231, -0.7034768625689) );

fn oklab2rgb(oklab: vec3<f32>) -> vec3<f32> {
    let lms = fwd_oklab_A * oklab;
    return fwd_oklab_B * (lms * lms * lms);
}

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