| 1 | /*********************************************************************NVMH3**** | 
|---|
| 2 | Copyright NVIDIA Corporation 2003 | 
|---|
| 3 | TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, THIS SOFTWARE IS PROVIDED | 
|---|
| 4 | *AS IS* AND NVIDIA AND ITS SUPPLIERS DISCLAIM ALL WARRANTIES, EITHER EXPRESS | 
|---|
| 5 | OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY | 
|---|
| 6 | AND FITNESS FOR A PARTICULAR PURPOSE.  IN NO EVENT SHALL NVIDIA OR ITS SUPPLIERS | 
|---|
| 7 | BE LIABLE FOR ANY SPECIAL, INCIDENTAL, INDIRECT, OR CONSEQUENTIAL DAMAGES | 
|---|
| 8 | WHATSOEVER (INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF BUSINESS PROFITS, | 
|---|
| 9 | BUSINESS INTERRUPTION, LOSS OF BUSINESS INFORMATION, OR ANY OTHER PECUNIARY LOSS) | 
|---|
| 10 | ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF NVIDIA HAS | 
|---|
| 11 | BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. | 
|---|
| 12 |  | 
|---|
| 13 |  | 
|---|
| 14 | Comments: | 
|---|
| 15 |         Simple ocean shader with animated bump map and geometric waves | 
|---|
| 16 |         Based partly on "Effective Water Simulation From Physical Models", GPU Gems | 
|---|
| 17 |  | 
|---|
| 18 | 11 Aug 05: converted from HLSL to GLSL by Jeff Doyle (nfz) to work in Ogre | 
|---|
| 19 |  | 
|---|
| 20 | ******************************************************************************/ | 
|---|
| 21 |  | 
|---|
| 22 | uniform vec3 eyePosition; | 
|---|
| 23 | uniform float BumpScale; | 
|---|
| 24 | uniform vec2 textureScale; | 
|---|
| 25 | uniform vec2 bumpSpeed; | 
|---|
| 26 | uniform float time; | 
|---|
| 27 | uniform float waveFreq; | 
|---|
| 28 | uniform float waveAmp; | 
|---|
| 29 |  | 
|---|
| 30 | varying mat3 rotMatrix; //  transform from tangent to obj space | 
|---|
| 31 | varying vec2 bumpCoord0; | 
|---|
| 32 | varying vec2 bumpCoord1; | 
|---|
| 33 | varying vec2 bumpCoord2; | 
|---|
| 34 | varying vec3 eyeVector; | 
|---|
| 35 |  | 
|---|
| 36 | // wave functions | 
|---|
| 37 | struct Wave { | 
|---|
| 38 |   float freq;  // 2*PI / wavelength | 
|---|
| 39 |   float amp;   // amplitude | 
|---|
| 40 |   float phase; // speed * 2*PI / wavelength | 
|---|
| 41 |   vec2 dir; | 
|---|
| 42 | }; | 
|---|
| 43 |  | 
|---|
| 44 |  | 
|---|
| 45 | void main(void) | 
|---|
| 46 | { | 
|---|
| 47 |  | 
|---|
| 48 |         #define NWAVES 2 | 
|---|
| 49 |  | 
|---|
| 50 |         Wave wave[NWAVES]; | 
|---|
| 51 |  | 
|---|
| 52 |         wave[0] = Wave( waveFreq, waveAmp, 0.5, vec2(-1, 0) ); | 
|---|
| 53 |         wave[1] = Wave( 3.0 * waveFreq, 0.33 * waveAmp, 1.7, vec2(-0.7, 0.7) ); | 
|---|
| 54 |  | 
|---|
| 55 |  | 
|---|
| 56 |     vec4 P = gl_Vertex; | 
|---|
| 57 |  | 
|---|
| 58 |         // sum waves | 
|---|
| 59 |         float ddx = 0.0, ddy = 0.0; | 
|---|
| 60 |         float deriv; | 
|---|
| 61 |         float angle; | 
|---|
| 62 |  | 
|---|
| 63 |         // wave synthesis using two sine waves at different frequencies and phase shift | 
|---|
| 64 |         for(int i = 0; i<NWAVES; ++i) | 
|---|
| 65 |         { | 
|---|
| 66 |                 angle = dot(wave[i].dir, P.xz) * wave[i].freq + time * wave[i].phase; | 
|---|
| 67 |                 P.y += wave[i].amp * sin( angle ); | 
|---|
| 68 |                 // calculate derivate of wave function | 
|---|
| 69 |                 deriv = wave[i].freq * wave[i].amp * cos(angle); | 
|---|
| 70 |                 ddx -= deriv * wave[i].dir.x; | 
|---|
| 71 |                 ddy -= deriv * wave[i].dir.y; | 
|---|
| 72 |         } | 
|---|
| 73 |  | 
|---|
| 74 |         // compute the 3x3 tranform from tangent space to object space | 
|---|
| 75 |         // compute tangent basis | 
|---|
| 76 |     vec3 T = normalize(vec3(1.0, ddy, 0.0)) * BumpScale; | 
|---|
| 77 |     vec3 B = normalize(vec3(0.0, ddx, 1.0)) * BumpScale; | 
|---|
| 78 |     vec3 N = normalize(vec3(ddx, 1.0, ddy)); | 
|---|
| 79 |  | 
|---|
| 80 |         rotMatrix = mat3(T, B, N); | 
|---|
| 81 |  | 
|---|
| 82 |         gl_Position = gl_ModelViewProjectionMatrix * P; | 
|---|
| 83 |  | 
|---|
| 84 |         // calculate texture coordinates for normal map lookup | 
|---|
| 85 |         bumpCoord0.xy = gl_MultiTexCoord0.xy * textureScale + time * bumpSpeed; | 
|---|
| 86 |         bumpCoord1.xy = gl_MultiTexCoord0.xy * textureScale * 2.0 + time * bumpSpeed * 4.0; | 
|---|
| 87 |         bumpCoord2.xy = gl_MultiTexCoord0.xy * textureScale * 4.0 + time * bumpSpeed * 8.0; | 
|---|
| 88 |  | 
|---|
| 89 |  | 
|---|
| 90 |         eyeVector = P.xyz - eyePosition; // eye position in vertex space | 
|---|
| 91 | } | 
|---|