最新赞助活动温馨提示:自愿赞助服务器费用,学生和没有工作的整站资源免费下载!
头像

多视角3D逼真HTML5水波动画 _html5教程技巧-H5教程

来源:http://erdangjiade.com/topic/134636.html H5程序员 2017-10-19 10:30浏览(135)

这是一款基于HTML5的3D水波动画特效,它的效果非常逼真,我们可以按“G”键来让水池中的石头上下浮动,按“L”键添加灯光效果,设计相当完美。同时说明一下,这款3D水波动画是基于WebGL渲染技术的,大家可以了解一下WebGL。

在线预览 源码下载

HTML代码

XML/HTML Code复制内容到剪贴板

  1. <img id="tiles" src="tiles.jpg">
  2. <img id="xneg" src="xneg.jpg">
  3. <img id="xpos" src="xpos.jpg">
  4. <img id="ypos" src="ypos.jpg">
  5. <img id="zneg" src="zneg.jpg">
  6. <img id="zpos" src="zpos.jpg">

JavaScript代码

JavaScript Code复制内容到剪贴板

  1. function Water() {
  2. var vertexShader = '
  3. varying vec2 coord;
  4. void main() {
  5. coord = gl_Vertex.xy * 0.5 + 0.5;
  6. gl_Position = vec4(gl_Vertex.xyz, 1.0);
  7. }
  8. ';
  9. this.plane = GL.Mesh.plane();
  10. if (!GL.Texture.canUseFloatingPointTextures()) {
  11. throw new Error('This demo requires the OES_texture_float extension');
  12. }
  13. var filter = GL.Texture.canUseFloatingPointLinearFiltering() ? gl.LINEAR : gl.NEAREST;
  14. this.textureA = new GL.Texture(256, 256, { type: gl.FLOAT, filter: filter });
  15. this.textureB = new GL.Texture(256, 256, { type: gl.FLOAT, filter: filter });
  16. this.dropShader = new GL.Shader(vertexShader, '
  17. const float PI = 3.141592653589793;
  18. uniform sampler2D texture;
  19. uniform vec2 center;
  20. uniform float radius;
  21. uniform float strength;
  22. varying vec2 coord;
  23. void main() {
  24. /* get vertex info */
  25. vec4 info = texture2D(texture, coord);
  26. /* add the drop to the height */
  27. float drop = max(0.0, 1.0 - length(center * 0.5 + 0.5 - coord) / radius);
  28. drop = 0.5 - cos(drop * PI) * 0.5;
  29. info.r += drop * strength;
  30. gl_FragColor = info;
  31. }
  32. ');
  33. this.updateShader = new GL.Shader(vertexShader, '
  34. uniform sampler2D texture;
  35. uniform vec2 delta;
  36. varying vec2 coord;
  37. void main() {
  38. /* get vertex info */
  39. vec4 info = texture2D(texture, coord);
  40. /* calculate average neighbor height */
  41. vec2 dx = vec2(delta.x, 0.0);
  42. vec2 dy = vec2(0.0, delta.y);
  43. float average = (
  44. texture2D(texture, coord - dx).r +
  45. texture2D(texture, coord - dy).r +
  46. texture2D(texture, coord + dx).r +
  47. texture2D(texture, coord + dy).r
  48. ) * 0.25;
  49. /* change the velocity to move toward the average */
  50. info.g += (average - info.r) * 2.0;
  51. /* attenuate the velocity a little so waves do not last forever */
  52. info.g *= 0.995;
  53. /* move the vertex along the velocity */
  54. info.r += info.g;
  55. gl_FragColor = info;
  56. }
  57. ');
  58. this.normalShader = new GL.Shader(vertexShader, '
  59. uniform sampler2D texture;
  60. uniform vec2 delta;
  61. varying vec2 coord;
  62. void main() {
  63. /* get vertex info */
  64. vec4 info = texture2D(texture, coord);
  65. /* update the normal */
  66. vec3 dx = vec3(delta.x, texture2D(texture, vec2(coord.x + delta.x, coord.y)).r - info.r, 0.0);
  67. vec3 dy = vec3(0.0, texture2D(texture, vec2(coord.x, coord.y + delta.y)).r - info.r, delta.y);
  68. info.ba = normalize(cross(dy, dx)).xz;
  69. gl_FragColor = info;
  70. }
  71. ');
  72. this.sphereShader = new GL.Shader(vertexShader, '
  73. uniform sampler2D texture;
  74. uniform vec3 oldCenter;
  75. uniform vec3 newCenter;
  76. uniform float radius;
  77. varying vec2 coord;
  78. float volumeInSphere(vec3 center) {
  79. vec3 toCenter = vec3(coord.x * 2.0 - 1.0, 0.0, coord.y * 2.0 - 1.0) - center;
  80. float t = length(toCenter) / radius;
  81. float dy = exp(-pow(t * 1.5, 6.0));
  82. float ymin = min(0.0, center.y - dy);
  83. float ymax = min(max(0.0, center.y + dy), ymin + 2.0 * dy);
  84. return (ymax - ymin) * 0.1;
  85. }
  86. void main() {
  87. /* get vertex info */
  88. vec4 info = texture2D(texture, coord);
  89. /* add the old volume */
  90. info.r += volumeInSphere(oldCenter);
  91. /* subtract the new volume */
  92. info.r -= volumeInSphere(newCenter);
  93. gl_FragColor = info;
  94. }
  95. ');
  96. }
  97. Water.prototype.addDrop = function(x, y, radius, strength) {
  98. var this_ = this;
  99. this.textureB.drawTo(function() {
  100. this_.textureA.bind();
  101. this_.dropShader.uniforms({
  102. center: [x, y],
  103. radius: radius,
  104. strength: strength
  105. }).draw(this_.plane);
  106. });
  107. this.textureB.swapWith(this.textureA);
  108. };
  109. Water.prototype.moveSphere = function(oldCenter, newCenter, radius) {
  110. var this_ = this;
  111. this.textureB.drawTo(function() {
  112. this_.textureA.bind();
  113. this_.sphereShader.uniforms({
  114. oldCenter: oldCenter,
  115. newCenter: newCenter,
  116. radius: radius
  117. }).draw(this_.plane);
  118. });
  119. this.textureB.swapWith(this.textureA);
  120. };
  121. Water.prototype.stepSimulation = function() {
  122. var this_ = this;
  123. this.textureB.drawTo(function() {
  124. this_.textureA.bind();
  125. this_.updateShader.uniforms({
  126. delta: [1 / this_.textureA.width, 1 / this_.textureA.height]
  127. }).draw(this_.plane);
  128. });
  129. this.textureB.swapWith(this.textureA);
  130. };
  131. Water.prototype.updateNormals = function() {
  132. var this_ = this;
  133. this.textureB.drawTo(function() {
  134. this_.textureA.bind();
  135. this_.normalShader.uniforms({
  136. delta: [1 / this_.textureA.width, 1 / this_.textureA.height]
  137. }).draw(this_.plane);
  138. });
  139. this.textureB.swapWith(this.textureA);
  140. };

以上就是本文的全部内容,希望对大家的学习有所帮助。

评论0
头像

友情提示:垃圾评论一律封号 加我微信:826096331拉你进VIP群学习群

1 2