app/assets/javascripts/Shaders/Materials/Water.glsl in cesium-0.13.1 vs app/assets/javascripts/Shaders/Materials/Water.glsl in cesium-0.13.2
- old
+ new
@@ -1,91 +1,56 @@
-// 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;
-
-vec4 getNoise(vec2 uv, float time, float angleInRadians) {
-
- float cosAngle = cos(angleInRadians);
- float sinAngle = sin(angleInRadians);
-
- // time dependent sampling directions
- vec2 s0 = vec2(1.0/17.0, 0.0);
- vec2 s1 = vec2(-1.0/29.0, 0.0);
- vec2 s2 = vec2(1.0/101.0, 1.0/59.0);
- vec2 s3 = vec2(-1.0/109.0, -1.0/57.0);
-
- // rotate sampling direction by specified angle
- s0 = vec2((cosAngle * s0.x) - (sinAngle * s0.y), (sinAngle * s0.x) + (cosAngle * s0.y));
- s1 = vec2((cosAngle * s1.x) - (sinAngle * s1.y), (sinAngle * s1.x) + (cosAngle * s1.y));
- s2 = vec2((cosAngle * s2.x) - (sinAngle * s2.y), (sinAngle * s2.x) + (cosAngle * s2.y));
- s3 = vec2((cosAngle * s3.x) - (sinAngle * s3.y), (sinAngle * s3.x) + (cosAngle * s3.y));
-
- vec2 uv0 = (uv/103.0) + (time * s0);
- vec2 uv1 = uv/107.0 + (time * s1) + vec2(0.23);
- vec2 uv2 = uv/vec2(897.0, 983.0) + (time * s2) + vec2(0.51);
- vec2 uv3 = uv/vec2(991.0, 877.0) + (time * s3) + vec2(0.71);
-
- uv0 = fract(uv0);
- uv1 = fract(uv1);
- uv2 = fract(uv2);
- uv3 = fract(uv3);
- vec4 noise = (texture2D(normalMap, uv0)) +
- (texture2D(normalMap, uv1)) +
- (texture2D(normalMap, uv2)) +
- (texture2D(normalMap, uv3));
-
- // average and scale to between -1 and 1
- return ((noise / 4.0) - 0.5) * 2.0;
-}
-
-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 = getNoise(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;
+// 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;
}
\ No newline at end of file