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

游戏引擎

开发平台:

Visual C++

  1. // oceanHLSL_Cg.frag
  2. // fragment program for Ocean water simulation
  3. // 04 Aug 2005
  4. // adapted for Ogre by nfz
  5. // original shader source from Render Monkey 1.6 Reflections Refractions.rfx
  6. // can be used in both Cg and HLSL compilers
  7. // 06 Aug 2005: moved uvw calculation from fragment program into vertex program 
  8. float4 main(float3 uvw: TEXCOORD0, float3 normal: TEXCOORD1, float3 vVec: TEXCOORD2,
  9. uniform float fadeBias,
  10. uniform float fadeExp,
  11. uniform float4 waterColor,
  12. uniform sampler Noise,
  13. uniform sampler skyBox
  14. ) : COLOR
  15. {
  16.    // in OpenGL Ogre uses Devil 1.6.7 for loading dds textures.
  17.    // But Devil buggers up the green and blue channels of the 3D
  18.    // texture by setting them to zero so only the red channel has good data
  19.    // Dx9 loads the texture properly but if we want things to look the same
  20.    // between Dx9 and GL we only use the red channel for now until Devil dds issues are fixed
  21.    float3 noisy = tex3D(Noise, uvw).xxx;
  22.    // convert to Signed noise 
  23.    float3 bump = 2 * noisy - 1;
  24.    bump.xz *= 0.15;
  25.    // Make sure the normal always points upwards
  26.    // note that Ogres y axis is vertical (RM Z axis is vertical)
  27.    bump.y = 0.8 * abs(bump.y) + 0.2;
  28.    // Offset the surface normal with the bump
  29.    bump = normalize(normal + bump);
  30.    // Find the reflection vector
  31.    float3 normView = normalize(vVec);
  32.    float3 reflVec = reflect(normView, bump);
  33.    // Ogre has z flipped for cubemaps
  34.    reflVec.z = -reflVec.z;
  35.    float4 refl = texCUBE(skyBox, reflVec);
  36.    // set up for fresnel calc
  37.    float lrp = 1 - dot(-normView, bump);
  38.    
  39.    // Interpolate between the water color and reflection for fresnel effect
  40.    return lerp(waterColor, refl, saturate(fadeBias + pow(lrp, fadeExp)));
  41. }