/*********************************************************************NVMH3**** Copyright NVIDIA Corporation 2003 TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, THIS SOFTWARE IS PROVIDED *AS IS* AND NVIDIA AND ITS SUPPLIERS DISCLAIM ALL WARRANTIES, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL NVIDIA OR ITS SUPPLIERS BE LIABLE FOR ANY SPECIAL, INCIDENTAL, INDIRECT, OR CONSEQUENTIAL DAMAGES WHATSOEVER (INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF BUSINESS PROFITS, BUSINESS INTERRUPTION, LOSS OF BUSINESS INFORMATION, OR ANY OTHER PECUNIARY LOSS) ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF NVIDIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. Comments: Simple ocean shader with animated bump map and geometric waves Based partly on "Effective Water Simulation From Physical Models", GPU Gems 11 Aug 05: heavily modified by Jeff Doyle (nfz) for Ogre ******************************************************************************/ struct a2v { float4 Position : POSITION; // in object space float2 TexCoord : TEXCOORD0; }; struct v2f { float4 Position : POSITION; // in clip space float3 rotMatrix1 : TEXCOORD0; // first row of the 3x3 transform from tangent to obj space float3 rotMatrix2 : TEXCOORD1; // second row of the 3x3 transform from tangent to obj space float3 rotMatrix3 : TEXCOORD2; // third row of the 3x3 transform from tangent to obj space float2 bumpCoord0 : TEXCOORD3; float2 bumpCoord1 : TEXCOORD4; float2 bumpCoord2 : TEXCOORD5; float3 eyeVector : TEXCOORD6; }; // wave functions struct Wave { float freq; // 2*PI / wavelength float amp; // amplitude float phase; // speed * 2*PI / wavelength float2 dir; }; v2f main(a2v IN, uniform float4x4 WorldViewProj, uniform float3 eyePosition, uniform float BumpScale, uniform float2 textureScale, uniform float2 bumpSpeed, uniform float time, uniform float waveFreq, uniform float waveAmp ) { v2f OUT; #define NWAVES 2 Wave wave[NWAVES] = { { 1.0, 1.0, 0.5, float2(-1, 0) }, { 2.0, 0.5, 1.7, float2(-0.7, 0.7) } }; wave[0].freq = waveFreq; wave[0].amp = waveAmp; wave[1].freq = waveFreq * 3.0; wave[1].amp = waveAmp * 0.33; float4 P = IN.Position; // sum waves float ddx = 0.0, ddy = 0.0; float deriv; float angle; // wave synthesis using two sine waves at different frequencies and phase shift for(int i = 0; i