68 lines
1.4 KiB
GLSL
68 lines
1.4 KiB
GLSL
#[compute]
|
|
#version 450
|
|
|
|
#define FLT_MAX 3.402823466e+38
|
|
#define FLT_MIN 1.175494351e-38
|
|
|
|
layout(set = 0, binding = 0) uniform sampler2D tile_max;
|
|
layout(rgba16f, set = 0, binding = 1) uniform writeonly image2D tile_variance;
|
|
|
|
layout(push_constant, std430) uniform Params
|
|
{
|
|
float nan5;
|
|
float nan6;
|
|
float nan7;
|
|
float nan8;
|
|
int nan1;
|
|
int nan2;
|
|
int nan3;
|
|
int nan4;
|
|
} params;
|
|
|
|
layout(local_size_x = 16, local_size_y = 16, local_size_z = 1) in;
|
|
|
|
|
|
void main()
|
|
{
|
|
ivec2 render_size = ivec2(textureSize(tile_max, 0));
|
|
ivec2 uvi = ivec2(gl_GlobalInvocationID.xy);
|
|
if ((uvi.x >= render_size.x) || (uvi.y >= render_size.y))
|
|
{
|
|
return;
|
|
}
|
|
|
|
vec2 uvn = (vec2(uvi) + vec2(0.5)) / render_size;
|
|
|
|
float variance = 0;
|
|
|
|
vec2 current_velocity = abs(normalize(textureLod(tile_max, uvn, 0.0).xy));
|
|
|
|
float tile_count = 0;
|
|
|
|
for(int i = -1; i < 2; i++)
|
|
{
|
|
for(int j = -1; j < 2; j++)
|
|
{
|
|
vec2 current_offset = vec2(1) / vec2(render_size) * vec2(i, j);
|
|
vec2 current_uv = uvn + current_offset;
|
|
if(current_uv.x < 0 || current_uv.x > 1 || current_uv.y < 0 || current_uv.y > 1)
|
|
{
|
|
continue;
|
|
}
|
|
if(i == j && i == 0)
|
|
{
|
|
continue;
|
|
}
|
|
|
|
tile_count += 1;
|
|
|
|
vec2 current_neighbor_velocity = abs(normalize(textureLod(tile_max, current_uv, 0.0).xy));
|
|
|
|
variance += dot(current_velocity, current_neighbor_velocity);
|
|
}
|
|
}
|
|
|
|
variance /= tile_count;
|
|
|
|
imageStore(tile_variance, uvi, vec4(1 - variance));
|
|
} |