rj-action-library/Runtime/Rendering/CompositorEffects/RadialBlur/RadialBlurShader.glsl

48 lines
1.4 KiB
GLSL

#[compute]
#version 450
layout( local_size_x = 32, local_size_y = 32, local_size_z = 1 ) in;
layout( rgba16f, set = 0, binding = 0 )
uniform image2D color_image;
layout( push_constant, std430 )
uniform Params
{
vec2 center; // 8 bytes
float radius; // 4 bytes
float intensity; // 4 bytes
float samples; // 4 bytes ( will be cast to int )
vec2 _padding; // 8 bytes ( matches 32-byte total )
} params;
void main( )
{
ivec2 img_size = imageSize( color_image );
ivec2 texel_coord = ivec2( gl_GlobalInvocationID.xy );
if ( any( greaterThanEqual( texel_coord, img_size ) ) )
{
return;
}
vec2 uv = ( vec2( texel_coord ) + 0.5 ) / vec2( img_size );
vec2 dir = normalize( uv - params.center );
int num_samples = int( clamp( params.samples, 1.0, 64.0 ) );
vec4 color = vec4( 0.0 );
for ( int i = 0; i < num_samples; i++ )
{
float t = float( i ) / float( num_samples );
vec2 sample_uv = clamp( uv + dir * t * params.radius, vec2( 0.0 ), vec2( 1.0 ) );
ivec2 sample_coord = ivec2( sample_uv * vec2( img_size ) );
sample_coord = clamp( sample_coord, ivec2( 0 ), img_size - ivec2( 1 ) );
color += imageLoad( color_image, sample_coord );
}
color /= float( num_samples );
vec4 original_color = imageLoad( color_image, texel_coord );
imageStore( color_image, texel_coord, mix( original_color, color, params.intensity ) );
}