updated shader post. copy-paste from mozilla
This commit is contained in:
		
							parent
							
								
									aabe051aff
								
							
						
					
					
						commit
						f789e7680f
					
				
							
								
								
									
										28
									
								
								_assets/javascript/gl-matrix-min.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								_assets/javascript/gl-matrix-min.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										301
									
								
								_assets/javascript/shaderCanvas3.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										301
									
								
								_assets/javascript/shaderCanvas3.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,301 @@ | |||||||
|  | var squareRotation = 0.0; | ||||||
|  | 
 | ||||||
|  | //main();
 | ||||||
|  | window.addEventListener("load", main); | ||||||
|  | 
 | ||||||
|  | //
 | ||||||
|  | // Start here
 | ||||||
|  | //
 | ||||||
|  | function main() { | ||||||
|  |   const canvas = document.querySelector('#canvas'); | ||||||
|  |   const gl = canvas.getContext('webgl'); | ||||||
|  | 
 | ||||||
|  |   // If we don't have a GL context, give up now
 | ||||||
|  | 
 | ||||||
|  |   if (!gl) { | ||||||
|  |     alert('Unable to initialize WebGL. Your browser or machine may not support it.'); | ||||||
|  |     return; | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   // Vertex shader program
 | ||||||
|  | 
 | ||||||
|  |   const vsSource = ` | ||||||
|  |     attribute vec4 aVertexPosition; | ||||||
|  |     attribute vec4 aVertexColor; | ||||||
|  | 
 | ||||||
|  |     uniform mat4 uModelViewMatrix; | ||||||
|  |     uniform mat4 uProjectionMatrix; | ||||||
|  | 
 | ||||||
|  |     varying lowp vec4 vColor; | ||||||
|  | 
 | ||||||
|  |     void main(void) { | ||||||
|  |       gl_Position = uProjectionMatrix * uModelViewMatrix * aVertexPosition; | ||||||
|  |       vColor = aVertexColor; | ||||||
|  |     } | ||||||
|  |   `;
 | ||||||
|  | 
 | ||||||
|  |   // Fragment shader program
 | ||||||
|  | 
 | ||||||
|  |   const fsSource = ` | ||||||
|  |     varying lowp vec4 vColor; | ||||||
|  | 
 | ||||||
|  |     void main(void) { | ||||||
|  |       gl_FragColor = vColor; | ||||||
|  |     } | ||||||
|  |   `;
 | ||||||
|  | 
 | ||||||
|  |   // Initialize a shader program; this is where all the lighting
 | ||||||
|  |   // for the vertices and so forth is established.
 | ||||||
|  |   const shaderProgram = initShaderProgram(gl, vsSource, fsSource); | ||||||
|  | 
 | ||||||
|  |   // Collect all the info needed to use the shader program.
 | ||||||
|  |   // Look up which attributes our shader program is using
 | ||||||
|  |   // for aVertexPosition, aVevrtexColor and also
 | ||||||
|  |   // look up uniform locations.
 | ||||||
|  |   const programInfo = { | ||||||
|  |     program: shaderProgram, | ||||||
|  |     attribLocations: { | ||||||
|  |       vertexPosition: gl.getAttribLocation(shaderProgram, 'aVertexPosition'), | ||||||
|  |       vertexColor: gl.getAttribLocation(shaderProgram, 'aVertexColor'), | ||||||
|  |     }, | ||||||
|  |     uniformLocations: { | ||||||
|  |       projectionMatrix: gl.getUniformLocation(shaderProgram, 'uProjectionMatrix'), | ||||||
|  |       modelViewMatrix: gl.getUniformLocation(shaderProgram, 'uModelViewMatrix'), | ||||||
|  |     }, | ||||||
|  |   }; | ||||||
|  | 
 | ||||||
|  |   // Here's where we call the routine that builds all the
 | ||||||
|  |   // objects we'll be drawing.
 | ||||||
|  |   const buffers = initBuffers(gl); | ||||||
|  | 
 | ||||||
|  |   var then = 0; | ||||||
|  | 
 | ||||||
|  |   // Draw the scene repeatedly
 | ||||||
|  |   function render(now) { | ||||||
|  |     now *= 0.001;  // convert to seconds
 | ||||||
|  |     const deltaTime = now - then; | ||||||
|  |     then = now; | ||||||
|  | 
 | ||||||
|  |     drawScene(gl, programInfo, buffers, deltaTime); | ||||||
|  | 
 | ||||||
|  |     requestAnimationFrame(render); | ||||||
|  |   } | ||||||
|  |   requestAnimationFrame(render); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | //
 | ||||||
|  | // initBuffers
 | ||||||
|  | //
 | ||||||
|  | // Initialize the buffers we'll need. For this demo, we just
 | ||||||
|  | // have one object -- a simple two-dimensional square.
 | ||||||
|  | //
 | ||||||
|  | function initBuffers(gl) { | ||||||
|  | 
 | ||||||
|  |   // Create a buffer for the square's positions.
 | ||||||
|  | 
 | ||||||
|  |   const positionBuffer = gl.createBuffer(); | ||||||
|  | 
 | ||||||
|  |   // Select the positionBuffer as the one to apply buffer
 | ||||||
|  |   // operations to from here out.
 | ||||||
|  | 
 | ||||||
|  |   gl.bindBuffer(gl.ARRAY_BUFFER, positionBuffer); | ||||||
|  | 
 | ||||||
|  |   // Now create an array of positions for the square.
 | ||||||
|  | 
 | ||||||
|  |   const positions = [ | ||||||
|  |      1.0,  1.0, | ||||||
|  |     -1.0,  1.0, | ||||||
|  |      1.0, -1.0, | ||||||
|  |     -1.0, -1.0, | ||||||
|  |   ]; | ||||||
|  | 
 | ||||||
|  |   // Now pass the list of positions into WebGL to build the
 | ||||||
|  |   // shape. We do this by creating a Float32Array from the
 | ||||||
|  |   // JavaScript array, then use it to fill the current buffer.
 | ||||||
|  | 
 | ||||||
|  |   gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(positions), gl.STATIC_DRAW); | ||||||
|  | 
 | ||||||
|  |   // Now set up the colors for the vertices
 | ||||||
|  | 
 | ||||||
|  |   const colors = [ | ||||||
|  |     1.0,  0.5,  1.0,  1.0,    // white
 | ||||||
|  |     1.0,  0.6,  1.0,  1.0,    // red
 | ||||||
|  |     1.0,  0.7,  1.0,  1.0,    // green
 | ||||||
|  |     1.0,  0.3,  1.0,  1.0,    // blue
 | ||||||
|  |   ]; | ||||||
|  | 
 | ||||||
|  |   const colorBuffer = gl.createBuffer(); | ||||||
|  |   gl.bindBuffer(gl.ARRAY_BUFFER, colorBuffer); | ||||||
|  |   gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(colors), gl.STATIC_DRAW); | ||||||
|  | 
 | ||||||
|  |   return { | ||||||
|  |     position: positionBuffer, | ||||||
|  |     color: colorBuffer, | ||||||
|  |   }; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | //
 | ||||||
|  | // Draw the scene.
 | ||||||
|  | //
 | ||||||
|  | function drawScene(gl, programInfo, buffers, deltaTime) { | ||||||
|  |   gl.clearColor(0.0, 0.0, 0.0, 1.0);  // Clear to black, fully opaque
 | ||||||
|  |   gl.clearDepth(1.0);                 // Clear everything
 | ||||||
|  |   gl.enable(gl.DEPTH_TEST);           // Enable depth testing
 | ||||||
|  |   gl.depthFunc(gl.LEQUAL);            // Near things obscure far things
 | ||||||
|  | 
 | ||||||
|  |   // Clear the canvas before we start drawing on it.
 | ||||||
|  | 
 | ||||||
|  |   gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT); | ||||||
|  | 
 | ||||||
|  |   // Create a perspective matrix, a special matrix that is
 | ||||||
|  |   // used to simulate the distortion of perspective in a camera.
 | ||||||
|  |   // Our field of view is 45 degrees, with a width/height
 | ||||||
|  |   // ratio that matches the display size of the canvas
 | ||||||
|  |   // and we only want to see objects between 0.1 units
 | ||||||
|  |   // and 100 units away from the camera.
 | ||||||
|  | 
 | ||||||
|  |   const fieldOfView = 45 * Math.PI / 180;   // in radians
 | ||||||
|  |   const aspect = gl.canvas.clientWidth / gl.canvas.clientHeight; | ||||||
|  |   const zNear = 0.1; | ||||||
|  |   const zFar = 100.0; | ||||||
|  |   const projectionMatrix = mat4.create(); | ||||||
|  | 
 | ||||||
|  |   // note: glmatrix.js always has the first argument
 | ||||||
|  |   // as the destination to receive the result.
 | ||||||
|  |   mat4.perspective(projectionMatrix, | ||||||
|  |                    fieldOfView, | ||||||
|  |                    aspect, | ||||||
|  |                    zNear, | ||||||
|  |                    zFar); | ||||||
|  | 
 | ||||||
|  |   // Set the drawing position to the "identity" point, which is
 | ||||||
|  |   // the center of the scene.
 | ||||||
|  |   const modelViewMatrix = mat4.create(); | ||||||
|  | 
 | ||||||
|  |   // Now move the drawing position a bit to where we want to
 | ||||||
|  |   // start drawing the square.
 | ||||||
|  | 
 | ||||||
|  |   mat4.translate(modelViewMatrix,     // destination matrix
 | ||||||
|  |                  modelViewMatrix,     // matrix to translate
 | ||||||
|  |                  [-0.0, 0.0, -6.0]);  // amount to translate
 | ||||||
|  |   mat4.rotate(modelViewMatrix,  // destination matrix
 | ||||||
|  |               modelViewMatrix,  // matrix to rotate
 | ||||||
|  |               squareRotation,   // amount to rotate in radians
 | ||||||
|  |               [0, 0, 1]);       // axis to rotate around
 | ||||||
|  | 
 | ||||||
|  |   // Tell WebGL how to pull out the positions from the position
 | ||||||
|  |   // buffer into the vertexPosition attribute
 | ||||||
|  |   { | ||||||
|  |     const numComponents = 2; | ||||||
|  |     const type = gl.FLOAT; | ||||||
|  |     const normalize = false; | ||||||
|  |     const stride = 0; | ||||||
|  |     const offset = 0; | ||||||
|  |     gl.bindBuffer(gl.ARRAY_BUFFER, buffers.position); | ||||||
|  |     gl.vertexAttribPointer( | ||||||
|  |         programInfo.attribLocations.vertexPosition, | ||||||
|  |         numComponents, | ||||||
|  |         type, | ||||||
|  |         normalize, | ||||||
|  |         stride, | ||||||
|  |         offset); | ||||||
|  |     gl.enableVertexAttribArray( | ||||||
|  |         programInfo.attribLocations.vertexPosition); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   // Tell WebGL how to pull out the colors from the color buffer
 | ||||||
|  |   // into the vertexColor attribute.
 | ||||||
|  |   { | ||||||
|  |     const numComponents = 4; | ||||||
|  |     const type = gl.FLOAT; | ||||||
|  |     const normalize = false; | ||||||
|  |     const stride = 0; | ||||||
|  |     const offset = 0; | ||||||
|  |     gl.bindBuffer(gl.ARRAY_BUFFER, buffers.color); | ||||||
|  |     gl.vertexAttribPointer( | ||||||
|  |         programInfo.attribLocations.vertexColor, | ||||||
|  |         numComponents, | ||||||
|  |         type, | ||||||
|  |         normalize, | ||||||
|  |         stride, | ||||||
|  |         offset); | ||||||
|  |     gl.enableVertexAttribArray( | ||||||
|  |         programInfo.attribLocations.vertexColor); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   // Tell WebGL to use our program when drawing
 | ||||||
|  | 
 | ||||||
|  |   gl.useProgram(programInfo.program); | ||||||
|  | 
 | ||||||
|  |   // Set the shader uniforms
 | ||||||
|  | 
 | ||||||
|  |   gl.uniformMatrix4fv( | ||||||
|  |       programInfo.uniformLocations.projectionMatrix, | ||||||
|  |       false, | ||||||
|  |       projectionMatrix); | ||||||
|  |   gl.uniformMatrix4fv( | ||||||
|  |       programInfo.uniformLocations.modelViewMatrix, | ||||||
|  |       false, | ||||||
|  |       modelViewMatrix); | ||||||
|  | 
 | ||||||
|  |   { | ||||||
|  |     const offset = 0; | ||||||
|  |     const vertexCount = 4; | ||||||
|  |     gl.drawArrays(gl.TRIANGLE_STRIP, offset, vertexCount); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   // Update the rotation for the next draw
 | ||||||
|  | 
 | ||||||
|  |   squareRotation += deltaTime; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | //
 | ||||||
|  | // Initialize a shader program, so WebGL knows how to draw our data
 | ||||||
|  | //
 | ||||||
|  | function initShaderProgram(gl, vsSource, fsSource) { | ||||||
|  |   const vertexShader = loadShader(gl, gl.VERTEX_SHADER, vsSource); | ||||||
|  |   const fragmentShader = loadShader(gl, gl.FRAGMENT_SHADER, fsSource); | ||||||
|  | 
 | ||||||
|  |   // Create the shader program
 | ||||||
|  | 
 | ||||||
|  |   const shaderProgram = gl.createProgram(); | ||||||
|  |   gl.attachShader(shaderProgram, vertexShader); | ||||||
|  |   gl.attachShader(shaderProgram, fragmentShader); | ||||||
|  |   gl.linkProgram(shaderProgram); | ||||||
|  | 
 | ||||||
|  |   // If creating the shader program failed, alert
 | ||||||
|  | 
 | ||||||
|  |   if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { | ||||||
|  |     alert('Unable to initialize the shader program: ' + gl.getProgramInfoLog(shaderProgram)); | ||||||
|  |     return null; | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   return shaderProgram; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | //
 | ||||||
|  | // creates a shader of the given type, uploads the source and
 | ||||||
|  | // compiles it.
 | ||||||
|  | //
 | ||||||
|  | function loadShader(gl, type, source) { | ||||||
|  |   const shader = gl.createShader(type); | ||||||
|  | 
 | ||||||
|  |   // Send the source to the shader object
 | ||||||
|  | 
 | ||||||
|  |   gl.shaderSource(shader, source); | ||||||
|  | 
 | ||||||
|  |   // Compile the shader program
 | ||||||
|  | 
 | ||||||
|  |   gl.compileShader(shader); | ||||||
|  | 
 | ||||||
|  |   // See if it compiled successfully
 | ||||||
|  | 
 | ||||||
|  |   if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) { | ||||||
|  |     alert('An error occurred compiling the shaders: ' + gl.getShaderInfoLog(shader)); | ||||||
|  |     gl.deleteShader(shader); | ||||||
|  |     return null; | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   return shader; | ||||||
|  | } | ||||||
|  | 
 | ||||||
| @ -4,54 +4,8 @@ title: "Shader fun" | |||||||
| date: 2020-12-28 | date: 2020-12-28 | ||||||
| categories: design | categories: design | ||||||
| --- | --- | ||||||
| <canvas id="canvas" width="1080" height="1080" style="border:1px solid white; | <canvas id="canvas" width="1080" height="1080" style="//border:1px solid white; | ||||||
| width:100%;"></canvas> | width:100%;"></canvas> | ||||||
| 
 | 
 | ||||||
| <script id="node-vertex-shader" type="x-shader/x-vertex"> | <script src="https://cdnjs.cloudflare.com/ajax/libs/gl-matrix/2.8.1/gl-matrix-min.js" integrity="sha512-zhHQR0/H5SEBL3Wn6yYSaTTZej12z0hVZKOv3TwCUXT1z5qeqGcXJLLrbERYRScEDDpYIJhPC1fk31gqR783iQ==" crossorigin="anonymous" defer=""></script> | ||||||
|   uniform vec2 u_resolution; | {% asset shaderCanvas3.js %} | ||||||
|   attribute vec2 a_position; |  | ||||||
|   attribute vec2 a_center; |  | ||||||
|   attribute float a_radius; |  | ||||||
| 
 |  | ||||||
|   varying vec2 center; |  | ||||||
|   varying vec2 resolution; |  | ||||||
|   varying float radius; |  | ||||||
|     |  | ||||||
|   void main() { |  | ||||||
|     vec2 clipspace = a_position / u_resolution * 2.0 - 1.0; |  | ||||||
|     gl_Position = vec4(clipspace * vec2(1, -1), 0, 1); |  | ||||||
| 
 |  | ||||||
|     radius = a_radius; |  | ||||||
|     center = a_center; |  | ||||||
|     resolution = u_resolution; |  | ||||||
|   } |  | ||||||
| </script> |  | ||||||
| 
 |  | ||||||
| <script id="node-fragment-shader" type="x-shader/x-fragment"> |  | ||||||
| 
 |  | ||||||
|   precision mediump float; |  | ||||||
| 
 |  | ||||||
|   varying vec2 center; |  | ||||||
|   varying vec2 resolution; |  | ||||||
|   varying float radius; |  | ||||||
| 
 |  | ||||||
|   void main() { |  | ||||||
|     vec4 color0 = vec4(0.0, 0.0, 0.0, 0.0); |  | ||||||
| 
 |  | ||||||
|     float x = gl_FragCoord.x; |  | ||||||
|     float y = resolution[1] - gl_FragCoord.y; |  | ||||||
| 
 |  | ||||||
|     float dx = center[0] - x; |  | ||||||
|     float dy = center[1] - y; |  | ||||||
|     float distance = sqrt(dx*dx + dy*dy); |  | ||||||
| 
 |  | ||||||
|     if ( distance < radius ) |  | ||||||
|       gl_FragColor = vec4(1.0, 0.5, 0.0, 1.0); |  | ||||||
|     else  |  | ||||||
|       gl_FragColor = color0; |  | ||||||
| 
 |  | ||||||
|   } |  | ||||||
| </script> |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| {% asset shaderCanvas2.js %} |  | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user