Guest User

Untitled

a guest
Nov 17th, 2018
103
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.17 KB | None | 0 0
  1. <!doctype html>
  2. <html>
  3. <body>
  4. <style>
  5. body {
  6. margin: 0; overflow: hidden
  7. }
  8. canvas {
  9. position: absolute;
  10. width: 100%;
  11. height: 100%;
  12. }
  13. </style>
  14. <script>
  15.  
  16. var gl = glx();
  17.  
  18. var vertices1 = gl.buffer([
  19. -1, 3,
  20. -1, -1,
  21. 3, -1,
  22. ]);
  23.  
  24. var vertCode =
  25. `attribute vec2 coordinates;
  26. void main(void) {
  27. gl_Position = vec4(coordinates.xy, 0.0, 1.0);
  28. }`;
  29.  
  30. var fragCode =
  31. `precision highp float;
  32. uniform vec4 mr;
  33. void main(void) {
  34. vec2 p = gl_FragCoord.xy;
  35. vec2 q = 5.*(p + p - mr.ba) / mr.b;
  36.  
  37. for(int i = 0; i < 7; i++){
  38. vec2 c = mr.xy / mr.b;
  39. q = abs(q)/dot(q,q) - mr.xy/mr.zw;
  40. }
  41. gl_FragColor = vec4(q, q.x/q.y, 1.0);
  42. }`;
  43.  
  44. var shaderProgram = gl.program(vertCode, fragCode);
  45. var coords = shaderProgram.attribute("coordinates", 2);
  46. var mr = shaderProgram.uniform('4f', 'mr');
  47. shaderProgram.use();
  48.  
  49. updateMouse();
  50. mainLoop();
  51.  
  52. window.addEventListener('mousemove', listener);
  53. window.addEventListener('touchmove', listener);
  54.  
  55. function listener(e) {
  56. updateMouse(e.touches ? e.touches[0] : e);
  57. gl.draw(3);
  58. }
  59.  
  60. function updateMouse(e) {
  61. var h = gl.gl.drawingBufferHeight;
  62. var w = gl.gl.drawingBufferWidth;
  63. mr.set(e ? e.clientX : 0, e ? h - e.clientY: 0, w, h);
  64. }
  65.  
  66. function mainLoop() {
  67. if (gl.ensureSizes()) {
  68. coords.bind(vertices1);
  69. gl.draw(3);
  70. }
  71. requestAnimationFrame(mainLoop)
  72. }
  73.  
  74. function glx() {
  75. var canvas = document.createElement('canvas');
  76. document.body.appendChild(canvas);
  77. var gl = canvas.getContext('webgl') || canvas.getContext('experimental-webgl');
  78.  
  79. return {
  80. gl: gl,
  81. draw: draw,
  82. buffer: buffer,
  83. program: program,
  84. ensureSizes: ensureSizes
  85. };
  86.  
  87. function draw(count) {
  88. gl.viewport(0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight);
  89. gl.clearColor(0, 0, 0, 1);
  90. gl.drawArrays(gl.TRIANGLES, 0, count);
  91. }
  92.  
  93. function program(vs, fs) {
  94. var pid = gl.createProgram(); // program id
  95. shader(vs, gl.VERTEX_SHADER);
  96. shader(fs, gl.FRAGMENT_SHADER);
  97. gl.linkProgram(pid);
  98.  
  99. return {uniform: uniform, attribute: attribute, use: use};
  100.  
  101. function use() {
  102. gl.useProgram(pid);
  103. }
  104.  
  105. function attribute(name, count) {
  106. var al = gl.getAttribLocation(pid, name);
  107. return {bind: bind};
  108.  
  109. function bind(buffer) {
  110. buffer.bind();
  111. gl.vertexAttribPointer(al, count, gl.FLOAT, false, 0, 0);
  112. gl.enableVertexAttribArray(al);
  113. }
  114. }
  115.  
  116. function uniform(type, name) {
  117. var ul = gl.getUniformLocation(pid, name);
  118. return {set: set};
  119.  
  120. function set(v1, v2, v3, v4) {
  121. gl['uniform' + type](ul, v1, v2, v3, v4);
  122. }
  123. }
  124.  
  125. function shader(src, type) {
  126. var sid = gl.createShader(type);
  127. gl.shaderSource(sid, src);
  128. gl.compileShader(sid);
  129. gl.attachShader(pid, sid);
  130. }
  131. }
  132.  
  133. function buffer(data) {
  134. var array = new Float32Array(data);
  135. var buffer = gl.createBuffer();
  136. var type = gl.ARRAY_BUFFER;
  137. gl.bindBuffer(type, buffer);
  138. gl.bufferData(type, array, gl.STATIC_DRAW);
  139. gl.bindBuffer(type, null);
  140. return {bind: bind};
  141.  
  142. function bind() {
  143. gl.bindBuffer(type, buffer);
  144. }
  145. }
  146.  
  147. function ensureSizes() {
  148. if (canvas.clientWidth !== canvas.width ||
  149. canvas.clientHeight !== canvas.height) {
  150.  
  151. canvas.width = canvas.clientWidth;
  152. canvas.height = canvas.clientHeight;
  153.  
  154. return true;
  155. }
  156. }
  157. }
  158. </script>
  159. </body>
  160. </html>
Add Comment
Please, Sign In to add comment