Ocean2HLSL_Cg.frag
上传用户: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: heavily modified by Jeff Doyle (nfz) for Ogre
  16. ******************************************************************************/
  17. struct v2f {
  18. float4 Position  : POSITION;  // in clip space
  19. float3 rotMatrix1 : TEXCOORD0; // first row of the 3x3 transform from tangent to obj space
  20. float3 rotMatrix2 : TEXCOORD1; // second row of the 3x3 transform from tangent to obj space
  21. float3 rotMatrix3 : TEXCOORD2; // third row of the 3x3 transform from tangent to obj space
  22. float2 bumpCoord0 : TEXCOORD3;
  23. float2 bumpCoord1 : TEXCOORD4;
  24. float2 bumpCoord2 : TEXCOORD5;
  25. float3 eyeVector  : TEXCOORD6;
  26. };
  27. float4 main(v2f IN,
  28. uniform sampler2D NormalMap,
  29. uniform samplerCUBE EnvironmentMap,
  30. uniform float4 deepColor,
  31. uniform float4 shallowColor,
  32. uniform float4 reflectionColor,
  33. uniform float reflectionAmount,
  34. uniform float reflectionBlur,
  35. uniform float waterAmount,
  36. uniform float fresnelPower,
  37. uniform float fresnelBias,
  38. uniform float hdrMultiplier
  39. ) : COLOR
  40. {
  41. // sum normal maps
  42. // sample from 3 different points so no texture repetition is noticeable
  43.     float4 t0 = tex2D(NormalMap, IN.bumpCoord0) * 2.0 - 1.0;
  44.     float4 t1 = tex2D(NormalMap, IN.bumpCoord1) * 2.0 - 1.0;
  45.     float4 t2 = tex2D(NormalMap, IN.bumpCoord2) * 2.0 - 1.0;
  46.     float3 N = t0.xyz + t1.xyz + t2.xyz;
  47.     float3x3 m; // tangent to world matrix
  48.     m[0] = IN.rotMatrix1;
  49.     m[1] = IN.rotMatrix2;
  50.     m[2] = IN.rotMatrix3;
  51.     N = normalize( mul( N, m ) );
  52. // reflection
  53.     float3 E = normalize(IN.eyeVector);
  54.     float4 R;
  55.     R.xyz = reflect(E, N);
  56.     // Ogre conversion for cube map lookup
  57.     R.z = -R.z;
  58.     R.w = reflectionBlur;
  59.     float4 reflection = texCUBEbias(EnvironmentMap, R);
  60.     // cheap hdr effect
  61.     reflection.rgb *= (reflection.r + reflection.g + reflection.b) * hdrMultiplier;
  62. // fresnel
  63.     float facing = 1.0 - max(dot(-E, N), 0);
  64.     float fresnel = saturate(fresnelBias + pow(facing, fresnelPower));
  65.     float4 waterColor = lerp(shallowColor, deepColor, facing) * waterAmount;
  66.     reflection = lerp(waterColor,  reflection * reflectionColor, fresnel) * reflectionAmount;
  67.     return waterColor + reflection;
  68. }