kiyo 0.0.7

Lightweight compute shader playground
Documentation
#version 450

/*
 * Kiyo data
 * - WORKGROUP_SIZE and NUM_IMAGES are provided by the engine
 */

layout ( local_size_x = WORKGROUP_SIZE, local_size_y = WORKGROUP_SIZE, local_size_z = 1 ) in;
layout( binding = 0, rgba8 ) uniform image2D images[NUM_IMAGES];
layout( push_constant ) uniform PushConstants
{
    float time;
    int in_image;
    int out_image;
} constants;

/*
 * User data
 */

void main()
{
    ivec2 p = ivec2( gl_GlobalInvocationID.xy );
    ivec2 screenSize = imageSize( images[constants.in_image] );
    if( p.x > screenSize.x || p.y > screenSize.y )
    {
        return;
    }

    float kernel[9];
    // Top row
    kernel[0] = 1.f;
    kernel[1] = 2.f;
    kernel[2] = 1.f;

    // Middle row
    kernel[3] = 2.f;
    kernel[4] = 4.f;
    kernel[5] = 2.f;

    // Bottom row
    kernel[6] = 1.f;
    kernel[7] = 2.f;
    kernel[8] = 1.f;

    float sum = 0.f;
    for(int i=0; i<9; ++i)
    {
        sum += kernel[i];
    }
    for(int i=0; i<9; ++i)
    {
        kernel[i] /= sum;
    }

    // Blur
    vec4 c = vec4( 0.0f );
    int range = 1;
    for( int x = -range; x <= range; x++ )
    {
        for( int y = -range; y <= range; y++ )
        {
            ivec2 offset = ivec2( x, y );
            float k = kernel[ x + range + ( y + range ) * 3 ];
            vec4 neighbor = imageLoad( images[constants.in_image], p + offset );
            c += neighbor;
        }
    }

    c /= pow( range * 2 + 1, 2 );

    imageStore( images[constants.out_image], p, c );
}