//////////// CONNECTOR STRUCTS ////////////////// struct AppData { float4 Position : POSITION; // in object space float2 UV : TEXCOORD0; float3 Tangent : TEXCOORD1; float3 Binormal : TEXCOORD2; float3 Normal : NORMAL; }; struct OceanVertOut { float4 HPosition : POSITION; // in clip space float2 UV : TEXCOORD0; float3 T2WXf1 : TEXCOORD1; // first row of the 3x3 transform from tangent to cube space float3 T2WXf2 : TEXCOORD2; // second row of the 3x3 transform from tangent to cube space float3 T2WXf3 : TEXCOORD3; // third row of the 3x3 transform from tangent to cube space float2 bumpUV0 : TEXCOORD4; float2 bumpUV1 : TEXCOORD5; float2 bumpUV2 : TEXCOORD6; float3 WorldView : TEXCOORD7; }; // wave functions /////////////////////// struct Wave { float freq; // 2*PI / wavelength float amp; // amplitude float phase; // speed * 2*PI / wavelength float2 dir; }; #define NWAVES 2 Wave wave[NWAVES] = { { 1.0, 1.0, 0.5, float2(-1, 0) }, { 2.0, 0.5, 1.3, float2(-0.7, 0.7) } }; float evaluateWave(Wave w, float2 pos, float t) { return w.amp * sin( dot(w.dir, pos)*w.freq + t*w.phase); } // derivative of wave function float evaluateWaveDeriv(Wave w, float2 pos, float t) { return w.freq*w.amp * cos( dot(w.dir, pos)*w.freq + t*w.phase); } // sharp wave functions float evaluateWaveSharp(Wave w, float2 pos, float t, float k) { return w.amp * pow(sin( dot(w.dir, pos)*w.freq + t*w.phase)* 0.5 + 0.5 , k); } float evaluateWaveDerivSharp(Wave w, float2 pos, float t, float k) { return k*w.freq*w.amp * pow(sin( dot(w.dir, pos)*w.freq + t*w.phase)* 0.5 + 0.5 , k - 1) * cos( dot(w.dir, pos)*w.freq + t*w.phase); } ///////// SHADER FUNCTIONS /////////////// OceanVertOut OceanVS(AppData IN, uniform float4x4 WorldITXf, // our four standard "untweakable" xforms uniform float4x4 WorldXf, uniform float4x4 ViewIXf, uniform float4x4 WvpXf, uniform float Timer, uniform float WaveAmp, uniform float WaveFreq, uniform float BumpScale, uniform float TexReptX, uniform float TexReptY, uniform float BumpSpeedX, uniform float BumpSpeedY ) { OceanVertOut OUT = (OceanVertOut)0; wave[0].freq = WaveFreq; wave[0].amp = WaveAmp; wave[1].freq = WaveFreq*2.0; wave[1].amp = WaveAmp*0.5; float4 Po = float4(IN.Position.xyz,1.0); // sum waves Po.y = 0.0; float ddx = 0.0, ddy = 0.0; for(int i=0; i