45 lines
1.4 KiB
GLSL
45 lines
1.4 KiB
GLSL
// Based on Jon Kennedy's heat haze shader
|
|
// Copyright (c) 2002-2006 3Dlabs Inc. Ltd.
|
|
|
|
uniform float osgOcean_Frequency;
|
|
uniform float osgOcean_Offset;
|
|
uniform float osgOcean_Speed;
|
|
uniform vec2 osgOcean_ScreenRes;
|
|
|
|
uniform sampler2DRect osgOcean_FrameBuffer;
|
|
|
|
varying vec4 vEyePos;
|
|
|
|
void main (void)
|
|
{
|
|
vec2 index;
|
|
|
|
// perform the div by w to put the texture into screen space
|
|
float recipW = 1.0 / vEyePos.w;
|
|
vec2 eye = vEyePos.xy * vec2(recipW);
|
|
|
|
float blend = max(1.0 - eye.y, 0.0);
|
|
|
|
// calc the wobble
|
|
// index.s = eye.x ;
|
|
index.s = eye.x + blend * sin( osgOcean_Frequency * 5.0 * eye.x + osgOcean_Offset * osgOcean_Speed ) * 0.004;
|
|
index.t = eye.y + blend * sin( osgOcean_Frequency * 5.0 * eye.y + osgOcean_Offset * osgOcean_Speed ) * 0.004;
|
|
|
|
// scale and shift so we're in the range 0-1
|
|
index.s = index.s * 0.5 + 0.5;
|
|
index.t = index.t * 0.5 + 0.5;
|
|
|
|
vec2 recipRes = vec2(1.0/osgOcean_ScreenRes.x, 1.0/osgOcean_ScreenRes.y);
|
|
|
|
index.s = clamp(index.s, 0.0, 1.0 - recipRes.x);
|
|
index.t = clamp(index.t, 0.0, 1.0 - recipRes.y);
|
|
|
|
// scale the texture so we just see the rendered framebuffer
|
|
index.s = index.s * osgOcean_ScreenRes.x;
|
|
index.t = index.t * osgOcean_ScreenRes.y;
|
|
|
|
vec3 RefractionColor = vec3( texture2DRect( osgOcean_FrameBuffer, index ) );
|
|
|
|
gl_FragColor = vec4( RefractionColor, 1.0 );
|
|
//gl_FragColor = texture2DRect( osgOcean_FrameBuffer, gl_TexCoord[0].st );
|
|
} |