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 ) ); }