source: OGRE/trunk/ogrenew/Samples/Media/materials/programs/Ocean2GLSL.vert @ 692

Revision 692, 2.9 KB checked in by mattausch, 18 years ago (diff)

adding ogre 1.2 and dependencies

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        gl_Position = gl_ModelViewProjectionMatrix * P;
75       
76        // calculate texture coordinates for normal map lookup
77        bumpCoord0.xy = gl_MultiTexCoord0.xy * textureScale + time * bumpSpeed;
78        bumpCoord1.xy = gl_MultiTexCoord0.xy * textureScale * 2.0 + time * bumpSpeed * 4.0;
79        bumpCoord2.xy = gl_MultiTexCoord0.xy * textureScale * 4.0 + time * bumpSpeed * 8.0;
80
81        // compute the 3x3 tranform from tangent space to object space
82        // compute tangent basis
83    vec3 B = normalize(vec3(1.0, ddx, 0.0)) * BumpScale;
84    vec3 T = normalize(vec3(0.0, ddy, 1.0)) * BumpScale;
85    vec3 N = normalize(vec3(-ddx, 1.0, -ddy));
86   
87        rotMatrix = mat3(T, B, N);
88
89        eyeVector = P.xyz - eyePosition; // eye position in vertex space
90}
Note: See TracBrowser for help on using the repository browser.