Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum porta, diam at accumsan mollis, purus felis varius nibh, at bibendum nulla nisl eu libero. Aliquam erat volutpat. Quisque orci felis, pharetra vel, feugiat ut, eleifend vitae, sem. Nam adipiscing blandit tortor. Nulla dignissim tincidunt leo. Nulla scelerisque fermentum ipsum. Nunc at metus. In ac pede. Donec elit libero, vestibulum id, malesuada sed, cursus vitae, ligula. Praesent consequat, urna ut laoreet convallis, libero velit convallis quam, rhoncus cursus orci ipsum id mi. Quisque malesuada semper nunc. Nulla porttitor justo ut lacus. Fusce blandit tellus. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Maecenas faucibus, quam at tristique facilisis, metus magna interdum arcu, vitae lobortis dui mauris ac risus.
Fusce quam. Aenean bibendum adipiscing metus. Etiam in felis. Vivamus sit amet erat eget velit bibendum sollicitudin. Donec molestie purus ac nibh. Ut dignissim, ligula id rhoncus consectetur, leo turpis dapibus tortor, nec hendrerit turpis velit a neque. Cras eu metus. Nullam sodales, tortor a molestie posuere, pede eros dictum lectus, nec sollicitudin lorem diam et velit. Maecenas dictum neque eget purus. Curabitur ac justo et odio congue euismod. Duis vitae felis ut nunc ultrices adipiscing. Vestibulum at tellus. Nunc in purus eget libero commodo posuere.
Coming soon: A Whole New Set of Tubes.
surface Rust(float smooth = 25;float severity = .5;float multipass = 10;float age = 60; ) {
//float smooth = 20; // Higher numbers for less blocky rust. ~ 12 - 45
//float severity = .8; //for mixing, 0-1.
//float multipass = 10; //1-inf
//float age = 60; //You start to see rust around 25. Objects disappear around 90. Max 112
float displace = 0; // Whether or not to displace this pixel.
//This will give us the patchy effect.
float phase = noise(s*(smooth),t*(smooth));
//We don't want age-phase to go below 1.
if (age - phase < 1) phase = age - 1;
normal Nf;
Nf = faceforward( normalize(N), I );
//From Dave's example
vector NS = vtransform( "shader" , N );
point PS = transform( "shader" , P );
float i; //Really...
//Like blinn, only more convenient. :)
color thispixel = Oi * ( (Cs * (diffuse(Nf) - .3)) +
(specular(normalize(N),normalize(-I),8) *15)
* 6 /*.025*/);
//Now rust it.
//Blend a random color out of the "ramp" texture.
for (i=0;i<multipass;i = i + 1) {
//No particular numeric significance here, but I'm trying to adjust the
//amount of rust vs. metal based on age, and this does a good job.
if (phase > ((1/112) * age))break;
//Different lighting for the rusted metal...
if (displace = 0) { //Always do this only once per pixel
thispixel = Oi * ((thispixel*(diffuse(Nf)*12)) +
(specular(normalize(N),normalize(-I),2)*4)*9);
}
//Rust. -- This will blend a random rust color up to element <age> in
//our ramp, <multipass> times.
thispixel = mix(thispixel,
/*Lookup from our color ramp*/
color texture("rust.tex",
(1/112)*round(random() * age),.5),
severity);
displace = 1;
}
if(displace == 1) {
//Displace a little, based on age, but only if the spot is rusted.
PS += (phase * (.0005 * age)) * normalize(NS);
}
Oi = Os;
Ci = Oi * thispixel;
P = transform( "shader", "current", PS );
N = calculatenormal(P);
}