2017-07-08 14:12:18 +02:00
|
|
|
// http://sebastien.hillaire.free.fr/index.php?option=com_content&view=article&id=72&Itemid=106
|
|
|
|
#version 450
|
|
|
|
|
|
|
|
#ifdef GL_ES
|
|
|
|
precision mediump float;
|
|
|
|
#endif
|
|
|
|
|
2017-12-13 14:21:42 +01:00
|
|
|
#include "compiled.glsl"
|
|
|
|
#include "std/gbuffer.glsl"
|
|
|
|
#include "std/shadows.glsl"
|
2017-07-08 14:12:18 +02:00
|
|
|
|
|
|
|
uniform sampler2D gbufferD;
|
|
|
|
#ifndef _NoShadows
|
|
|
|
//!uniform sampler2D shadowMap;
|
|
|
|
//!uniform samplerCube shadowMapCube;
|
|
|
|
#endif
|
|
|
|
uniform sampler2D snoise;
|
|
|
|
|
|
|
|
uniform mat4 LWVP;
|
|
|
|
uniform vec3 eye;
|
|
|
|
uniform vec3 eyeLook;
|
2017-11-04 18:35:34 +01:00
|
|
|
uniform vec2 cameraProj;
|
2017-07-08 14:12:18 +02:00
|
|
|
uniform vec3 lightPos;
|
|
|
|
uniform vec3 lightColor;
|
|
|
|
uniform float lightRadius;
|
|
|
|
uniform float shadowsBias;
|
|
|
|
// uniform int lightShadow;
|
|
|
|
// uniform vec2 lightPlane;
|
|
|
|
|
|
|
|
in vec2 texCoord;
|
|
|
|
in vec3 viewRay;
|
|
|
|
out vec4 fragColor;
|
|
|
|
|
|
|
|
const float tScat = 0.08;
|
|
|
|
const float tAbs = 0.0;
|
|
|
|
const float tExt = 0.0; //tScat + tAbs;
|
|
|
|
// const float stepLen = 1.0 / 11.0;
|
|
|
|
const float stepLen = 1.0 / 80; // Temporary..
|
|
|
|
|
|
|
|
// const float lighting = 0.4;
|
|
|
|
float lighting(vec3 p) {
|
|
|
|
vec3 L = lightPos.xyz - p.xyz;
|
|
|
|
float Ldist = length(lightPos.xyz - p.xyz);
|
|
|
|
vec3 Lnorm = L / Ldist;
|
|
|
|
|
|
|
|
float linearAtenuation = min(1.0, max(0.0, (lightRadius - Ldist) / lightRadius));
|
|
|
|
return linearAtenuation; //* min(1.0, 1.0 / (Ldist * Ldist));
|
|
|
|
}
|
|
|
|
|
|
|
|
void rayStep(inout vec3 curPos, inout float curOpticalDepth, inout float scatteredLightAmount, float stepLenWorld, vec3 viewVecNorm) {
|
|
|
|
curPos += stepLenWorld * viewVecNorm;
|
|
|
|
float density = 1.0;
|
|
|
|
|
|
|
|
float l1 = lighting(curPos) * stepLenWorld * tScat * density;
|
|
|
|
curOpticalDepth *= exp(-tExt * stepLenWorld * density);
|
|
|
|
// vec3 lightDir = (lightPos - curPos);
|
|
|
|
// vec3 lightDirNorm = -normalize(lightDir);
|
|
|
|
|
|
|
|
float visibility = 1.0;
|
|
|
|
vec4 lampPos = LWVP * vec4(curPos, 1.0);
|
|
|
|
if (lampPos.w > 0.0) {
|
|
|
|
lampPos.xyz /= lampPos.w;
|
|
|
|
visibility = float(texture(shadowMap, lampPos.xy).r > lampPos.z - shadowsBias);
|
|
|
|
}
|
|
|
|
// Cubemap
|
|
|
|
// visibility = float(texture(shadowMapCube, -l).r + shadowsBias > lpToDepth(lp, lightPlane));
|
|
|
|
|
|
|
|
scatteredLightAmount += curOpticalDepth * l1 * visibility;
|
|
|
|
}
|
|
|
|
|
|
|
|
void main() {
|
|
|
|
float pixelRayMarchNoise = texture(snoise, texCoord).r;
|
|
|
|
|
|
|
|
float depth = texture(gbufferD, texCoord).r * 2.0 - 1.0;
|
2017-11-04 18:35:34 +01:00
|
|
|
vec3 worldPos = getPos(eye, eyeLook, viewRay, depth, cameraProj);
|
2017-07-08 14:12:18 +02:00
|
|
|
|
|
|
|
vec3 viewVec = worldPos - 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 * (2.0 * pixelRayMarchNoise - 1.0);
|
|
|
|
|
|
|
|
// for(float l = stepLen; l < 0.99999; l += stepLen) {// Do not do the first and last steps
|
|
|
|
// Raw steps for now..
|
|
|
|
rayStep(curPos, curOpticalDepth, scatteredLightAmount, stepLenWorld, viewVecNorm);
|
|
|
|
rayStep(curPos, curOpticalDepth, scatteredLightAmount, stepLenWorld, viewVecNorm);
|
|
|
|
rayStep(curPos, curOpticalDepth, scatteredLightAmount, stepLenWorld, viewVecNorm);
|
|
|
|
rayStep(curPos, curOpticalDepth, scatteredLightAmount, stepLenWorld, viewVecNorm);
|
|
|
|
rayStep(curPos, curOpticalDepth, scatteredLightAmount, stepLenWorld, viewVecNorm);
|
|
|
|
rayStep(curPos, curOpticalDepth, scatteredLightAmount, stepLenWorld, viewVecNorm);
|
|
|
|
rayStep(curPos, curOpticalDepth, scatteredLightAmount, stepLenWorld, viewVecNorm);
|
|
|
|
rayStep(curPos, curOpticalDepth, scatteredLightAmount, stepLenWorld, viewVecNorm);
|
|
|
|
rayStep(curPos, curOpticalDepth, scatteredLightAmount, stepLenWorld, viewVecNorm);
|
|
|
|
rayStep(curPos, curOpticalDepth, scatteredLightAmount, stepLenWorld, viewVecNorm);
|
|
|
|
|
|
|
|
rayStep(curPos, curOpticalDepth, scatteredLightAmount, stepLenWorld, viewVecNorm);
|
|
|
|
rayStep(curPos, curOpticalDepth, scatteredLightAmount, stepLenWorld, viewVecNorm);
|
|
|
|
rayStep(curPos, curOpticalDepth, scatteredLightAmount, stepLenWorld, viewVecNorm);
|
|
|
|
rayStep(curPos, curOpticalDepth, scatteredLightAmount, stepLenWorld, viewVecNorm);
|
|
|
|
rayStep(curPos, curOpticalDepth, scatteredLightAmount, stepLenWorld, viewVecNorm);
|
|
|
|
rayStep(curPos, curOpticalDepth, scatteredLightAmount, stepLenWorld, viewVecNorm);
|
|
|
|
rayStep(curPos, curOpticalDepth, scatteredLightAmount, stepLenWorld, viewVecNorm);
|
|
|
|
rayStep(curPos, curOpticalDepth, scatteredLightAmount, stepLenWorld, viewVecNorm);
|
|
|
|
rayStep(curPos, curOpticalDepth, scatteredLightAmount, stepLenWorld, viewVecNorm);
|
|
|
|
rayStep(curPos, curOpticalDepth, scatteredLightAmount, stepLenWorld, viewVecNorm);
|
|
|
|
|
|
|
|
rayStep(curPos, curOpticalDepth, scatteredLightAmount, stepLenWorld, viewVecNorm);
|
|
|
|
rayStep(curPos, curOpticalDepth, scatteredLightAmount, stepLenWorld, viewVecNorm);
|
|
|
|
rayStep(curPos, curOpticalDepth, scatteredLightAmount, stepLenWorld, viewVecNorm);
|
|
|
|
rayStep(curPos, curOpticalDepth, scatteredLightAmount, stepLenWorld, viewVecNorm);
|
|
|
|
rayStep(curPos, curOpticalDepth, scatteredLightAmount, stepLenWorld, viewVecNorm);
|
|
|
|
rayStep(curPos, curOpticalDepth, scatteredLightAmount, stepLenWorld, viewVecNorm);
|
|
|
|
rayStep(curPos, curOpticalDepth, scatteredLightAmount, stepLenWorld, viewVecNorm);
|
|
|
|
rayStep(curPos, curOpticalDepth, scatteredLightAmount, stepLenWorld, viewVecNorm);
|
|
|
|
rayStep(curPos, curOpticalDepth, scatteredLightAmount, stepLenWorld, viewVecNorm);
|
|
|
|
rayStep(curPos, curOpticalDepth, scatteredLightAmount, stepLenWorld, viewVecNorm);
|
|
|
|
|
|
|
|
rayStep(curPos, curOpticalDepth, scatteredLightAmount, stepLenWorld, viewVecNorm);
|
|
|
|
rayStep(curPos, curOpticalDepth, scatteredLightAmount, stepLenWorld, viewVecNorm);
|
|
|
|
rayStep(curPos, curOpticalDepth, scatteredLightAmount, stepLenWorld, viewVecNorm);
|
|
|
|
rayStep(curPos, curOpticalDepth, scatteredLightAmount, stepLenWorld, viewVecNorm);
|
|
|
|
rayStep(curPos, curOpticalDepth, scatteredLightAmount, stepLenWorld, viewVecNorm);
|
|
|
|
rayStep(curPos, curOpticalDepth, scatteredLightAmount, stepLenWorld, viewVecNorm);
|
|
|
|
rayStep(curPos, curOpticalDepth, scatteredLightAmount, stepLenWorld, viewVecNorm);
|
|
|
|
rayStep(curPos, curOpticalDepth, scatteredLightAmount, stepLenWorld, viewVecNorm);
|
|
|
|
rayStep(curPos, curOpticalDepth, scatteredLightAmount, stepLenWorld, viewVecNorm);
|
|
|
|
rayStep(curPos, curOpticalDepth, scatteredLightAmount, stepLenWorld, viewVecNorm);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
rayStep(curPos, curOpticalDepth, scatteredLightAmount, stepLenWorld, viewVecNorm);
|
|
|
|
rayStep(curPos, curOpticalDepth, scatteredLightAmount, stepLenWorld, viewVecNorm);
|
|
|
|
rayStep(curPos, curOpticalDepth, scatteredLightAmount, stepLenWorld, viewVecNorm);
|
|
|
|
rayStep(curPos, curOpticalDepth, scatteredLightAmount, stepLenWorld, viewVecNorm);
|
|
|
|
rayStep(curPos, curOpticalDepth, scatteredLightAmount, stepLenWorld, viewVecNorm);
|
|
|
|
rayStep(curPos, curOpticalDepth, scatteredLightAmount, stepLenWorld, viewVecNorm);
|
|
|
|
rayStep(curPos, curOpticalDepth, scatteredLightAmount, stepLenWorld, viewVecNorm);
|
|
|
|
rayStep(curPos, curOpticalDepth, scatteredLightAmount, stepLenWorld, viewVecNorm);
|
|
|
|
rayStep(curPos, curOpticalDepth, scatteredLightAmount, stepLenWorld, viewVecNorm);
|
|
|
|
rayStep(curPos, curOpticalDepth, scatteredLightAmount, stepLenWorld, viewVecNorm);
|
|
|
|
|
|
|
|
rayStep(curPos, curOpticalDepth, scatteredLightAmount, stepLenWorld, viewVecNorm);
|
|
|
|
rayStep(curPos, curOpticalDepth, scatteredLightAmount, stepLenWorld, viewVecNorm);
|
|
|
|
rayStep(curPos, curOpticalDepth, scatteredLightAmount, stepLenWorld, viewVecNorm);
|
|
|
|
rayStep(curPos, curOpticalDepth, scatteredLightAmount, stepLenWorld, viewVecNorm);
|
|
|
|
rayStep(curPos, curOpticalDepth, scatteredLightAmount, stepLenWorld, viewVecNorm);
|
|
|
|
rayStep(curPos, curOpticalDepth, scatteredLightAmount, stepLenWorld, viewVecNorm);
|
|
|
|
rayStep(curPos, curOpticalDepth, scatteredLightAmount, stepLenWorld, viewVecNorm);
|
|
|
|
rayStep(curPos, curOpticalDepth, scatteredLightAmount, stepLenWorld, viewVecNorm);
|
|
|
|
rayStep(curPos, curOpticalDepth, scatteredLightAmount, stepLenWorld, viewVecNorm);
|
|
|
|
rayStep(curPos, curOpticalDepth, scatteredLightAmount, stepLenWorld, viewVecNorm);
|
|
|
|
|
|
|
|
|
|
|
|
rayStep(curPos, curOpticalDepth, scatteredLightAmount, stepLenWorld, viewVecNorm);
|
|
|
|
rayStep(curPos, curOpticalDepth, scatteredLightAmount, stepLenWorld, viewVecNorm);
|
|
|
|
rayStep(curPos, curOpticalDepth, scatteredLightAmount, stepLenWorld, viewVecNorm);
|
|
|
|
rayStep(curPos, curOpticalDepth, scatteredLightAmount, stepLenWorld, viewVecNorm);
|
|
|
|
rayStep(curPos, curOpticalDepth, scatteredLightAmount, stepLenWorld, viewVecNorm);
|
|
|
|
rayStep(curPos, curOpticalDepth, scatteredLightAmount, stepLenWorld, viewVecNorm);
|
|
|
|
rayStep(curPos, curOpticalDepth, scatteredLightAmount, stepLenWorld, viewVecNorm);
|
|
|
|
rayStep(curPos, curOpticalDepth, scatteredLightAmount, stepLenWorld, viewVecNorm);
|
|
|
|
rayStep(curPos, curOpticalDepth, scatteredLightAmount, stepLenWorld, viewVecNorm);
|
|
|
|
rayStep(curPos, curOpticalDepth, scatteredLightAmount, stepLenWorld, viewVecNorm);
|
|
|
|
|
|
|
|
rayStep(curPos, curOpticalDepth, scatteredLightAmount, stepLenWorld, viewVecNorm);
|
|
|
|
rayStep(curPos, curOpticalDepth, scatteredLightAmount, stepLenWorld, viewVecNorm);
|
|
|
|
rayStep(curPos, curOpticalDepth, scatteredLightAmount, stepLenWorld, viewVecNorm);
|
|
|
|
rayStep(curPos, curOpticalDepth, scatteredLightAmount, stepLenWorld, viewVecNorm);
|
|
|
|
rayStep(curPos, curOpticalDepth, scatteredLightAmount, stepLenWorld, viewVecNorm);
|
|
|
|
rayStep(curPos, curOpticalDepth, scatteredLightAmount, stepLenWorld, viewVecNorm);
|
|
|
|
rayStep(curPos, curOpticalDepth, scatteredLightAmount, stepLenWorld, viewVecNorm);
|
|
|
|
rayStep(curPos, curOpticalDepth, scatteredLightAmount, stepLenWorld, viewVecNorm);
|
|
|
|
rayStep(curPos, curOpticalDepth, scatteredLightAmount, stepLenWorld, viewVecNorm);
|
|
|
|
rayStep(curPos, curOpticalDepth, scatteredLightAmount, stepLenWorld, viewVecNorm);
|
|
|
|
// }
|
|
|
|
|
|
|
|
// curOpticalDepth
|
|
|
|
fragColor = vec4(vec3(scatteredLightAmount * volumAirColor * normalize(lightColor.rgb) * volumAirTurbidity), 1.0); // * ((1.0 - depth) * 10.0)
|
|
|
|
}
|