1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556 |
- // 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 = 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;
- }
|