You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
59 lines
2.3 KiB
GLSL
59 lines
2.3 KiB
GLSL
// Thanks for the contribution Jonas
|
|
// http://29a.ch/2012/7/19/webgl-terrain-rendering-water-fog
|
|
|
|
uniform sampler2D specularMap;
|
|
uniform sampler2D normalMap;
|
|
uniform vec4 baseWaterColor;
|
|
uniform vec4 blendColor;
|
|
uniform float frequency;
|
|
uniform float animationSpeed;
|
|
uniform float amplitude;
|
|
uniform float specularIntensity;
|
|
uniform float fadeFactor;
|
|
|
|
czm_material czm_getMaterial(czm_materialInput materialInput)
|
|
{
|
|
czm_material material = czm_getDefaultMaterial(materialInput);
|
|
|
|
float time = czm_frameNumber * animationSpeed;
|
|
|
|
// fade is a function of the distance from the fragment and the frequency of the waves
|
|
float fade = max(1.0, (length(materialInput.positionToEyeEC) / 10000000000.0) * frequency * fadeFactor);
|
|
|
|
float specularMapValue = texture2D(specularMap, materialInput.st).r;
|
|
|
|
// note: not using directional motion at this time, just set the angle to 0.0;
|
|
vec4 noise = czm_getWaterNoise(normalMap, materialInput.st * frequency, time, 0.0);
|
|
vec3 normalTangentSpace = noise.xyz * vec3(1.0, 1.0, (1.0 / amplitude));
|
|
|
|
// fade out the normal perturbation as we move further from the water surface
|
|
normalTangentSpace.xy /= fade;
|
|
|
|
// attempt to fade out the normal perturbation as we approach non water areas (low specular map value)
|
|
normalTangentSpace = mix(vec3(0.0, 0.0, 50.0), normalTangentSpace, specularMapValue);
|
|
|
|
normalTangentSpace = normalize(normalTangentSpace);
|
|
|
|
// get ratios for alignment of the new normal vector with a vector perpendicular to the tangent plane
|
|
float tsPerturbationRatio = clamp(dot(normalTangentSpace, vec3(0.0, 0.0, 1.0)), 0.0, 1.0);
|
|
|
|
// fade out water effect as specular map value decreases
|
|
material.alpha = mix(blendColor.a, baseWaterColor.a, specularMapValue) * specularMapValue;
|
|
|
|
// base color is a blend of the water and non-water color based on the value from the specular map
|
|
// may need a uniform blend factor to better control this
|
|
material.diffuse = mix(blendColor.rgb, baseWaterColor.rgb, specularMapValue);
|
|
|
|
// diffuse highlights are based on how perturbed the normal is
|
|
material.diffuse += (0.1 * tsPerturbationRatio);
|
|
|
|
material.diffuse = material.diffuse;
|
|
|
|
material.normal = normalize(materialInput.tangentToEyeMatrix * normalTangentSpace);
|
|
|
|
material.specular = specularIntensity;
|
|
material.shininess = 10.0;
|
|
|
|
return material;
|
|
}
|