DYT/Source/resources/shaders/osgOcean_water_distortion.frag

45 lines
1.4 KiB
GLSL
Raw Normal View History

2024-11-22 15:11:48 +00:00
// 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 );
}