// main void main(void) { vec2 uv = gl_FragCoord.xy / iResolution.xy; uv = uv * 2.0 - 1.0; uv.x *= iResolution.x / iResolution.y; float time = iGlobalTime * 0.3; // ray vec3 ang = vec3(sin(time*3.0)*0.1,sin(time)*0.2+0.4,time); if(iMouse.z > 0.0) ang = vec3(0.0,clamp(2.0-iMouse.y*0.01,-0.3,PI),iMouse.x*0.01); mat4 rot = fromEuler(ang); vec3 ori = vec3(0.0,0.2,time*1.0); ori.y += abs(map_detailed(-ori)); vec3 dir = normalize(vec3(uv.xy,-1.0)); dir = rotate(normalize(dir),rot); // tracing vec3 p; float dens = hftracing(ori,dir,p); vec3 dist = p - ori; vec3 n = getNormal(p, dot(dist,dist)*EPSILON_NRM); // color vec3 color = sea_color(p,n,dir,dist); vec3 light = normalize(vec3(0.0,1.0,0.8)); color += vec3(diffuse(n,light,80.0) * SEA_WATER_COLOR) * 0.12; color += vec3(specular(n,light,dir,60.0)); // post color = mix(sky_color(dir),color, clamp(1.0-length(dist)/100.0,0.0,1.0)); color = pow(color,vec3(0.75)); gl_FragColor = vec4(color,1.0); }
color physicalsky_color(const vector & ray_dir) { scalar haze_val = max(i_haze() + 2.0f, 2.0f); vector sun_dir_val(i_sun_direction()); color sky_color(0.0f); int i_type = 0; switch ( i_type ) { case 0: { sky_color = 0.0001f * get_haze_driven_sky_color(ray_dir, sun_dir_val, haze_val); } break; case 1: { sky_color = get_cie_standard_sky_color(ray_dir, sun_dir_val, color(i_zenith_luminance()), i_a(), i_b(), i_c(), i_d(), i_e()); } break; default: { return color(0.0f); } } return i_multiplier() * sky_color * get_sun_intensity(ray_dir, sun_dir_val, haze_val, i_sun_disk_scale(), i_sun_disk_intensity(), 1.0f/*sun_glow_size()*/, i_sun_glow_intensity(), 5.0f/*sun_glow_falloff()*/); }
vec3 sea_color(in vec3 p, in vec3 n, in vec3 eye, in vec3 dist) { float fresnel_o = 1.0 - max(dot(n,-eye),0.0); float fresnel = pow(fresnel_o,3.0) * 0.65; // reflection vec3 refl = sky_color(reflect(eye,n)); // color vec3 ret = SEA_BASE; ret = mix(ret,refl,fresnel); // wave peaks float atten = max(1.0 - dot(dist,dist) * 0.001, 0.0); ret += SEA_WATER_COLOR * (p.y - SEA_HEIGHT) * 0.18 * atten; return ret; }