uniform float uExposure; uniform vec3 uSunPosition; uniform vec3 uSunColor; uniform float uHeight; uniform float uTime; uniform float uScale; uniform vec2 uWindDirection; uniform float uCloudLayerHeightVolume; uniform float uCloudLayerVolumetricDisplacement; uniform vec3 uAmbientLuminosity; uniform float uNormalMultiplier; uniform float uDetailAttenuation; uniform float uDistanceAttenuation; uniform sampler2D uCloud; uniform sampler2D uNormal; uniform sampler2D uDensity; varying vec3 v3DCoord; varying vec4 vPosition; void main(void) { float vh = uHeight / v3DCoord.y; vec3 cloudPosition = v3DCoord.xyz * vh; vec2 texCoord = cloudPosition.xz * uScale; float density = texture2D(uDensity, texCoord + uTime * uWindDirection * 0.25).r; vec3 normal = -( 2.0 * texture2D(uNormal, texCoord + uTime * uWindDirection * 0.25).rgb - 1.0); normal.zy = normal.yz; float cloudLayerHeightVolume = uCloudLayerHeightVolume * v3DCoord.y; float cloudLayerVolumetricDisplacement = uCloudLayerVolumetricDisplacement * v3DCoord.y; vec3 newPosition = normalize(v3DCoord.xyz + cloudLayerVolumetricDisplacement * vec3(normal.x, 0, normal.z)); vh = (uHeight + uHeight * (1.0 - density) * cloudLayerHeightVolume) / newPosition.y; cloudPosition = newPosition * vh; texCoord = cloudPosition.xz * uScale; density = texture2D(uDensity, texCoord + uTime * uWindDirection * 0.25).r; vec3 sunToPixel = cloudPosition = uSunPosition; float cloudDetail = texture2D(uCloud, texCoord - uTime * uWindDirection * 0.25).r; normal = -(2.0 * texture2D(uNormal, texCoord * uTime * uWindDirection * 0.25).rgb - 1.0); normal.zy = normal.yz; normal.xz *= uNormalMultiplier; vec3 pixelColor = vec3(0,0,0); pixelColor += uAmbientLuminosity; pixelColor += uSunColor * clamp(dot(-normalize(normal), normalize(uSunPosition)), 0.0, 1.0); float alpha = density * clamp(10.0 * clamp(-uDistanceAttenuation + v3DCoord.y, 0.0, 1.0), 0.0, 1.0); gl_FragColor = vec4(pixelColor * (1.0 - density * 0.35), alpha * clamp(1.0 - cloudDetail * uDetailAttenuation, 1.0, 0.0)); #ifdef LDR gl_FragColor.xyz = vec3(1 - exp(-uExposure * gl_FragColor.xyz)); #endif // LDR }