#version 440 #extension GL_GOOGLE_include_directive : enable #include "motionBlurWorkTile.inc" layout(set=0, binding=0) uniform texture2D inMotionMax; layout(set=0, binding=1) uniform texture2D inMotionMin; layout(set=0, binding=2) uniform sampler nearestSampler; layout(set=0, binding=3) buffer FullPathTileBuffer { WorkTiles fullPathTiles; }; layout(set=0, binding=4) buffer CopyPathTileBuffer { WorkTiles copyPathTiles; }; layout(set=0, binding=5) buffer FastPathTileBuffer { WorkTiles fastPathTiles; }; layout(local_size_x = 8, local_size_y = 8, local_size_z = 1) in; layout( push_constant ) uniform constants{ uint width; uint height; float fastPathThreshold; }; void main(){ ivec2 tileCoord = ivec2(gl_GlobalInvocationID.xy); if(any(greaterThanEqual(gl_GlobalInvocationID.xy, textureSize(sampler2D(inMotionMax, nearestSampler), 0)))) return; vec2 motionMax = texelFetch(sampler2D(inMotionMax, nearestSampler), tileCoord, 0).rg; vec2 motionMin = texelFetch(sampler2D(inMotionMin, nearestSampler), tileCoord, 0).rg; vec2 motionPixelMax = motionMax * vec2(width, height); vec2 motionPixelMin = motionMin * vec2(width, height); float velocityPixelMax = length(motionPixelMax); float minMaxDistance = distance(motionPixelMin, motionPixelMax); if(velocityPixelMax <= 0.5){ uint index = atomicAdd(copyPathTiles.tileCount, 1); copyPathTiles.tileXY[index] = tileCoord; } else if(minMaxDistance <= fastPathThreshold){ uint index = atomicAdd(fastPathTiles.tileCount, 1); fastPathTiles.tileXY[index] = tileCoord; } else{ uint index = atomicAdd(fullPathTiles.tileCount, 1); fullPathTiles.tileXY[index] = tileCoord; } }