46 lines
1.3 KiB
GLSL
46 lines
1.3 KiB
GLSL
// oceanGLSL.frag
|
|
// fragment program for Ocean water simulation
|
|
// 05 Aug 2005
|
|
// adapted for Ogre by nfz
|
|
// converted from HLSL to GLSL
|
|
// original shader source from Render Monkey 1.6 Reflections Refractions.rfx
|
|
|
|
// 06 Aug 2005: moved uvw calculation from fragment program into vertex program
|
|
|
|
uniform float fadeBias;
|
|
uniform float fadeExp;
|
|
uniform vec4 waterColor;
|
|
uniform sampler3D Noise;
|
|
uniform samplerCube skyBox;
|
|
|
|
varying vec3 uvw;
|
|
varying vec3 normal;
|
|
varying vec3 vVec;
|
|
|
|
void main(void)
|
|
{
|
|
vec3 noisy = texture3D(Noise, uvw).xyz;
|
|
|
|
// convert to signed noise
|
|
vec3 bump = 2.0 * noisy - 1.0;
|
|
bump.xz *= 0.15;
|
|
// Make sure the normal always points upwards
|
|
// note that Ogres y axis is vertical (RM Z axis is vertical)
|
|
bump.y = 0.8 * abs(bump.y) + 0.2;
|
|
// Offset the surface normal with the bump
|
|
bump = normalize(normal + bump);
|
|
|
|
// Find the reflection vector
|
|
vec3 normView = normalize(vVec);
|
|
vec3 reflVec = reflect(normView, bump);
|
|
// Ogre has z flipped for cubemaps
|
|
reflVec.z = -reflVec.z;
|
|
vec4 refl = textureCube(skyBox, reflVec);
|
|
|
|
// set up for fresnel calc
|
|
float lrp = 1.0 - dot(-normView, bump);
|
|
|
|
// Interpolate between the water color and reflection for fresnel effect
|
|
gl_FragColor = mix(waterColor, refl, clamp(fadeBias + pow(lrp, fadeExp), 0.0, 1.0) );
|
|
}
|