// 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; |