/*========== Terrain Shader ==========*/ /*========== by Brandon Onstott ==========*/ /*========== ==========*/ /*========== Assumes terrain geometry with ==========*/ /*========== Z-up shader space. Sea level ==========*/ /*========== at z = 0. Snow caps start at ==========*/ /*========== z = 1. ==========*/ /*========== ==========*/ /*========== February 11, 1999 ==========*/ /*========== VIZA 616 - Rendering and Shading ==========*/ /*========== Visualization Laboratory ==========*/ #include "rmannotes.sl" surface land( float Kd = 0.80, Ka = 0.20, freq = 5.00; string rock_tx = "", grass_tx = ""; ) { float z, dz; float ss, tt; normal Nf, Ns; vector V; point P2; /*========== THESE VARY HOW MUCH OF THE ==========*/ /*========== COLOR DEPENDS ON SLOPE ==========*/ float brightness = 0.3; float contrast = 3.0; /*========== DEFINE COLOR VARIABLES ==========*/ color rock_color, grass_color, beach_color, deep_water_color, snow_color; color color1, color2, color3, color4, color5, color6; color surface_color, surface_opac, layer_color, layer_opac; /*========== COMPUTE GEOMETRY VARIABLES ==========*/ /*========== IN SHADER SPACE ==========*/ P2 = transform("shader", P); z = zcomp(P2); Nf = faceforward( normalize(N), I ); V = -normalize(I); /*========== COMPUTE SLOPE PARAMETERS ==========*/ /*========== IN SHADER SPACE ==========*/ Ns = normalize(ntransform("shader", N)); dz = -zcomp(Ns); dz = (((dz- 0.5 + brightness) * contrast) + 0.5); ss = repeat(s, freq); tt = repeat(t, freq); /*========== DEFINE COLORS ==========*/ if (grass_tx == ""){ grass_color = color ( 0.0, 1.00, 0.2 ); }else{ grass_color = texture(grass_tx, ss, tt); } if (rock_tx == ""){ rock_color = color (0.4, 0.25, 0.1); }else{ rock_color = texture(rock_tx, ss, tt); } beach_color = color ( 0.7, 0.5, 0.3 ); deep_water_color = color ( 0.0, 0.2, 0.3 ); snow_color = color ( 0.8, 0.8, 1.0 ); /*========== BOTTOM LAYER : ROCK TEXTURE ==========*/ surface_color = rock_color; color1 = surface_color; /*========== SNOW LAYER : HIGH ALTITUDE ==========*/ layer_color = snow_color; layer_opac = dz * smoothstep(0.9, 0.95, z); surface_color = blend(surface_color, layer_color, layer_opac); color2 = surface_color; /*========== GRASS LAYER : FLAT SLOPE AND LOW ALTITUDE ==========*/ layer_color = grass_color; layer_opac = dz * pulse(0.0, 0.8, 0.3, z); surface_color = blend(surface_color, layer_color, layer_opac); color3 = surface_color; /*========== BEACH LAYER : FLAT SLOPE AND SEA LEVEL ==========*/ layer_color = beach_color; layer_opac = (0.5 + 0.5*dz) * (1.0 - smoothstep(-0.1, 0.2, z)); surface_color = blend(surface_color, layer_color, layer_opac); color4 = surface_color; /*========== WET LAYER : DARKENS UNDERWATER PORTION ==========*/ layer_color = surface_color * 0.7; layer_opac = (1.0 - smoothstep(-0.01, 0.01, z)); surface_color = blend(surface_color, layer_color, layer_opac); color5 = surface_color; /*==== COMPUTE SHADING BEFORE BLENDING WITH OCEAN DEPTH ======*/ surface_color = surface_color * (Ka*ambient() + Kd*diffuse(Nf)); /*========== UNDERWATER LAYER : FADE TO DEPTH COLOR ==========*/ layer_color = deep_water_color; layer_opac = (1.0 - smoothstep(-0.2, 0.0, z)); surface_color = blend(surface_color, layer_color, layer_opac); color6 = surface_color; Oi = Os; Ci = Os * surface_color; }