Ocean2GLSL.vert
上传用户:xhbjoy
上传日期:2014-10-07
资源大小:38068k
文件大小:3k
源码类别:

游戏引擎

开发平台:

Visual C++

  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. Comments:
  13. Simple ocean shader with animated bump map and geometric waves
  14. Based partly on "Effective Water Simulation From Physical Models", GPU Gems
  15. 11 Aug 05: converted from HLSL to GLSL by Jeff Doyle (nfz) to work in Ogre
  16. ******************************************************************************/
  17. uniform vec3 eyePosition;
  18. uniform float BumpScale;
  19. uniform vec2 textureScale;
  20. uniform vec2 bumpSpeed;
  21. uniform float time;
  22. uniform float waveFreq;
  23. uniform float waveAmp;
  24. varying mat3 rotMatrix; //  transform from tangent to obj space
  25. varying vec2 bumpCoord0;
  26. varying vec2 bumpCoord1;
  27. varying vec2 bumpCoord2;
  28. varying vec3 eyeVector;
  29. // wave functions
  30. struct Wave {
  31.   float freq;  // 2*PI / wavelength
  32.   float amp;   // amplitude
  33.   float phase; // speed * 2*PI / wavelength
  34.   vec2 dir;
  35. };
  36. void main(void)
  37. {
  38. #define NWAVES 2
  39. Wave wave[NWAVES];
  40. wave[0] = Wave( waveFreq, waveAmp, 0.5, vec2(-1, 0) );
  41. wave[1] = Wave( 3.0 * waveFreq, 0.33 * waveAmp, 1.7, vec2(-0.7, 0.7) );
  42.     vec4 P = gl_Vertex;
  43. // sum waves
  44. float ddx = 0.0, ddy = 0.0;
  45. float deriv;
  46. float angle;
  47. // wave synthesis using two sine waves at different frequencies and phase shift
  48. for(int i = 0; i<NWAVES; ++i)
  49. {
  50. angle = dot(wave[i].dir, P.xz) * wave[i].freq + time * wave[i].phase;
  51. P.y += wave[i].amp * sin( angle );
  52. // calculate derivate of wave function
  53. deriv = wave[i].freq * wave[i].amp * cos(angle);
  54. ddx -= deriv * wave[i].dir.x;
  55. ddy -= deriv * wave[i].dir.y;
  56. }
  57. // compute the 3x3 tranform from tangent space to object space
  58. // compute tangent basis
  59.     vec3 T = normalize(vec3(1.0, ddy, 0.0)) * BumpScale;
  60.     vec3 B = normalize(vec3(0.0, ddx, 1.0)) * BumpScale;
  61.     vec3 N = normalize(vec3(ddx, 1.0, ddy));
  62. rotMatrix = mat3(T, B, N);
  63. gl_Position = gl_ModelViewProjectionMatrix * P;
  64. // calculate texture coordinates for normal map lookup
  65. bumpCoord0.xy = gl_MultiTexCoord0.xy * textureScale + time * bumpSpeed;
  66. bumpCoord1.xy = gl_MultiTexCoord0.xy * textureScale * 2.0 + time * bumpSpeed * 4.0;
  67. bumpCoord2.xy = gl_MultiTexCoord0.xy * textureScale * 4.0 + time * bumpSpeed * 8.0;
  68. eyeVector = P.xyz - eyePosition; // eye position in vertex space
  69. }