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

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file waterF.glsl
  3.  *
  4.  * Copyright (c) 2007-$CurrentYear$, Linden Research, Inc.
  5.  * $License$
  6.  */
  7. vec3 scaleSoftClip(vec3 inColor);
  8. vec3 atmosTransport(vec3 inColor);
  9. vec3 applyWaterFog(vec4 inColor);
  10. uniform sampler2D diffuseMap;
  11. uniform sampler2D bumpMap;   
  12. uniform sampler2D screenTex;
  13. uniform sampler2D refTex;
  14. uniform float sunAngle;
  15. uniform float sunAngle2;
  16. uniform float scaledAngle;
  17. uniform vec3 lightDir;
  18. uniform vec3 specular;
  19. uniform float lightExp;
  20. uniform float refScale;
  21. uniform float kd;
  22. uniform vec2 screenRes;
  23. uniform vec3 normScale;
  24. uniform float fresnelScale;
  25. uniform float fresnelOffset;
  26. uniform float blurMultiplier;
  27. uniform vec4 fogCol;
  28. //bigWave is (refCoord.w, view.w);
  29. varying vec4 refCoord;
  30. varying vec4 littleWave;
  31. varying vec4 view;
  32. void main() 
  33. {
  34. vec3 viewVec = view.xyz;
  35. vec4 color;
  36. float dist = length(viewVec.xy);
  37. //normalize view vector
  38. viewVec = normalize(viewVec);
  39. //get wave normals
  40. vec3 wavef = texture2D(bumpMap, vec2(refCoord.w, view.w)).xyz*2.0;
  41. //get detail normals
  42. vec3 dcol = texture2D(bumpMap, littleWave.xy).rgb*0.75;
  43. dcol += texture2D(bumpMap, littleWave.zw).rgb*1.25;
  44. //interpolate between big waves and little waves (big waves in deep water)
  45. wavef = (wavef + dcol) * 0.5;
  46. //crunch normal to range [-1,1]
  47. wavef -= vec3(1,1,1);
  48. wavef = normalize(wavef);
  49.    
  50. //get base fresnel components
  51. float df = dot(viewVec,wavef) * fresnelScale + fresnelOffset;
  52.     
  53. vec2 distort = (refCoord.xy/refCoord.z) * 0.5 + 0.5;
  54. float dist2 = dist;
  55. dist = max(dist, 5.0);
  56. //get reflected color
  57. vec2 refdistort = wavef.xy*dot(normScale, vec3(0.333));
  58. vec2 refvec = distort+refdistort/dist;
  59. vec4 refcol = texture2D(refTex, refvec);
  60. //get specular component
  61. float spec = clamp(dot(lightDir, (reflect(viewVec,wavef))),0.0,1.0);
  62. //harden specular
  63. spec = pow(spec, lightExp);
  64. //figure out distortion vector (ripply)   
  65. vec2 distort2 = distort+wavef.xy*refScale/max(dist*df, 1.0);
  66. vec4 fb = texture2D(screenTex, distort2);
  67. //mix with reflection
  68. color.rgb = mix(mix(fogCol.rgb, fb.rgb, fogCol.a), refcol.rgb, df);
  69. color.rgb += spec * specular;
  70. //color.rgb = applyWaterFog(color);//atmosTransport(color.rgb);
  71. color.rgb = scaleSoftClip(color.rgb);
  72. color.a = spec * sunAngle2;
  73. gl_FragColor = color;
  74. }