165 lines
		
	
	
		
			5.8 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
			
		
		
	
	
			165 lines
		
	
	
		
			5.8 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
| <!DOCTYPE html>
 | |
| <html lang="en">
 | |
| <head>
 | |
|     <meta charset="UTF-8">
 | |
|     <title>01_simple-shape</title>
 | |
| 
 | |
|     <style>
 | |
|         .test {
 | |
|             background-color: gray;
 | |
|         }
 | |
|         canvas {
 | |
|             background-color: gray;
 | |
|             width: 100%;
 | |
|             height: 100%;
 | |
|             display: block;
 | |
|         }
 | |
|     </style>
 | |
| 
 | |
| </head>
 | |
| <body>
 | |
| 
 | |
| <!-- Simple example of shader source code (WebGL Fundamentals) -->
 | |
| <script id="vertex-simple-shader" type="x-shader/x-vertex">
 | |
| attribute vec2 a_position;
 | |
| uniform vec2 u_resolution;
 | |
| 
 | |
| void main() {
 | |
|   // Convert pixel coordinates to a float randing from 0.0 -> 1.0
 | |
|   vec2 zeroToOne = a_position / u_resolution;
 | |
|   // Convert from 0->1 to 0->2
 | |
|   vec2 zeroToTwo = zeroToOne * 2.0;
 | |
|   // Convert from 0->2 to -1.0->1.0
 | |
|   vec2 clipSpace = zeroToTwo - 1.0;
 | |
| 
 | |
|   gl_Position = vec4(clipSpace * vec2(1, -1), 0, 1);
 | |
| }
 | |
| </script>
 | |
| <script id="fragment-simple-shader" type="x-shader/x-vertex">
 | |
| precision mediump float;
 | |
| uniform vec4 u_color;
 | |
| 
 | |
| void main() {
 | |
|   gl_FragColor = u_color;
 | |
| }
 | |
| </script>
 | |
| 
 | |
| <!-- HTML document -->
 | |
| <p class="test">This is test HTML with some CSS. Logging with JS...<br>The following block is an OpenGL canvas</p>
 | |
| <canvas id="canvas"></canvas>
 | |
| 
 | |
| <!-- WebGL -->
 | |
| <script>
 | |
