Advertisement
CODE_TOLD_FAST

AHK03/WEB_GL_MANDELBROT.HTML

May 27th, 2020
172
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
HTML 5.90 KB | None | 0 0
  1. <!DOCTYPE HTML >
  2. <html lang="en">
  3.  
  4. <!-- XXXXXXXX EDIT ONLY THIS SECTION! XXXXXXXX -->
  5. <!-- XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX -->
  6. <!-- XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX -->
  7. <script id="VERT_SHADER" type="NOT_JAVASCRIPT">
  8.   precision highp float;
  9.  
  10.   attribute vec2 a_position;
  11.   void main() {
  12.     gl_Position = vec4(a_position, 0, 1);
  13.   }
  14. </script>
  15.  
  16.  
  17. <script id="FRAG_SHADER" type="NOT_JAVASCRIPT">
  18.   #define NUM_STEPS   50
  19.   #define ZOOM_FACTOR 2.0
  20.   #define X_OFFSET    0.5
  21.  
  22.   #ifdef GL_FRAGMENT_PRECISION_HIGH
  23.     precision highp float;
  24.   #else
  25.     precision mediump float;
  26.   #endif
  27.   precision mediump int;
  28.  
  29.   void main() {
  30.     vec2 z;
  31.     float x,y;
  32.     int steps;
  33.     float normalizedX = (gl_FragCoord.x - 320.0) / 640.0 * ZOOM_FACTOR *
  34.                         (640.0 / 480.0) - X_OFFSET;
  35.     float normalizedY = (gl_FragCoord.y - 240.0) / 480.0 * ZOOM_FACTOR;
  36.  
  37.     z.x = normalizedX;
  38.     z.y = normalizedY;
  39.  
  40.     for (int i=0;i<NUM_STEPS;i++) {
  41.  
  42.     steps = i;
  43.  
  44.        x = (z.x * z.x - z.y * z.y) + normalizedX;
  45.        y = (z.y * z.x + z.x * z.y) + normalizedY;
  46.  
  47.        if((x * x + y * y) > 4.0) {
  48.           break;
  49.         }
  50.  
  51.         z.x = x;
  52.         z.y = y;
  53.  
  54.     }
  55.  
  56.     if (steps == NUM_STEPS-1) {
  57.       gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);
  58.     } else {
  59.       gl_FragColor = vec4(0.0, 0.0, 0.0, 1.0);
  60.     }
  61.   }
  62. </script>
  63. <!-- XXXXXXXX END OF EDITABLE SECTION XXXXXXXX -->
  64. <!-- XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX -->
  65. <!-- XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX -->
  66.  
  67. <head>
  68. <!-- BASED ON:                                 -->
  69. <!-- URL[                                      -->
  70. <!--     https://blog.mayflower.de/4584-       -->
  71. <!--     Playing-around-with-pixel-shaders-    -->
  72. <!--     in-WebGL.html                         -->
  73. <!--    ];                                     -->
  74.  
  75. <title>  TRY_0004  </title>
  76. </head>
  77. <body onload="ON_LOADED_FUNCTION()" >
  78. <!-- BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB -->
  79.  
  80.     <canvas id="glCanvas"></canvas>
  81.    
  82. <!-- BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB -->
  83. </body>
  84.  
  85. <script id="BOILER_PLATE_CODE">
  86.     function ON_LOADED_FUNCTION(){
  87.         main();
  88.     }
  89.    
  90.     //: No "var" prefix, making them global:
  91.     function initGlobals(){
  92.         canvas = document.querySelector("#glCanvas");
  93.         gl = canvas.getContext("webgl");
  94.        
  95.         //These dimensions are hard-coded into
  96.         //fragment shader code, so be careful
  97.         //about changing them:
  98.         canvas.width = 640;
  99.         canvas.height= 480;
  100.    
  101.         buffer = gl.createBuffer();
  102.         gl.bindBuffer(gl.ARRAY_BUFFER, buffer);
  103.         gl.bufferData(
  104.         gl.ARRAY_BUFFER,
  105.         new Float32Array([
  106.           -1.0, -1.0,
  107.            1.0, -1.0,
  108.           -1.0,  1.0,
  109.           -1.0,  1.0,
  110.            1.0, -1.0,
  111.            1.0,  1.0]),
  112.         gl.STATIC_DRAW
  113.         );
  114.     }
  115.    
  116.     function main(){
  117.    
  118.       initGlobals();
  119.    
  120.      
  121.  
  122.       // Only continue if WebGL is
  123.       // available and working
  124.       if (!gl) {
  125.         var msg = "";
  126.         msg += "[Unable to initialize WebGL.]";
  127.         msg += "[your browser or machine may]";
  128.         msg +=  "[not support it.]"
  129.         alert( msg );
  130.         return;
  131.       }
  132.      
  133.       gl.viewport(0,0,gl.drawingBufferWidth, gl.drawingBufferHeight);
  134.  
  135.       setup();
  136.       render();
  137.      
  138.      
  139.      
  140.     }
  141.    
  142.     function setup(){
  143.         var frag_dom = document.getElementById("FRAG_SHADER");
  144.         var frag_src = frag_dom.text;
  145.         console.log( frag_src );
  146.  
  147.         F = createShader(
  148.             gl,gl.FRAGMENT_SHADER, frag_src
  149.         );
  150.  
  151.         var vert_dom = document.getElementById("VERT_SHADER");
  152.         var vert_src = vert_dom.text;
  153.         console.log( vert_src );
  154.  
  155.         V = createShader(
  156.             gl, gl.VERTEX_SHADER, vert_src
  157.         );
  158.  
  159.         //**** MAKE "program" a GLOBAL VAR  ****//
  160.         program = createProgram(gl,V,F);
  161.         gl.useProgram( program );
  162.        
  163.         if(!program){
  164.             throw("PROGRAM_IS_NULL");
  165.         }
  166.     }
  167.    
  168.     function render(){
  169.       window.requestAnimationFrame(render,canvas);
  170.    
  171.       // Set clear color to black, fully opaque
  172.       gl.clearColor(0.0, 0.0, 0.5, 1.0);
  173.      
  174.       // Clear the color buffer with specified clear color
  175.       gl.clear(gl.COLOR_BUFFER_BIT);
  176.      
  177.       //Directly before call to gl.drawArrays:
  178.       positionLocation = gl.getAttribLocation(program, "a_position");
  179.       gl.enableVertexAttribArray( positionLocation );
  180.       gl.vertexAttribPointer(positionLocation, 2, gl.FLOAT, false, 0, 0);
  181.      
  182.      
  183.       gl.drawArrays(gl.TRIANGLES, 0, 6);
  184.     }
  185.    
  186.     function createShader(gl,type,source){
  187.         //:Error Check For Bad Inputs:
  188.         if(!gl    ){throw("[NULL_GL]");}
  189.         if(!type  ){throw("[NULL_TY]");}
  190.         if(!source){throw("[NULL_SR]");}
  191.    
  192.         var shader = gl.createShader(type);
  193.         gl.shaderSource(shader, source);
  194.         gl.compileShader(shader);
  195.         var res = gl.getShaderParameter(shader, gl.COMPILE_STATUS);
  196.         if( res ){
  197.             console.log("[SHADER_COMPILED!]");
  198.             return shader;
  199.         }
  200.        
  201.         console.log(gl.getShaderInfoLog(shader));
  202.         gl.deleteShader(shader);
  203.         throw("[FAILED_TO_COMPILE_SHADER]");
  204.     }
  205.    
  206.     //:gl  : openGL context :
  207.     //:vert: vertex shader  :
  208.     //:frag: fragment shader:
  209.     function createProgram(gl,vert, frag){
  210.         var program = gl.createProgram();
  211.         gl.attachShader(program, vert);
  212.         gl.attachShader(program, frag);
  213.         gl.linkProgram (program);
  214.         var res = gl.getProgramParameter(program, gl.LINK_STATUS);
  215.         if( res ){
  216.             console.log("[PROGRAM_CREATED!]");
  217.             return program;
  218.         }
  219.        
  220.         console.log(gl.getProgramInfoLog(program));
  221.         gl.deleteProgram(program);
  222.     }
  223.  
  224. </script>
  225.  
  226. </html>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement