In yet another shader question (honestly, you're the best guy I know for these): how do I rotate the effects of a shader by a camera? I have a simple lake water shader that I've part copied, part written myself, which makes for a very convincing lake if you don't turn the camera. How do I rotate everything along with the camera? Below is the fragment shader (which is the whole thing, really):

`uniform float iGlobalTime;`

uniform vec3 iResolution;

uniform sampler2D iChannel0;

uniform sampler2D iChannel1;

uniform sampler2D iChannel2;

uniform sampler2D iChannel3;

#ifdef GL_ES

precision highp float;

#endif

const float PI = 3.1415926535897932;

// play with these parameters to customize the effect

// ===================================================

//speed

const float speed = 0.1;

const float speed_x = -0.1;//.15

const float speed_y = -0.1;//.15

// refraction

const float emboss = 0.50;//.5

const float intensity = .5;//2.4

const int steps = 8;

const float frequency = 6.0;

const int angle = 7; // better when a prime

// reflection

const float delta = 60.;//60

const float intence = 700.;//700

const float reflectionCutOff = 0.012;

const float reflectionIntence = 200000.;

// ===================================================

float time = iGlobalTime*1.3;

float col(vec2 coord) {

float delta_theta = 2.0 * PI / float(angle);

float col = 0.0;

float theta = 0.0;

for (int i = 0; i < steps; i++) {

vec2 adjc = coord;

theta = delta_theta*float(i);

adjc.x += cos(theta)*time*speed + time * speed_x;

adjc.y -= sin(theta)*time*speed - time * speed_y;

col = col + cos( (adjc.x*cos(theta) - adjc.y*sin(theta))*frequency)*intensity;

}

return cos(col);

}

void main(void) {

vec2 p = (gl_FragCoord.xy) / iResolution.xy, c1 = p, c2 = p;

float cc1 = col(c1);

c2.x += iResolution.x/delta;

float dx = emboss*(cc1-col(c2))/delta;

c2.x = p.x;

c2.y += iResolution.y/delta;

float dy = emboss*(cc1-col(c2))/delta;

c1.x += dx*2.;

c1.y = -(c1.y+dy*2.);

float alpha = 1.+dot(dx,dy)*intence;

float ddx = dx - reflectionCutOff;

float ddy = dy - reflectionCutOff;

if (ddx > 0. && ddy > 0.)

alpha = pow(alpha, ddx*ddy*reflectionIntence);

vec4 col = texture2D(iChannel0,c1)*(alpha);

vec4 col2 = texture2D(iChannel1,c1)*(alpha);

vec4 col3 = mix(col, col2, .4);

gl_FragColor = col3;

}