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