uniform vec3 uLightDir; uniform vec3 uCameraPos; uniform vec3 uInvWaveLength; uniform float uInnerRadius; uniform float uKrESun; uniform float uKmESun; uniform float uKr4PI; uniform float uKm4PI; uniform float uScale; uniform float uScaleDepth; uniform float uScaleOverScaleDepth; uniform int uNumberOfSamples; uniform float uSamples; attribute vec3 uv0; attribute vec2 uv1; attribute float uv2; varying vec4 vPosition; varying vec2 vUV; varying vec3 vRayleighColor; varying vec3 vMieColor; varying vec3 vDirection; varying float vOpacity; varying float vHeight; float scale(float cos, float uScaleDepth) { float x = 1.0 - cos; return uScaleDepth * exp(-0.00287 + x*(0.459 + x*(3.83 + x*(-6.80 + x*5.25)))); } void main(void) { gl_Position = vPosition = ftransform(); vec3 v3Pos = uv0; v3Pos.y += uInnerRadius; vec3 v3Ray = v3Pos - uCameraPos; float fFar = length(v3Ray); v3Ray /= fFar; vec3 v3Start = uCameraPos; float fHeight = uCameraPos.y; float fStartAngle = dot(v3Ray, v3Start) / fHeight; float fDepth = exp(uScaleOverScaleDepth * (uInnerRadius - uCameraPos.y)); float fStartOffset = fDepth * scale(fStartAngle, uScaleDepth); float fSampleLength = fFar / uSamples; float fScaledLength = fSampleLength * uScale; vec3 v3SampleRay = v3Ray * fSampleLength; vec3 v3SamplePoint = v3Start + v3SampleRay * 0.5; vec3 color = vec3(0,0,0); for (int i = 0; i < uNumberOfSamples; i++) { float fHeight = length(v3SamplePoint); float fDepth = exp(uScaleOverScaleDepth * (uInnerRadius - fHeight)); float fLightAngle = dot(uLightDir, v3SamplePoint) / fHeight; float fCameraAngle = dot(v3Ray, v3SamplePoint) / fHeight; float fScatter = (fStartOffset + fDepth * (scale(fLightAngle, uScaleDepth) - scale(fCameraAngle, uScaleDepth))); vec3 v3Attenuate = exp(-fScatter * (uInvWaveLength * uKr4PI + uKm4PI)); v3Attenuate *= (fDepth * fScaledLength); color += v3Attenuate; v3SamplePoint += v3SampleRay; } vRayleighColor = color * (uInvWaveLength * uKrESun); vMieColor = color * uKmESun; vDirection = uCameraPos - v3Pos; vUV = uv1; vOpacity = uv2; vHeight = 1.0 - uv0.y; }