| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556 | // Thanks for the contribution Jonas// http://29a.ch/2012/7/19/webgl-terrain-rendering-water-foguniform 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 = 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.normal = normalize(materialInput.tangentToEyeMatrix * normalTangentSpace);        material.specular = specularIntensity;    material.shininess = 10.0;        return material;}
 |