//////////////////////////////////////////////// // // sky shaders // //////////////////////////////////////////////// shader 0 "skybox" [ in vec4 vvertex, vcolor; in vec2 vtexcoord0; uniform mat4 skymatrix; uniform float ldrscale; out vec4 colorscale; out vec2 texcoord0; void main(void) { gl_Position = skymatrix * vvertex; texcoord0 = vtexcoord0; colorscale = vec4(ldrscale * vcolor.rgb, vcolor.a); } ] [ uniform sampler2D tex0; in vec4 colorscale; in vec2 texcoord0; layout(location = 0) out vec4 fragcolor; void main(void) { vec4 color = texture(tex0, texcoord0); fragcolor = colorscale * color; } ] shader 0 "skyboxoverbright" [ in vec4 vvertex, vcolor; in vec2 vtexcoord0; uniform mat4 skymatrix; uniform float ldrscale; out vec4 colorscale; out vec2 texcoord0; void main(void) { gl_Position = skymatrix * vvertex; texcoord0 = vtexcoord0; colorscale = vec4(ldrscale * vcolor.rgb, vcolor.a); } ] [ uniform sampler2D tex0; uniform vec3 overbrightparams; uniform float ldrscale; in vec4 colorscale; in vec2 texcoord0; layout(location = 0) out vec4 fragcolor; void main(void) { vec4 color = texture(tex0, texcoord0); float lum = dot(vec3(@lumweights), color.rgb); float overbright = mix(overbrightparams.x, overbrightparams.y, clamp(lum - overbrightparams.z, 0.0, 1.0)); color.rgb *= overbright; fragcolor = colorscale * color; } ] shader 0 "atmosphere" [ in vec4 vvertex; uniform mat4 sunmatrix; out vec3 camvec; void main(void) { gl_Position = vvertex; vec4 p = sunmatrix * vvertex; camvec = p.xyz / p.w; } ] [ // adapted from http://blog.cloudparty.com/2013/09/25/stunning-procedural-skies-in-webgl-part-2/ uniform vec3 sunlight; uniform vec3 sundir; uniform vec3 sundiskparams; uniform vec3 atmoradius; uniform float gm; uniform vec3 betar, betam, betarm; uniform vec2 hdrgamma; uniform float atmoalpha; in vec3 camvec; layout(location = 0) out vec4 fragcolor; vec3 calcextinction(float dist) { return exp2(-dist * betarm); } vec3 calcscatter(float costheta) { float rphase = 1.0 + costheta*costheta; float mphase = pow(1.0 + gm*(gm - 2.0*costheta), -1.5); return betar*rphase + betam*mphase; } float baseopticaldepth(vec3 ray) { float a = atmoradius.x * max(ray.z, min(sundir.z, 0.0)); return sqrt(a*a + atmoradius.z) - a; } float opticaldepth(vec3 pos, vec3 ray) { pos.z = max(pos.z, 0.0) + atmoradius.x; float a = dot(pos, ray); return sqrt(a*a + atmoradius.y - dot(pos, pos)) - a; } void main(void) { vec3 camdir = normalize(camvec); float costheta = dot(camdir, sundir); // optical depth along view ray float raydist = baseopticaldepth(camdir); // extinction of light along view ray vec3 extinction = calcextinction(raydist); // optical depth for incoming light hitting the view ray float lightraydist = opticaldepth(camdir * (raydist * max(0.15 + 0.75 * sundir.z, 0.0)), sundir); // cast a ray towards the sun and calculate the incoming extincted light vec3 incominglight = calcextinction(lightraydist); // calculate the in-scattering vec3 scattering = calcscatter(costheta) * (1.0 - extinction); // combine vec3 inscatter = incominglight * scattering; // sun disk vec3 sundisk = sundiskparams.z * extinction * pow(clamp(costheta*sundiskparams.x + sundiskparams.y, 0.0, 1.0), 8.0); inscatter += sundisk; @(hdrgammaencode inscatter) fragcolor = vec4(sunlight * inscatter, atmoalpha); } ] shader 0 "skyfog" [ in vec4 vvertex, vcolor; uniform mat4 skymatrix; uniform float ldrscale; out vec4 color; void main(void) { gl_Position = skymatrix * vvertex; color = vec4(ldrscale * vcolor.rgb, vcolor.a); } ] [ uniform sampler2D tex0; in vec4 color; layout(location = 0) out vec4 fragcolor; void main(void) { fragcolor = color; } ]