home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Hall of Fame
/
HallofFameCDROM.cdr
/
proglc
/
ddj1188.lzh
/
UPSTILL.ASC
< prev
Wrap
Text File
|
1988-10-21
|
4KB
|
153 lines
_PHOTOREALISM AND COMPUTER GRAPHICS_
by
Steve Upstill
[EXAMPLE 1]
surface
marble( float Kd=.5, Ka=.1;
color veincolor=0)
{
float khi ;
point fnormal ;
color surfcolor ;
point freq = 4 * P;
float turbulence = 0;
float amplitude = 1, octave;
/* Make sure the eye-vector points the right way */
fnormal = faceforward( normalize(N), I ) ;
/* Accumulate a 3-dimensional noise function over 6 octaves,
weighting each by 1/f. */
for(octave = 0; octave < 6; octave = octave + 1 ) {
turbulence = turbulence +
amplitude * abs(.5 - noise(freq));
amplitude = amplitude * .5;
freq = freq * 2;
}
turbulence = 0.5 + 0.5 * sin(6*(xcomp(P)+turbulence)) ;
/* sharpen peaks */
turbulence = turbulence * turbulence * turbulence;
/* map discontinuously to vein colors */
khi = clamp((turbulence-0.5)*4, 0, 1);
surfcolor = (1-khi)*Cs + khi*veincolor;
Ci = surfcolor*(Ka*ambient() + Kd*diffuse(N));
}
[EXAMPLE 2]
light
windowlight(
point from = point (3, 1, -1), /* Center of the window */
to = point (0,0,0);
float intensity=1,
order = 2, /* (# of panes up and down)/2 */
fuzz = .02, /* blurred region around panes */
framewid = .1, /* width of a pane frame member */
panewid = .5; /* width of the glass in a pane */
color lightcolor = color (1,.9,.6),
darkcolor = color (.05,.2,.1);
)
{
float halfframeplus, halfframeminus;
float windowwid;
point wfrom, wto;
point wL, wP;
float shade, yabs, zabs, ymod, zmod;
/* where pane-to-frame transition begins */
halfframeplus = framewid/2+fuzz;
halfframeminus = framewid/2-fuzz;
windowwid = framewid+panewid;
/* Move window center, sunlight vector back to world space */
wfrom = transform( "world", from );
wto = transform( "world", to );
wL = wto - wfrom;
wP = transform( "world", P );
/* Project surface position onto x=xcomp(wfrom) plane */
wL *= (xcomp(wfrom)-xcomp(wP))/xcomp(wL);
wP = wP + wL - wfrom;
/* absolute distance from window center */
yabs = abs(ycomp(wP));
zabs = abs(zcomp(wP));
if( max(yabs, zabs)>(windowwid*order)) { /* Outside window? */
shade = 0;
} else {
/* Modulus reduces insideness to a single pane */
ymod = mod(yabs,windowwid);
zmod = mod(zabs,windowwid);
shade =
smoothstep(halfframeminus, halfframeplus, ymod)*
smoothstep(halfframeminus, halfframeplus, windowwid-ymod)*
smoothstep(halfframeminus, halfframeplus, zmod)*
smoothstep(halfframeminus, halfframeplus, windowwid-zmod);
}
L = to - from; /* always the same (needed for surface shading) */
Cl = mix(darkcolor, lightcolor, shade);
}
[EXAMPLE 3]
displacement
threads ( float freq = 5.0,
amplitude = 0.1,
phase = 0.0,
offset = 0.0;)
{
point nDel;
float scale;
/* surface displacement occurs along nDel */
nDel = normalize(N);
/* The amount of displacement is given by a sinusoid along the
length of the cylinder, with the place around the cylinder
providing an additional phase factor for spiral threads */
scale = (sin( PI*2*(v*freq + u + phase))+offset) * amplitude;
if( v > 0.95) /* Damp the oscillation to 0 at the ends */
scale = scale * (1.0-v) / .05;
else if( v < 0.05 )
scale = scale * v / .05;
nDel = nDel * scale;
P = P + nDel;
N = calculatenormal(P);
}
[EXAMPLE 4]
surface
filament ( float freq = 5.0, phase = 0.0, width = 0.3;
color filcolor = color (1, .84, .76); )
{
float distance; /* Distance from the spiral */
distance = mod((t*freq + s + phase), 1.0);
if(distance < width) {
/* Inside the filament */
Ci = filcolor;
Oi = 1.0; /* Make it opaque */
} else {
Oi = 0.0; /* Make it transparent */
}
}