Research Article

Automatic Optimization for Large-Scale Real-Time Coastal Water Simulation

Box 1

The implementation detail.
// Combine waterbody color and reflected color
vec4 water_color = mix(body_color, reflected_color, fresnel);
vec4 final_color = water_color;
float depth = texture2D(
DeepMap, vec2(pos_local.x, (pos_local.y))/256.0 ).r * 30.0 - 15.0;
// Crest Foam
float alphaFactor = texture2D(
FoamMap, pos_local.xy/64.0 + g_PerlinMovement / 2.0).r;
float foamFactor = alphaFactor * clamp(pos_local.z / 2.0 - 0.1, 0.0, 1.0);
final_color = vec4(final_color.xyz, (300.0 - pos_local.x) / 300.0 );
final_color = mix(final_color, vec4(1.0, 1.0, 1.0, 1.0), foamFactor);
// Trough Foam
alphaFactor = texture2D(
FoamMap, vec2(pos_local.x/32.0, pos_local.y/32.0)
+ g_PerlinMovement / 2.0).r;
float foamFactor0 = alphaFactor * clamp( (depth + 3.0) / 5.0, 0.0, 1.0);
alphaFactor = texture2D(
FoamMap, pos_local.xy/64.0 - g_PerlinMovement / 3.0).r;
float foamFactor1 = alphaFactor * clamp( -0.6 - pos_local.z, 0.0, 1.0)
* clamp( (depth + 20.0) / 15.0, 0.0, 1.0);
final_color = mix(final_color, vec4(1.0, 1.0, 1.0, 1.0), foamFactor0);
final_color = mix(final_color, vec4(1.0, 1.0, 1.0, 1.0), foamFactor1);
// Fog
float fogFactor = computeFogFactor( g_FogDensity, gl_FogFragCoord );
water_color = final_color;
// Sun spots
float cos_spec = clamp(dot(reflect_vec, g_SunDir), 0.0, 1.0);
float sun_spot = pow(cos_spec, g_Shineness);
water_color.xyz += g_SunColor * sun_spot;
gl_FragColor = water_color;