62 lines
1.6 KiB
GLSL
62 lines
1.6 KiB
GLSL
#[compute]
|
|
#version 450
|
|
|
|
layout(local_size_x = 8, local_size_y = 8, local_size_z = 1) in;
|
|
|
|
layout(rgba16, set = 0, binding = 0)
|
|
uniform restrict readonly image2D inputImage;
|
|
|
|
layout(rgba16, set = 1, binding = 0)
|
|
uniform restrict writeonly image2D outputImage;
|
|
|
|
layout(std430, set = 2, binding = 0)
|
|
buffer restrict readonly JumpDistanceBuffer { int jump; } jdb;
|
|
|
|
void main()
|
|
{
|
|
ivec2 currentPosition = ivec2( gl_GlobalInvocationID.xy );
|
|
ivec2 imageSize = imageSize( inputImage );
|
|
|
|
float distanceToClosestSeed = 1.0f / 0.0f;
|
|
vec4 closestSeed = vec4( unpackUnorm2x16( 0 ), unpackUnorm2x16( 0 ) );
|
|
|
|
ivec2 jdbJump = ivec2( jdb.jump, jdb.jump );
|
|
|
|
for ( int x = -1; x <= 1; x++ )
|
|
{
|
|
for ( int y = -1; y <= 1; y++ )
|
|
{
|
|
ivec2 xy = ivec2( x, y );
|
|
|
|
ivec2 checkPosition = currentPosition + jdbJump * xy;
|
|
|
|
if ( checkPosition.x < 0 || checkPosition.y < 0 ||
|
|
checkPosition.x >= imageSize.x || checkPosition.y >= imageSize.y )
|
|
{
|
|
continue;
|
|
}
|
|
|
|
vec4 checkPixel = imageLoad( inputImage, checkPosition );
|
|
float checkSeedX = float( packUnorm2x16( checkPixel.xy ) );
|
|
float checkSeedY = float( packUnorm2x16( checkPixel.zw ) );
|
|
|
|
vec2 checkSeedPosition = vec2( checkSeedX, checkSeedY );
|
|
|
|
if ( checkSeedPosition.x == 0.0f && checkSeedPosition.y == 0.0f )
|
|
{
|
|
continue;
|
|
}
|
|
|
|
float distanceToSeed = distance( vec2( currentPosition ), checkSeedPosition );
|
|
|
|
if ( distanceToSeed < distanceToClosestSeed )
|
|
{
|
|
distanceToClosestSeed = distanceToSeed;
|
|
closestSeed = checkPixel;
|
|
}
|
|
}
|
|
}
|
|
|
|
imageStore( outputImage, currentPosition, closestSeed );
|
|
}
|