94 lines
3.7 KiB
Plaintext
94 lines
3.7 KiB
Plaintext
/*
|
|
--------------------------------------------------------------------------------
|
|
This source file is part of SkyX.
|
|
Visit http://www.paradise-studios.net/products/skyx/
|
|
|
|
Copyright (C) 2009-2012 Xavier Verguín González <xavyiy@gmail.com>
|
|
|
|
This program is free software; you can redistribute it and/or modify it under
|
|
the terms of the GNU Lesser General Public License as published by the Free Software
|
|
Foundation; either version 2 of the License, or (at your option) any later
|
|
version.
|
|
|
|
This program is distributed in the hope that it will be useful, but WITHOUT
|
|
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
|
FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
|
|
|
|
You should have received a copy of the GNU Lesser General Public License along with
|
|
this program; if not, write to the Free Software Foundation, Inc., 59 Temple
|
|
Place - Suite 330, Boston, MA 02111-1307, USA, or go to
|
|
http://www.gnu.org/copyleft/lesser.txt.
|
|
--------------------------------------------------------------------------------
|
|
*/
|
|
|
|
// ------------------------- SkyX clouds -----------------------------
|
|
// ------------------------ GLSL fragment ----------------------------
|
|
|
|
// IN
|
|
varying vec3 vPosition;
|
|
// OUT
|
|
// UNIFORM
|
|
uniform float uExposure;
|
|
// Sun information
|
|
uniform vec3 uSunColor;
|
|
// Main cloud layer parameters
|
|
uniform float uHeight;
|
|
uniform float uTime;
|
|
uniform float uScale;
|
|
uniform vec2 uWindDirection;
|
|
// Advanced cloud layer parameters
|
|
uniform float uCloudLayerHeightVolume; // 0.25
|
|
uniform float uCloudLayerVolumetricDisplacement; // 0.01
|
|
uniform vec3 uAmbientLuminosity; // 0.55 0.55 0.55
|
|
uniform float uDetailAttenuation; // 0.45
|
|
uniform float uDistanceAttenuation; // 0.05
|
|
uniform sampler2D uClouds;
|
|
uniform sampler2D uCloudsNormal;
|
|
uniform sampler2D uCloudsTile;
|
|
|
|
void main(void)
|
|
{
|
|
// Get the cloud pixel lenght on the projected plane
|
|
float vh = uHeight / vPosition.y;
|
|
// Get the 3D position of the cloud pixel
|
|
vec3 CloudPosition = vPosition * vh;
|
|
|
|
// Get texture coords
|
|
vec2 TexCoord = CloudPosition.xz*uScale;
|
|
float Density = texture2D(uClouds, TexCoord+uTime*uWindDirection*0.25).r;
|
|
vec3 Normal = -(2.0*texture2D(uCloudsNormal, TexCoord+uTime*uWindDirection*0.25).xyz-1.0);
|
|
Normal.zy = Normal.yz;
|
|
|
|
///------------ Volumetric effect:
|
|
float CloudLayerHeightVolume = uCloudLayerHeightVolume*vPosition.y;
|
|
float CloudLayerVolumetricDisplacement = uCloudLayerVolumetricDisplacement*vPosition.y;
|
|
vec3 iNewPosition = normalize(vPosition + CloudLayerVolumetricDisplacement*vec3(Normal.x,0,Normal.z));
|
|
vh = (uHeight+uHeight*(1.0-Density)*CloudLayerHeightVolume) / iNewPosition.y;
|
|
CloudPosition = iNewPosition * vh;
|
|
TexCoord = CloudPosition.xz*uScale; // Little offset
|
|
Density = texture2D(uClouds, TexCoord+uTime*uWindDirection*0.25 + vec2(0.2,0.6)).r;
|
|
///------------
|
|
|
|
float CloudTile = texture2D(uCloudsTile, TexCoord-uTime*uWindDirection*0.25).r;
|
|
|
|
// Ambient + Sun*Density
|
|
vec3 PixelColor = uAmbientLuminosity + uSunColor*Density;
|
|
|
|
// AMBIENT addition
|
|
//PixelColor += uAmbientLuminosity;
|
|
|
|
// SUN addition
|
|
// PixelColor += uSunColor*clamp(dot(-normalize(Normal), normalize(uSunPosition)), 0.0, 1.0);
|
|
|
|
// FINAL colour
|
|
float Alpha = Density * clamp(10.0*clamp(-uDistanceAttenuation+vPosition.y, 0.0, 1.0), 0.0, 1.0);
|
|
|
|
gl_FragColor = vec4(PixelColor*(1.0-Density*0.35), Alpha*clamp(1.0-CloudTile*uDetailAttenuation, 0.0, 1.0));
|
|
|
|
#ifdef LDR
|
|
gl_FragColor.xyz = vec3(1.0 - exp(-uExposure * gl_FragColor.xyz));
|
|
#else // HDR
|
|
gl_FragColor.xyz *= pow(uExposure, 0.5);
|
|
#endif
|
|
}
|