underWaterF.glsl
上传用户:king477883
上传日期:2021-03-01
资源大小:9553k
文件大小:2k
源码类别:

游戏引擎

开发平台:

C++ Builder

  1. /**
  2.  * @file underWaterF.glsl
  3.  *
  4.  * Copyright (c) 2007-$CurrentYear$, Linden Research, Inc.
  5.  * $License$
  6.  */
  7. uniform sampler2D diffuseMap;
  8. uniform sampler2D bumpMap;   
  9. uniform sampler2D screenTex;
  10. uniform sampler2D refTex;
  11. uniform sampler2D screenDepth;
  12. uniform vec4 fogCol;
  13. uniform vec3 lightDir;
  14. uniform vec3 specular;
  15. uniform float lightExp;
  16. uniform vec2 fbScale;
  17. uniform float refScale;
  18. uniform float znear;
  19. uniform float zfar;
  20. uniform float kd;
  21. uniform vec4 waterPlane;
  22. uniform vec3 eyeVec;
  23. uniform vec4 waterFogColor;
  24. uniform float waterFogDensity;
  25. uniform float waterFogKS;
  26. uniform vec2 screenRes;
  27. //bigWave is (refCoord.w, view.w);
  28. varying vec4 refCoord;
  29. varying vec4 littleWave;
  30. varying vec4 view;
  31. vec4 applyWaterFog(vec4 color, vec3 viewVec)
  32. {
  33. //normalize view vector
  34. vec3 view = normalize(viewVec);
  35. float es = -view.z;
  36. //find intersection point with water plane and eye vector
  37. //get eye depth
  38. float e0 = max(-waterPlane.w, 0.0);
  39. //get object depth
  40. float depth = length(viewVec);
  41. //get "thickness" of water
  42. float l = max(depth, 0.1);
  43. float kd = waterFogDensity;
  44. float ks = waterFogKS;
  45. vec4 kc = waterFogColor;
  46. float F = 0.98;
  47. float t1 = -kd * pow(F, ks * e0);
  48. float t2 = kd + ks * es;
  49. float t3 = pow(F, t2*l) - 1.0;
  50. float L = min(t1/t2*t3, 1.0);
  51. float D = pow(0.98, l*kd);
  52. //return vec4(1.0, 0.0, 1.0, 1.0);
  53. return color * D + kc * L;
  54. //depth /= 10.0;
  55. //return vec4(depth,depth,depth,0.0);
  56. }
  57. void main() 
  58. {
  59. vec4 color;
  60.     
  61. //get detail normals
  62. vec3 wave1 = texture2D(bumpMap, vec2(refCoord.w, view.w)).xyz*2.0-1.0;
  63. vec3 wave2 = texture2D(bumpMap, littleWave.xy).xyz*2.0-1.0;
  64. vec3 wave3 = texture2D(bumpMap, littleWave.zw).xyz*2.0-1.0;    
  65. vec3 wavef = normalize(wave1+wave2+wave3);
  66. //figure out distortion vector (ripply)   
  67. vec2 distort = (refCoord.xy/refCoord.z) * 0.5 + 0.5;
  68. distort = distort+wavef.xy*refScale;
  69. vec4 fb = texture2D(screenTex, distort);
  70. gl_FragColor = applyWaterFog(fb,view.xyz);
  71. }