Advertisement
Ember

Ocean

Mar 31st, 2014
64
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.33 KB | None | 0 0
  1. //////////// CONNECTOR STRUCTS //////////////////
  2.  
  3. struct AppData {
  4.     float4 Position : POSITION;   // in object space
  5.     float2 UV : TEXCOORD0;
  6.     float3 Tangent  : TEXCOORD1;
  7.     float3 Binormal : TEXCOORD2;
  8.     float3 Normal   : NORMAL;
  9. };
  10.  
  11. struct OceanVertOut {
  12.     float4 HPosition  : POSITION;  // in clip space
  13.     float2 UV  : TEXCOORD0;
  14.     float3 T2WXf1 : TEXCOORD1; // first row of the 3x3 transform from tangent to cube space
  15.     float3 T2WXf2 : TEXCOORD2; // second row of the 3x3 transform from tangent to cube space
  16.     float3 T2WXf3 : TEXCOORD3; // third row of the 3x3 transform from tangent to cube space
  17.     float2 bumpUV0 : TEXCOORD4;
  18.     float2 bumpUV1 : TEXCOORD5;
  19.     float2 bumpUV2 : TEXCOORD6;
  20.     float3 WorldView  : TEXCOORD7;
  21. };
  22.  
  23. // wave functions ///////////////////////
  24.  
  25. struct Wave {
  26.   float freq;  // 2*PI / wavelength
  27.   float amp;   // amplitude
  28.   float phase; // speed * 2*PI / wavelength
  29.   float2 dir;
  30. };
  31.  
  32. #define NWAVES 2
  33. Wave wave[NWAVES] = {
  34.     { 1.0, 1.0, 0.5, float2(-1, 0) },
  35.     { 2.0, 0.5, 1.3, float2(-0.7, 0.7) }   
  36. };
  37.  
  38. float evaluateWave(Wave w, float2 pos, float t)
  39. {
  40.   return w.amp * sin( dot(w.dir, pos)*w.freq + t*w.phase);
  41. }
  42.  
  43. // derivative of wave function
  44. float evaluateWaveDeriv(Wave w, float2 pos, float t)
  45. {
  46.   return w.freq*w.amp * cos( dot(w.dir, pos)*w.freq + t*w.phase);
  47. }
  48.  
  49. // sharp wave functions
  50. float evaluateWaveSharp(Wave w, float2 pos, float t, float k)
  51. {
  52.   return w.amp * pow(sin( dot(w.dir, pos)*w.freq + t*w.phase)* 0.5 + 0.5 , k);
  53. }
  54.  
  55. float evaluateWaveDerivSharp(Wave w, float2 pos, float t, float k)
  56. {
  57.   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);
  58. }
  59.  
  60. ///////// SHADER FUNCTIONS ///////////////
  61.  
  62. OceanVertOut OceanVS(AppData IN,
  63.     uniform float4x4 WorldITXf, // our four standard "untweakable" xforms
  64.     uniform float4x4 WorldXf,
  65.     uniform float4x4 ViewIXf,
  66.     uniform float4x4 WvpXf,
  67.     uniform float Timer,
  68.     uniform float WaveAmp,
  69.     uniform float WaveFreq,
  70.     uniform float BumpScale,
  71.     uniform float TexReptX,
  72.     uniform float TexReptY,
  73.     uniform float BumpSpeedX,
  74.     uniform float BumpSpeedY
  75. ) {
  76.     OceanVertOut OUT = (OceanVertOut)0;
  77.     wave[0].freq = WaveFreq;
  78.     wave[0].amp = WaveAmp;
  79.     wave[1].freq = WaveFreq*2.0;
  80.     wave[1].amp = WaveAmp*0.5;
  81.     float4 Po = float4(IN.Position.xyz,1.0);
  82.     // sum waves   
  83.     Po.y = 0.0;
  84.     float ddx = 0.0, ddy = 0.0;
  85.     for(int i=0; i<NWAVES; i++) {
  86.     Po.y += evaluateWave(wave[i], Po.xz, Timer);
  87.     float deriv = evaluateWaveDeriv(wave[i], Po.xz, Timer);
  88.     ddx += deriv * wave[i].dir.x;
  89.     ddy += deriv * wave[i].dir.y;
  90.     }
  91.     // compute tangent basis
  92.     float3 B = float3(1, ddx, 0);
  93.     float3 T = float3(0, ddy, 1);
  94.     float3 N = float3(-ddx, 1, -ddy);
  95.     OUT.HPosition = mul(Po,WvpXf);
  96.     // pass texture coordinates for fetching the normal map
  97.     float2 TextureScale = float2(TexReptX,TexReptY);
  98.     float2 BumpSpeed = float2(BumpSpeedX,BumpSpeedY);
  99.     OUT.UV = IN.UV.xy*TextureScale;
  100.     float cycle = fmod(Timer, 100.0);
  101.     OUT.bumpUV0.xy = IN.UV.xy*TextureScale + cycle*BumpSpeed;
  102.     OUT.bumpUV1.xy = IN.UV.xy*TextureScale*2.0 + cycle*BumpSpeed*4.0;
  103.     OUT.bumpUV2.xy = IN.UV.xy*TextureScale*4.0 + cycle*BumpSpeed*8.0;
  104.  
  105.     // compute the 3x3 tranform from tangent space to object space
  106.     float3x3 objToTangentSpace;
  107.     // first rows are the tangent and binormal scaled by the bump scale
  108.     objToTangentSpace[0] = BumpScale * normalize(T);
  109.     objToTangentSpace[1] = BumpScale * normalize(B);
  110.     objToTangentSpace[2] = normalize(N);
  111.  
  112.     OUT.T2WXf1.xyz = mul(objToTangentSpace,WorldXf[0].xyz);
  113.     OUT.T2WXf2.xyz = mul(objToTangentSpace,WorldXf[1].xyz);
  114.     OUT.T2WXf3.xyz = mul(objToTangentSpace,WorldXf[2].xyz);
  115.  
  116.     // compute the eye vector (going from shaded point to eye) in cube space
  117.     float3 Pw = mul(Po,WorldXf).xyz;
  118.     OUT.WorldView = ViewIXf[3].xyz - Pw; // view inv. transpose contains eye position in world space in last row
  119.     return OUT;
  120. }
  121.  
  122.  
  123. // Pixel Shaders
  124.  
  125. float4 OceanPS(OceanVertOut IN,
  126.         uniform samplerCUBE EnvSampler,
  127.         uniform float Kr,
  128.         uniform float KWater,
  129.         uniform float FresnelExp,
  130.         uniform float FresnelBias,
  131.         uniform float HDRMultiplier,
  132.         uniform float3 DeepColor,
  133.         uniform float3 ShallowColor,
  134.         uniform float3 ReflTint
  135. ) : COLOR
  136. {
  137.     // sum normal maps
  138.     float4 t0 = tex2D(NormalSampler, IN.bumpUV0)*2.0-1.0;
  139.     float4 t1 = tex2D(NormalSampler, IN.bumpUV1)*2.0-1.0;
  140.     float4 t2 = tex2D(NormalSampler, IN.bumpUV2)*2.0-1.0;
  141.     float3 Nt = t0.xyz + t1.xyz + t2.xyz;
  142.     //    float3 Nt = t1.xyz;
  143.  
  144.     float3x3 m; // tangent to world matrix
  145.     m[0] = IN.T2WXf1;
  146.     m[1] = IN.T2WXf2;
  147.     m[2] = IN.T2WXf3;
  148.     float3 Nw = mul(m,Nt);
  149.     float3 Nn = normalize(Nw);
  150.  
  151.     // reflection
  152.     float3 Vn = normalize(IN.WorldView);
  153.     float3 R = reflect(-Vn, Nn);
  154.  
  155.     float4 reflection = texCUBE(EnvSampler, R);
  156.     // hdr effect (multiplier in alpha channel)
  157.     reflection.rgb *= (1.0 + reflection.a*HDRMultiplier);
  158.  
  159.     float facing = 1.0 - max(dot(Vn, Nn), 0);
  160.     float fres = Kr*(FresnelBias+(1.0-FresnelBias)*pow(facing,FresnelExp));
  161.  
  162.     float3 waterColor = KWater * lerp(DeepColor, ShallowColor, facing);
  163.     float3 result = waterColor + (fres * reflection.rgb * ReflTint);
  164.     return float4(result.rgb,1.0);
  165. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement