Spatial mosaic/pixelate shader, modify so pixels are relative to object?

:information_source: Attention Topic was automatically imported from the old Question2Answer platform.
:bust_in_silhouette: Asked By elvisish

Is it possible to modify this spatial mosaic shader so the pixel sizes are consistent with the distance of the object it’s applied to? I need the mosaic to be applied to only the mesh and nothing surrounding it (I’m currently using material_overlay) but at a distance the pixels are appear extremely large:


shader_type spatial;
render_mode unshaded;

uniform float size = 20.0;

void fragment( )
{
    vec2 p = floor( FRAGCOORD.xy / size ) * size;
    vec2 quat_x = vec2( size / 4.0, 0 );
    vec2 quat_y = vec2( 0, quat_x.x );
    ALBEDO = (
        texelFetch( SCREEN_TEXTURE, ivec2( p ), 0 ).xyz
    +    texelFetch( SCREEN_TEXTURE, ivec2( p + quat_x ), 0 ).xyz
    +    texelFetch( SCREEN_TEXTURE, ivec2( p + quat_x * 2.0 ), 0 ).xyz
    +    texelFetch( SCREEN_TEXTURE, ivec2( p + quat_x * 3.0 ), 0 ).xyz
    +    texelFetch( SCREEN_TEXTURE, ivec2( p + quat_y ), 0 ).xyz
    +    texelFetch( SCREEN_TEXTURE, ivec2( p + quat_y + quat_x ), 0 ).xyz
    +    texelFetch( SCREEN_TEXTURE, ivec2( p + quat_y + quat_x * 2.0 ), 0 ).xyz
    +    texelFetch( SCREEN_TEXTURE, ivec2( p + quat_y + quat_x * 3.0 ), 0 ).xyz
    +    texelFetch( SCREEN_TEXTURE, ivec2( p + quat_y * 2.0 ), 0 ).xyz
    +    texelFetch( SCREEN_TEXTURE, ivec2( p + quat_y * 2.0 + quat_x ), 0 ).xyz
    +    texelFetch( SCREEN_TEXTURE, ivec2( p + quat_y * 2.0 + quat_x * 2.0 ), 0 ).xyz
    +    texelFetch( SCREEN_TEXTURE, ivec2( p + quat_y * 2.0 + quat_x * 3.0 ), 0 ).xyz
    +    texelFetch( SCREEN_TEXTURE, ivec2( p + quat_y * 3.0 ), 0 ).xyz
    +    texelFetch( SCREEN_TEXTURE, ivec2( p + quat_y * 3.0 + quat_x ), 0 ).xyz
    +    texelFetch( SCREEN_TEXTURE, ivec2( p + quat_y * 3.0 + quat_x * 2.0 ), 0 ).xyz
    +    texelFetch( SCREEN_TEXTURE, ivec2( p + quat_y * 3.0 + quat_x * 3.0 ), 0 ).xyz
    ) / 16.0;
}