Home | History | Annotate | Download | only in Water
      1 /*
      2 GLSL conversion of Michael Horsch water demo
      3 http://www.bonzaisoftware.com/wfs.html
      4 Converted by Mars_999
      5 8/20/2005
      6 */
      7 
      8 uniform sampler2D m_water_normalmap;
      9 uniform sampler2D m_water_reflection;
     10 uniform sampler2D m_water_refraction;
     11 uniform sampler2D m_water_dudvmap;
     12 uniform sampler2D m_water_depthmap;
     13 uniform vec4 m_waterColor;
     14 uniform float m_waterDepth;
     15 uniform vec4 m_distortionScale;
     16 uniform vec4 m_distortionMix;
     17 uniform vec4 m_texScale;
     18 uniform vec2 m_FrustumNearFar;
     19 uniform float m_waterTransparency;
     20 
     21 
     22 
     23 varying vec4 lightDir; //lightpos
     24 varying vec4 waterTex1; //moving texcoords
     25 varying vec4 waterTex2; //moving texcoords
     26 varying vec4 position; //for projection
     27 varying vec4 viewDir; //viewts
     28 varying vec4 viewLightDir;
     29 varying vec4 viewCamDir;
     30 
     31 //unit 0 = m_water_reflection
     32 //unit 1 = m_water_refraction
     33 //unit 2 = m_water_normalmap
     34 //unit 3 = m_water_dudvmap
     35 //unit 4 = m_water_depthmap
     36 
     37  const vec4 two = vec4(2.0, 2.0, 2.0, 1.0);
     38  const vec4 mone = vec4(-1.0, -1.0, -1.0, 1.0);
     39 
     40  const vec4 ofive = vec4(0.5,0.5,0.5,1.0);
     41 
     42  const float exponent = 64.0;
     43 
     44 float tangDot(in vec3 v1, in vec3 v2){
     45     float d = dot(v1,v2);
     46     #ifdef V_TANGENT
     47         d = 1.0 - d*d;
     48         return step(0.0, d) * sqrt(d);
     49     #else
     50         return d;
     51     #endif
     52 }
     53 
     54 vec4 readDepth(vec2 uv){
     55     float depth= (2.0 * m_FrustumNearFar.x) / (m_FrustumNearFar.y + m_FrustumNearFar.x - texture2D(m_water_depthmap, uv).r* (m_FrustumNearFar.y-m_FrustumNearFar.x));
     56     return vec4( depth);
     57 }
     58 
     59 void main(void)
     60 {
     61 
     62 
     63      vec4 lightTS = normalize(lightDir);
     64      vec4 viewt = normalize(viewDir);
     65      vec4 disdis = texture2D(m_water_dudvmap, vec2(waterTex2 * m_texScale));
     66      vec4 fdist = texture2D(m_water_dudvmap, vec2(waterTex1 + disdis*m_distortionMix));
     67      fdist =normalize( fdist * 2.0 - 1.0)* m_distortionScale;
     68 
     69 
     70      //load normalmap
     71      vec4 nmap = texture2D(m_water_normalmap, vec2(waterTex1 + disdis*m_distortionMix));
     72      nmap = (nmap-ofive) * two;
     73     // nmap = nmap*2.0-1.0;
     74      vec4 vNorm = normalize(nmap);
     75 
     76 
     77      vec4 projCoord = position / position.w;
     78      projCoord =(projCoord+1.0)*0.5 + fdist;
     79      projCoord = clamp(projCoord, 0.001, 0.999);
     80 
     81      //load reflection,refraction and depth texture
     82      vec4 refl = texture2D(m_water_reflection, vec2(projCoord.x,1.0-projCoord.y));
     83      vec4 refr = texture2D(m_water_refraction, vec2(projCoord));
     84      vec4 wdepth =readDepth(vec2(projCoord));
     85 
     86      wdepth = vec4(pow(wdepth.x, m_waterDepth));
     87      vec4 invdepth = 1.0 - wdepth;
     88 
     89 
     90  // Blinn - Phong
     91   //    vec4 H = (viewt - lightTS);
     92   //   vec4 specular =vec4(pow(max(dot(H, vNorm), 0.0), exponent));
     93 
     94 // Standard Phong
     95 
     96   //   vec4 R =reflect(-L, vNorm);
     97  //    vec4 specular =vec4( pow(max(dot(R, E), 0.0),exponent));
     98 
     99 
    100      //calculate specular highlight
    101      vec4 L=normalize(viewLightDir);
    102     vec4 E=normalize(viewCamDir);
    103      vec4 vRef = normalize(reflect(-L,vNorm));
    104      float stemp =max(0.0, dot( vRef,E) );
    105      //initializing to 0 to avoid artifacts on old intel cards
    106      vec4 specular = vec4(0.0,0.0,0.0,0.0);
    107     if(stemp>0.0){
    108          stemp = pow(stemp, exponent);
    109          specular = vec4(stemp);
    110     }
    111 
    112 
    113 
    114     vec4 fresnelTerm = vec4(0.02+0.97*pow((1.0-dot(normalize(viewt), vNorm)),5.0));
    115 
    116 
    117 
    118     fresnelTerm=fresnelTerm*invdepth*m_waterTransparency;
    119     fresnelTerm=clamp(fresnelTerm,0.0,1.0);
    120 
    121     refr*=(fresnelTerm);
    122     refr *= invdepth;
    123     refr= refr+ m_waterColor*wdepth*fresnelTerm;
    124 
    125     gl_FragColor =(refr+ refl*(1.0-fresnelTerm))+specular;
    126 }
    127