Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/trunk/Tutorial/Media/materials/programs/Ocean2GLSL.vert @ 44

Last change on this file since 44 was 44, checked in by bknecht, 17 years ago

merge from tutorial branche to trunk

File size: 2.9 KB
Line 
1/*********************************************************************NVMH3****
2Copyright NVIDIA Corporation 2003
3TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, THIS SOFTWARE IS PROVIDED
4*AS IS* AND NVIDIA AND ITS SUPPLIERS DISCLAIM ALL WARRANTIES, EITHER EXPRESS
5OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY
6AND FITNESS FOR A PARTICULAR PURPOSE.  IN NO EVENT SHALL NVIDIA OR ITS SUPPLIERS
7BE LIABLE FOR ANY SPECIAL, INCIDENTAL, INDIRECT, OR CONSEQUENTIAL DAMAGES
8WHATSOEVER (INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF BUSINESS PROFITS,
9BUSINESS INTERRUPTION, LOSS OF BUSINESS INFORMATION, OR ANY OTHER PECUNIARY LOSS)
10ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF NVIDIA HAS
11BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
12
13
14Comments:
15        Simple ocean shader with animated bump map and geometric waves
16        Based partly on "Effective Water Simulation From Physical Models", GPU Gems
17
1811 Aug 05: converted from HLSL to GLSL by Jeff Doyle (nfz) to work in Ogre
19
20******************************************************************************/
21
22uniform vec3 eyePosition;
23uniform float BumpScale;
24uniform vec2 textureScale;
25uniform vec2 bumpSpeed;
26uniform float time;
27uniform float waveFreq;
28uniform float waveAmp;
29
30varying mat3 rotMatrix; //  transform from tangent to obj space
31varying vec2 bumpCoord0;
32varying vec2 bumpCoord1;
33varying vec2 bumpCoord2;
34varying vec3 eyeVector;
35
36// wave functions
37struct Wave {
38  float freq;  // 2*PI / wavelength
39  float amp;   // amplitude
40  float phase; // speed * 2*PI / wavelength
41  vec2 dir;
42};
43
44
45void 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}
Note: See TracBrowser for help on using the repository browser.