| 
									
										
										
										
											2025-01-22 16:18:30 +01:00
										 |  |  | // http://sebastien.hillaire.free.fr/index.php?option=com_content&view=article&id=72&Itemid=106 | 
					
						
							|  |  |  | #version 450 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "compiled.inc" | 
					
						
							|  |  |  | #include "std/gbuffer.glsl" | 
					
						
							|  |  |  | #include "std/shadows.glsl" | 
					
						
							|  |  |  | #ifdef _Clusters | 
					
						
							|  |  |  | #include "std/clusters.glsl" | 
					
						
							|  |  |  | #endif | 
					
						
							|  |  |  | #ifdef _Spot | 
					
						
							|  |  |  | #include "std/light_common.glsl" | 
					
						
							|  |  |  | #endif | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-06-02 18:21:47 +00:00
										 |  |  | #ifdef _CPostprocess | 
					
						
							|  |  |  | uniform vec3 PPComp11; | 
					
						
							|  |  |  | uniform vec4 PPComp17; | 
					
						
							|  |  |  | #endif | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-01-22 16:18:30 +01:00
										 |  |  | uniform sampler2D gbufferD; | 
					
						
							|  |  |  | uniform sampler2D snoise; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #ifdef _Clusters | 
					
						
							|  |  |  | uniform vec4 lightsArray[maxLights * 3]; | 
					
						
							|  |  |  | 	#ifdef _Spot | 
					
						
							|  |  |  | 	uniform vec4 lightsArraySpot[maxLights * 2]; | 
					
						
							|  |  |  | 	#endif | 
					
						
							|  |  |  | uniform sampler2D clustersData; | 
					
						
							|  |  |  | uniform vec2 cameraPlane; | 
					
						
							|  |  |  | #endif | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #ifdef _ShadowMap | 
					
						
							|  |  |  | #ifdef _SinglePoint | 
					
						
							|  |  |  | 	#ifdef _Spot | 
					
						
							|  |  |  | 	uniform sampler2DShadow shadowMapSpot[1]; | 
					
						
							|  |  |  | 	uniform mat4 LWVPSpot[1]; | 
					
						
							|  |  |  | 	#else | 
					
						
							|  |  |  | 	uniform samplerCubeShadow shadowMapPoint[1]; | 
					
						
							|  |  |  | 	uniform vec2 lightProj; | 
					
						
							|  |  |  | 	#endif | 
					
						
							|  |  |  | #endif | 
					
						
							|  |  |  | #ifdef _Clusters | 
					
						
							|  |  |  | 	uniform samplerCubeShadow shadowMapPoint[4]; | 
					
						
							|  |  |  | 	uniform vec2 lightProj; | 
					
						
							|  |  |  | 	#ifdef _Spot | 
					
						
							|  |  |  | 	uniform sampler2DShadow shadowMapSpot[4]; | 
					
						
							|  |  |  | 	uniform mat4 LWVPSpot[maxLightsCluster]; | 
					
						
							|  |  |  | 	#endif | 
					
						
							|  |  |  | #endif | 
					
						
							|  |  |  | #endif | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #ifdef _Sun | 
					
						
							|  |  |  | 	#ifdef _ShadowMap | 
					
						
							|  |  |  | 	#ifdef _ShadowMapAtlas | 
					
						
							|  |  |  | 	#ifndef _SingleAtlas | 
					
						
							|  |  |  | 	uniform sampler2DShadow shadowMapAtlasSun; | 
					
						
							|  |  |  | 	#else | 
					
						
							|  |  |  | 	uniform sampler2DShadow shadowMapAtlas; | 
					
						
							|  |  |  | 	#endif | 
					
						
							|  |  |  | 	#else | 
					
						
							|  |  |  | 	uniform sampler2DShadow shadowMap; | 
					
						
							|  |  |  | 	#endif | 
					
						
							|  |  |  | 	uniform float shadowsBias; | 
					
						
							|  |  |  | 	#ifdef _CSM | 
					
						
							|  |  |  | 	//!uniform vec4 casData[shadowmapCascades * 4 + 4]; | 
					
						
							|  |  |  | 	#else | 
					
						
							|  |  |  | 	uniform mat4 LWVP; | 
					
						
							|  |  |  | 	#endif | 
					
						
							|  |  |  | 	#endif // _ShadowMap | 
					
						
							|  |  |  | #endif | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #ifdef _SinglePoint // Fast path for single light | 
					
						
							|  |  |  | uniform vec3 pointPos; | 
					
						
							|  |  |  | uniform vec3 pointCol; | 
					
						
							|  |  |  | 	#ifdef _ShadowMap | 
					
						
							|  |  |  | 	uniform float pointBias; | 
					
						
							|  |  |  | 	#endif | 
					
						
							|  |  |  | 	#ifdef _Spot | 
					
						
							|  |  |  | 	uniform vec3 spotDir; | 
					
						
							|  |  |  | 	uniform vec3 spotRight; | 
					
						
							|  |  |  | 	uniform vec4 spotData; | 
					
						
							|  |  |  | 	#endif | 
					
						
							|  |  |  | #endif | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | uniform vec2 cameraProj; | 
					
						
							|  |  |  | uniform vec3 eye; | 
					
						
							|  |  |  | uniform vec3 eyeLook; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | in vec2 texCoord; | 
					
						
							|  |  |  | in vec3 viewRay; | 
					
						
							|  |  |  | out float fragColor; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const float tScat = 0.08; | 
					
						
							|  |  |  | const float tAbs = 0.0; | 
					
						
							|  |  |  | const float tExt = tScat + tAbs; | 
					
						
							| 
									
										
										
										
											2025-06-02 18:21:47 +00:00
										 |  |  | #ifdef _CPostprocess | 
					
						
							|  |  |  | 	float stepLen = 1.0 / int(PPComp11.y); | 
					
						
							|  |  |  | 	float AirTurbidity = PPComp17.w; | 
					
						
							|  |  |  | #else | 
					
						
							|  |  |  | 	const float stepLen = 1.0 / volumSteps; | 
					
						
							|  |  |  | 	float AirTurbidity = volumAirTurbidity; | 
					
						
							|  |  |  | #endif | 
					
						
							| 
									
										
										
										
											2025-01-22 16:18:30 +01:00
										 |  |  | const float lighting = 0.4; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void rayStep(inout vec3 curPos, inout float curOpticalDepth, inout float scatteredLightAmount, float stepLenWorld, vec3 viewVecNorm) { | 
					
						
							|  |  |  | 	curPos += stepLenWorld * viewVecNorm; | 
					
						
							|  |  |  | 	const float density = 1.0; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	float l1 = lighting * stepLenWorld * tScat * density; | 
					
						
							|  |  |  | 	curOpticalDepth *= exp(-tExt * stepLenWorld * density); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	float visibility = 0.0; | 
					
						
							|  |  |  | 	vec4 lPos; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #ifdef _Sun | 
					
						
							|  |  |  | 	#ifdef _CSM | 
					
						
							|  |  |  | 	mat4 LWVP = mat4(casData[4], casData[4 + 1], casData[4 + 2], casData[4 + 3]); | 
					
						
							|  |  |  | 	#endif | 
					
						
							|  |  |  | 	lPos = LWVP * vec4(curPos, 1.0); | 
					
						
							|  |  |  | 	lPos.xyz /= lPos.w; | 
					
						
							|  |  |  | 	visibility = texture( | 
					
						
							|  |  |  | 		#ifdef _ShadowMapAtlas | 
					
						
							|  |  |  | 			#ifndef _SingleAtlas | 
					
						
							|  |  |  | 			shadowMapAtlasSun | 
					
						
							|  |  |  | 			#else | 
					
						
							|  |  |  | 			shadowMapAtlas | 
					
						
							|  |  |  | 			#endif | 
					
						
							|  |  |  | 		#else | 
					
						
							|  |  |  | 		shadowMap | 
					
						
							|  |  |  | 		#endif | 
					
						
							|  |  |  | 	, vec3(lPos.xy, lPos.z - shadowsBias)); | 
					
						
							|  |  |  | #endif | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #ifdef _SinglePoint | 
					
						
							|  |  |  | 	#ifdef _Spot | 
					
						
							|  |  |  | 	lPos = LWVPSpot[0] * vec4(curPos, 1.0); | 
					
						
							|  |  |  | 	visibility = shadowTest(shadowMapSpot[0], lPos.xyz / lPos.w, pointBias); | 
					
						
							|  |  |  | 	visibility *= spotlightMask(normalize(pointPos - curPos), spotDir, spotRight, spotData.zw, spotData.x, spotData.y); | 
					
						
							|  |  |  | 	#else | 
					
						
							|  |  |  | 	vec3 ld = pointPos - curPos; | 
					
						
							|  |  |  | 	visibility = PCFCube(shadowMapPoint[0], ld, -normalize(ld), pointBias, lightProj, vec3(0.0)); | 
					
						
							|  |  |  | 	#endif | 
					
						
							|  |  |  | #endif | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #ifdef _Clusters | 
					
						
							|  |  |  | #endif | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	scatteredLightAmount += curOpticalDepth * l1 * visibility; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void main() { | 
					
						
							|  |  |  | 	float pixelRayMarchNoise = textureLod(snoise, texCoord * 100, 0.0).r * 2.0 - 1.0; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	float depth = textureLod(gbufferD, texCoord, 0.0).r * 2.0 - 1.0; | 
					
						
							|  |  |  | 	vec3 p = getPos(eye, eyeLook, normalize(viewRay), depth, cameraProj); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	vec3 viewVec = p - eye; | 
					
						
							|  |  |  | 	float worldPosDist = length(viewVec); | 
					
						
							|  |  |  | 	vec3 viewVecNorm = viewVec / worldPosDist; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	float startDepth = 0.1; | 
					
						
							|  |  |  | 	startDepth = min(worldPosDist, startDepth); | 
					
						
							|  |  |  | 	float endDepth = 20.0; | 
					
						
							|  |  |  | 	endDepth = min(worldPosDist, endDepth); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	vec3 curPos = eye + viewVecNorm * startDepth; | 
					
						
							|  |  |  | 	float stepLenWorld = stepLen * (endDepth - startDepth); | 
					
						
							|  |  |  | 	float curOpticalDepth = exp(-tExt * stepLenWorld); | 
					
						
							|  |  |  | 	float scatteredLightAmount = 0.0; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	curPos += stepLenWorld * viewVecNorm * pixelRayMarchNoise; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	for (float l = stepLen; l < 0.99999; l += stepLen) { // Do not do the first and last steps | 
					
						
							|  |  |  | 		rayStep(curPos, curOpticalDepth, scatteredLightAmount, stepLenWorld, viewVecNorm); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-06-02 18:21:47 +00:00
										 |  |  | 	fragColor = scatteredLightAmount * AirTurbidity; | 
					
						
							| 
									
										
										
										
											2025-01-22 16:18:30 +01:00
										 |  |  | } |