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>
							 |