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:
/*
Mosaic shader for 3D spatial by Yui Kinomoto @arlez80
3Dモデル用モザイクシェーダー by あるる(きのもと 結衣)
size = tile size
MIT License
*/
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;
}
Here's a reddit post with someone requesting the same thing: