DYTSrouce/resources/shaders/osgOcean_godray_screen_blend.frag

56 lines
1.4 KiB
GLSL
Raw Normal View History

2025-01-04 04:12:51 +00:00
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);
}