|     function main() {
 | |
|         //
 | |
|         // Boilerplate OpenGL helper functions
 | |
|         function createShader(gl, type, source) {
 | |
|             let shader = gl.createShader(type);
 | |
|             gl.shaderSource(shader, source);
 | |
|             gl.compileShader(shader);
 | |
|             let success = gl.getShaderParameter(shader, gl.COMPILE_STATUS);
 | |
|             if (success) {
 | |
|                 return shader;
 | |
|             }
 | |
| 
 | |
|             console.log(gl.getShaderInfoLog(shader));
 | |
|             gl.deleteShader(shader);
 | |
|         }
 | |
| 
 | |
|         function createProgram(gl, vertexShader, fragmentShader) {
 | |
|             // Add check to automatically compile shaders if Strings are provided
 | |
|             // + Strings should be equal to HTML script id attribute value for vertex and fragment shaders
 | |
|             if (typeof vertexShader == 'string') {
 | |
|                 let vertexShaderSource = document.querySelector(vertexShader).text;
 | |
|                 vertexShader = createShader(gl, gl.VERTEX_SHADER, vertexShaderSource);
 | |
|             }
 | |
|             if (typeof fragmentShader == 'string') {
 | |
|                 let fragmentShaderSource = document.querySelector(fragmentShader).text;
 | |
|                 fragmentShader = createShader(gl, gl.FRAGMENT_SHADER, fragmentShaderSource);
 | |
|             }
 | |
| 
 | |
|             let program = gl.createProgram();
 | |
|             gl.attachShader(program, vertexShader);
 | |
|             gl.attachShader(program, fragmentShader);
 | |
|             gl.linkProgram(program);
 | |
|             let success = gl.getProgramParameter(program, gl.LINK_STATUS);
 | |
|             if (success) {
 | |
|                 return program;
 | |
|             }
 | |
| 
 | |
|             console.log(gl.getProgramInfoLog(program));
 | |
|             gl.deleteProgram(program);
 | |
|         }
 | |
| 
 | |
|         let canvas = document.querySelector("#canvas");
 | |
|         let gl = canvas.getContext('webgl');
 | |
|         if (!gl) {
 | |
|             console.log("ERROR: Unable to get OpenGL context");
 | |
|             return;
 | |
|         }
 | |
|         else {
 | |
|             console.log("Created OpenGL context on HTML canvas")
 | |
|         }
 | |
| 
 | |
|         // Creating shader program and compiling shader source code
 | |
|         let program = createProgram(gl, "#vertex-simple-shader", "#fragment-simple-shader");
 | |
| 
 | |
|         // look up where the vertex data needs to go.
 | |
|         let positionAttributeLocation = gl.getAttribLocation(program, "a_position");
 | |
|         // look up uniform locations
 | |
|         let resolutionUniformLocation = gl.getUniformLocation(program, "u_resolution");
 | |
|         let colorUniformLocation = gl.getUniformLocation(program, "u_color");
 | |
| 
 | |
|         // Create a buffer to put three 2d clip space points in
 | |
|         let positionBuffer = gl.createBuffer();
 | |
|         // Bind it to ARRAY_BUFFER (think of it as ARRAY_BUFFER = positionBuffer)
 | |
|         gl.bindBuffer(gl.ARRAY_BUFFER, positionBuffer);
 | |
| 
 | |
|         // Canvas setup
 | |
|         // Resize canvas to match client size
 | |
|         const width  = canvas.clientWidth;
 | |
|         const height = canvas.clientHeight;
 | |
|         canvas.width  = width;
 | |
|         canvas.height = height;
 | |
|         gl.viewport(0, 0, gl.canvas.width, gl.canvas.height);
 | |
|         // Clear the canvas
 | |
|         gl.clearColor(0, 0, 0, 0);
 | |
|         gl.clear(gl.COLOR_BUFFER_BIT);
 | |
| 
 | |
|         // Tell OpenGL to use our shader program
 | |
|         gl.useProgram(program);
 | |
|         // Enable attribute; Bind gl.ARRAY_BUFFER for use with this attribute
 | |
|         gl.enableVertexAttribArray(positionAttributeLocation);
 | |
|         gl.bindBuffer(gl.ARRAY_BUFFER, positionBuffer);
 | |
| 
 | |
|         // Tell the attribute how to get data out of positionBuffer (ARRAY_BUFFER)
 | |
|         let size = 2;          // 2 components per iteration (X and Y value for each vertex position)
 | |
|         let type = gl.FLOAT;   // Each X and Y value is a 32bit float
 | |
|         let normalize = false; // don't normalize the data
 | |
|         let stride = 0;        // 0 = move forward size * sizeof(type) each iteration to get the next position
 | |
|         let offset = 0;        // start at the beginning of the buffer
 | |
|         gl.vertexAttribPointer(positionAttributeLocation, size, type, normalize, stride, offset);
 | |
| 
 | |
|         // Initialize geometry data for a 2D triangle with 3 vertices
 | |
|         let triangle = new Float32Array([
 | |
|             350, 100,
 | |
|             500, 300,
 | |
|             200, 300,
 | |
|         ]);
 | |
| 
 | |
|         // Write geometry data to positions array buffer
 | |
|         gl.bufferData(gl.ARRAY_BUFFER, triangle, gl.STATIC_DRAW);
 | |
|         // Set a random color
 | |
|         gl.uniform4f(colorUniformLocation, Math.random(), Math.random(), Math.random(), 1);
 | |
|         // set the resolution
 | |
|         gl.uniform2f(resolutionUniformLocation, gl.canvas.width, gl.canvas.height);
 | |
| 
 | |
|         // Draw the triangle with 0 offset and 3 total vertices
 | |
|         gl.drawArrays(gl.TRIANGLES, 0, 3);
 | |
| 
 | |
|     }
 | |
|     main();
 | |
| </script>
 | |
| 
 | |
| </body>
 | |
| </html> |