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