surface tilespec( float Ks = 0.5, Kd = 0.5, Ka = 1, frequency = 100;
    color groutcolor = color ( 0.8, 0.8, 0.8 ), 
    lightspec = color( 0.8, 1, 0.8 ), darkspec = color( 0, 0.2, 0 ) )
{
    float smod = mod( s * frequency, 1 );
    float tmod = mod( t * frequency, 1 );
    point Nf = faceforward( normalize( N ), I );
    point V = normalize( -I );
    varying float napfreq, speckle, pixelsize;
    
    if( smod < 0.05  ||  tmod < 0.05 )
    {
        Ci = groutcolor;
    }
    else
    {
        napfreq = 0.05;      /* scale up speckle frequency */
        speckle = noise(transform("shader",P)/napfreq);
        speckle = speckle * speckle;
        speckle = (speckle <= 0.25) ? 0.2 : 1;
        pixelsize = sqrt(area(transform("shader",P)));
        //printf( "%f  ", napfreq/pixelsize );
        if (speckle != 1 )
            speckle = (1-smoothstep(0,1,napfreq/pixelsize))
                *(1-speckle) + speckle;
        Ci = Cs * lightspec * speckle ;
//        printf( "%f  ", speckle );
    }
    
    Oi = Os;
    Ci = Oi * Ci * ( Ka * ambient( ) + Kd * diffuse( Nf ) +
        Ks * specular( Nf, V, 0.25 ) );
}