56 lines
1.4 KiB
GLSL
56 lines
1.4 KiB
GLSL
uniform sampler2DRect osgOcean_GodRayTexture;
|
|
|
|
uniform vec3 osgOcean_SunDir;
|
|
uniform vec3 osgOcean_HGg; // Eccentricity constants controls power of forward scattering
|
|
uniform float osgOcean_Intensity; // Intensity tweak for god rays
|
|
uniform vec3 osgOcean_Eye;
|
|
|
|
varying vec3 vRay;
|
|
|
|
const float bias = 0.15; // used to hide aliasing
|
|
|
|
// Mie phase function
|
|
float computeMie(vec3 viewDir, vec3 sunDir)
|
|
{
|
|
float num = osgOcean_HGg.x;
|
|
float den = (osgOcean_HGg.y - osgOcean_HGg.z*dot(sunDir, viewDir));
|
|
den = inversesqrt(den);
|
|
|
|
float phase = num * (den*den*den);
|
|
|
|
return phase;
|
|
}
|
|
|
|
// ----------------------------------------------
|
|
// Main Program
|
|
// ----------------------------------------------
|
|
|
|
void main( void )
|
|
{
|
|
vec4 shafts;
|
|
|
|
// average the pixels out a little to hide aliasing
|
|
// TODO: Maybe try a weak blur filter
|
|
shafts += texture2DRect(osgOcean_GodRayTexture, gl_TexCoord[1].xy);
|
|
shafts += texture2DRect(osgOcean_GodRayTexture, gl_TexCoord[1].zw);
|
|
shafts += texture2DRect(osgOcean_GodRayTexture, gl_TexCoord[2].xy);
|
|
shafts += texture2DRect(osgOcean_GodRayTexture, gl_TexCoord[2].zw);
|
|
|
|
shafts /= 4.0;
|
|
|
|
vec3 rayNormalised = normalize(vRay-osgOcean_Eye);
|
|
|
|
float phase = computeMie(rayNormalised, -osgOcean_SunDir);
|
|
|
|
// Calculate final color, adding a little bias (0.15 here)
|
|
// to hide aliasing
|
|
vec3 colour = (bias+osgOcean_Intensity*shafts.rgb)*phase;
|
|
|
|
vec3 ray = ( rayNormalised + vec3(1.0) ) / 2.0;
|
|
|
|
gl_FragColor = vec4(colour, 1.0);
|
|
}
|
|
|
|
|
|
|