/* * brick.sl * * Description: * The displacement shader that generates brick pattern using whichtile * and turbulence technique. * * Parameters: freq: numbers of brick per row and column. * Km: Km of brick. * dfreq: number of freq for turbulence. * flatness: flatness of surface. * * Author: Akanee Mahasith * */ #include "rmannotes.sl" displacement brick(float Km = 0.1, freq = 4; float dfreq = 7, flatness = 3; ) { float surface_mag, layer_mag; float ss, tt; float fuzz = .05; float row, col; float magnitude; point PP; float width, cutoff, fade, f, turb, maxfreq = 10; /* background layer */ surface_mag = 0; /* repeat pattern 'freq' times horizontally & vertically */ ss = repeat(s, freq); tt = repeat(t, freq); col = whichtile(s, freq); row = whichtile(t, freq); if (even(row) && odd(col) || even(col) && odd(row)) { /* layer 1 */ layer_mag = pulse(0.05, 0.95, fuzz, tt); surface_mag += layer_mag; } else { /* layer 2 */ layer_mag = difference(pulse(0.05, 0.95, fuzz, tt), pulse(0.45, 0.55, fuzz, ss)); surface_mag += layer_mag; } /* compute turbulence */ PP = transform("shader", P) * dfreq; width = filterwidth_point(PP); cutoff = clamp(0.5 / width, 0, maxfreq); turb = 0; for (f = 1; f < 0.5 * cutoff; f *= 2) turb += abs(snoise(PP * f)) / f; fade = clamp(2 * (cutoff - f) / cutoff, 0, 1); turb += fade * abs(snoise(PP * f)) / f; /* raise to power to create flat areas */ magnitude = pow(turb, flatness); surface_mag -= magnitude; /* output */ P += Km * normalize(N) * surface_mag; N = calculatenormal(P); }