[390] | 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: heavily modified by Jeff Doyle (nfz) for Ogre |
---|
| 19 | |
---|
| 20 | ******************************************************************************/ |
---|
| 21 | |
---|
| 22 | struct a2v { |
---|
| 23 | float4 Position : POSITION; // in object space |
---|
| 24 | float2 TexCoord : TEXCOORD0; |
---|
| 25 | }; |
---|
| 26 | |
---|
| 27 | struct v2f { |
---|
| 28 | float4 Position : POSITION; // in clip space |
---|
| 29 | float3 rotMatrix1 : TEXCOORD0; // first row of the 3x3 transform from tangent to obj space |
---|
| 30 | float3 rotMatrix2 : TEXCOORD1; // second row of the 3x3 transform from tangent to obj space |
---|
| 31 | float3 rotMatrix3 : TEXCOORD2; // third row of the 3x3 transform from tangent to obj space |
---|
| 32 | |
---|
| 33 | float2 bumpCoord0 : TEXCOORD3; |
---|
| 34 | float2 bumpCoord1 : TEXCOORD4; |
---|
| 35 | float2 bumpCoord2 : TEXCOORD5; |
---|
| 36 | |
---|
| 37 | float3 eyeVector : TEXCOORD6; |
---|
| 38 | }; |
---|
| 39 | |
---|
| 40 | // wave functions |
---|
| 41 | |
---|
| 42 | struct Wave { |
---|
| 43 | float freq; // 2*PI / wavelength |
---|
| 44 | float amp; // amplitude |
---|
| 45 | float phase; // speed * 2*PI / wavelength |
---|
| 46 | float2 dir; |
---|
| 47 | }; |
---|
| 48 | |
---|
| 49 | v2f main(a2v IN, |
---|
| 50 | uniform float4x4 WorldViewProj, |
---|
| 51 | uniform float3 eyePosition, |
---|
| 52 | uniform float BumpScale, |
---|
| 53 | uniform float2 textureScale, |
---|
| 54 | uniform float2 bumpSpeed, |
---|
| 55 | uniform float time, |
---|
| 56 | uniform float waveFreq, |
---|
| 57 | uniform float waveAmp |
---|
| 58 | ) |
---|
| 59 | { |
---|
| 60 | v2f OUT; |
---|
| 61 | |
---|
| 62 | #define NWAVES 2 |
---|
| 63 | Wave wave[NWAVES] = { |
---|
| 64 | { 1.0, 1.0, 0.5, float2(-1, 0) }, |
---|
| 65 | { 2.0, 0.5, 1.7, float2(-0.7, 0.7) } |
---|
| 66 | }; |
---|
| 67 | |
---|
| 68 | wave[0].freq = waveFreq; |
---|
| 69 | wave[0].amp = waveAmp; |
---|
| 70 | |
---|
| 71 | wave[1].freq = waveFreq * 3.0; |
---|
| 72 | wave[1].amp = waveAmp * 0.33; |
---|
| 73 | |
---|
| 74 | float4 P = IN.Position; |
---|
| 75 | |
---|
| 76 | // sum waves |
---|
| 77 | float ddx = 0.0, ddy = 0.0; |
---|
| 78 | float deriv; |
---|
| 79 | float angle; |
---|
| 80 | |
---|
| 81 | // wave synthesis using two sine waves at different frequencies and phase shift |
---|
| 82 | for(int i = 0; i<NWAVES; ++i) |
---|
| 83 | { |
---|
| 84 | angle = dot(wave[i].dir, P.xz) * wave[i].freq + time * wave[i].phase; |
---|
| 85 | P.y += wave[i].amp * sin( angle ); |
---|
| 86 | // calculate derivate of wave function |
---|
| 87 | deriv = wave[i].freq * wave[i].amp * cos(angle); |
---|
| 88 | ddx -= deriv * wave[i].dir.x; |
---|
| 89 | ddy -= deriv * wave[i].dir.y; |
---|
| 90 | } |
---|
| 91 | |
---|
| 92 | // compute the 3x3 tranform from tangent space to object space |
---|
| 93 | // first rows are the tangent and binormal scaled by the bump scale |
---|
| 94 | |
---|
| 95 | OUT.rotMatrix1.xyz = BumpScale * normalize(float3(1, ddy, 0)); // Binormal |
---|
| 96 | OUT.rotMatrix2.xyz = BumpScale * normalize(float3(0, ddx, 1)); // Tangent |
---|
| 97 | OUT.rotMatrix3.xyz = normalize(float3(ddx, 1, ddy)); // Normal |
---|
| 98 | |
---|
| 99 | OUT.Position = mul(WorldViewProj, P); |
---|
| 100 | |
---|
| 101 | // calculate texture coordinates for normal map lookup |
---|
| 102 | OUT.bumpCoord0.xy = IN.TexCoord*textureScale + time * bumpSpeed; |
---|
| 103 | OUT.bumpCoord1.xy = IN.TexCoord*textureScale * 2.0 + time * bumpSpeed * 4.0; |
---|
| 104 | OUT.bumpCoord2.xy = IN.TexCoord*textureScale * 4.0 + time * bumpSpeed * 8.0; |
---|
| 105 | |
---|
| 106 | OUT.eyeVector = P.xyz - eyePosition; // eye position in vertex space |
---|
| 107 | return OUT; |
---|
| 108 | } |
---|