atmosphereFragmentShader
strata-game-library/shaders / atmosphereFragmentShader
Variable: atmosphereFragmentShader
constatmosphereFragmentShader: "\n uniform sampler2D tDiffuse;\n uniform sampler2D tDepth;\n uniform float uTime;\n uniform vec3 uSunDirection;\n uniform vec3 uSunColor;\n uniform vec3 uSkyColor;\n uniform float uRayleighCoeff;\n uniform float uMieCoeff;\n uniform vec3 uCameraPosition;\n uniform float uCameraNear;\n uniform float uCameraFar;\n uniform mat4 uProjectionMatrixInverse;\n uniform mat4 uViewMatrixInverse;\n \n varying vec2 vUv;\n \n const float PI = 3.14159265359;\n \n float rayleighPhase(float cosAngle) {\n return 0.75 * (1.0 + cosAngle * cosAngle);\n }\n \n float miePhase(float cosAngle, float g) {\n float g2 = g * g;\n return (1.0 - g2) / (4.0 * PI * pow(1.0 + g2 - 2.0 * g * cosAngle, 1.5));\n }\n \n float linearizeDepth(float depth) {\n float z = depth * 2.0 - 1.0;\n return (2.0 * uCameraNear * uCameraFar) / (uCameraFar + uCameraNear - z * (uCameraFar - uCameraNear));\n }\n \n vec3 getWorldPosition(vec2 uv, float depth) {\n vec4 clipSpace = vec4(uv * 2.0 - 1.0, depth * 2.0 - 1.0, 1.0);\n vec4 viewSpace = uProjectionMatrixInverse * clipSpace;\n if (abs(viewSpace.w) < 0.0001) {\n return vec3(0.0);\n }\n viewSpace /= viewSpace.w;\n vec4 worldSpace = uViewMatrixInverse * viewSpace;\n return worldSpace.xyz;\n }\n \n void main() {\n vec4 sceneColor = texture2D(tDiffuse, vUv);\n float depth = texture2D(tDepth, vUv).r;\n \n float linearDepth = linearizeDepth(depth);\n vec3 worldPos = getWorldPosition(vUv, depth);\n vec3 rayDir = normalize(worldPos - uCameraPosition);\n vec3 sunDir = normalize(uSunDirection);\n \n float cosAngle = dot(rayDir, sunDir);\n \n // Scattering calculations\n float rayleigh = rayleighPhase(cosAngle) * uRayleighCoeff;\n float mie = miePhase(cosAngle, 0.76) * uMieCoeff;\n \n // Distance-based scattering\n float scatterAmount = 1.0 - exp(-linearDepth * 0.001);\n \n // Combine scattering\n vec3 rayleighScatter = uSkyColor * rayleigh;\n vec3 mieScatter = uSunColor * mie;\n vec3 totalScatter = (rayleighScatter + mieScatter) * scatterAmount;\n \n // Apply atmospheric scattering\n vec3 finalColor = sceneColor.rgb + totalScatter;\n \n // Add sun disk for sky pixels\n if (depth >= 1.0) {\n float sunDisk = smoothstep(0.999, 0.9999, cosAngle);\n finalColor += uSunColor * sunDisk * 2.0;\n }\n \n gl_FragColor = vec4(finalColor, 1.0);\n }\n"
Defined in: volumetrics.ts:364
