game_kernel 0.1.0

A 3D game engine written entirely in rust
Documentation
#version 450

layout(local_size_x = 16, local_size_y = 16, local_size_z = 1) in;

layout(set = 0, binding = 0) uniform sampler2D hdr;
layout(set = 0, binding = 1) uniform sampler2D ui;
layout(set = 0, binding = 2) uniform writeonly image2D ldr_output;

vec3 reinhard(vec3 original)
{
    return original / (original+vec3(1.0));
}

vec3 aces_filmic(vec3 original)
{
    float a = 2.51f;
    float b = 0.03f;
    float c = 2.43f;
    float d = 0.59f;
    float e = 0.14f;
    return clamp((original*(a*original+b))/(original*(c*original+d)+e), 0.0, 1.0);
}

vec3 u2_filmic(vec3 x)
{
    float A = 0.22f,
          B = 0.30f,
          C = 0.10f,
          D = 0.20f,
          E = 0.01f,
          F = 0.30;

    return ((x*(A*x+C*B)+D*E)/(x*(A*x+B)+D*F)) - E/F;
}

vec3 gamma_correction(vec3 original)
{
    return pow(original, vec3(1.0 / 2.2));
}

void main()
{
    ivec2 res = textureSize(hdr, 0);
    if(gl_GlobalInvocationID.x > res.x || gl_GlobalInvocationID.y > res.y)
        return;

    ivec2 p_coords = ivec2(gl_GlobalInvocationID.xy);
    vec4 ldr = vec4(gamma_correction(u2_filmic(texelFetch(hdr, p_coords, 0).xyz)), 1.0);
    //vec4 ui = texelFetch(ui, p_coords, 0).xyzw;
    imageStore(ldr_output, p_coords, /*mix(ui, ldr, ui.w)*/ldr);
}