Part two of my introduction to WebGL, wherein varying
is used to interpolate colors bound to vertices.
Next: Part III
license: gpl-3.0 |
Part two of my introduction to WebGL, wherein varying
is used to interpolate colors bound to vertices.
Next: Part III
<!DOCTYPE html> | |
<meta charset="utf-8"> | |
<canvas width="960" height="500"></canvas> | |
<script id="vertex-shader" type="x-shader/x-vertex"> | |
attribute vec2 a_position; | |
attribute vec4 a_color; | |
varying lowp vec4 v_color; | |
void main(void) { | |
gl_Position = vec4(a_position, 0.0, 1.0); | |
v_color = a_color; | |
} | |
</script> | |
<script id="fragment-shader" type="x-shader/x-fragment"> | |
varying lowp vec4 v_color; | |
void main(void) { | |
gl_FragColor = v_color; | |
} | |
</script> | |
<script> | |
// Select the canvas from the document. | |
var canvas = document.querySelector("canvas"); | |
// Create the WebGL context, with fallback for experimental support. | |
var context = canvas.getContext("webgl") | |
|| canvas.getContext("experimental-webgl"); | |
// Compile the vertex shader. | |
var vertexShader = context.createShader(context.VERTEX_SHADER); | |
context.shaderSource(vertexShader, document.querySelector("#vertex-shader").textContent); | |
context.compileShader(vertexShader); | |
if (!context.getShaderParameter(vertexShader, context.COMPILE_STATUS)) throw new Error(context.getShaderInfoLog(vertexShader)); | |
// Compile the fragment shader. | |
var fragmentShader = context.createShader(context.FRAGMENT_SHADER); | |
context.shaderSource(fragmentShader, document.querySelector("#fragment-shader").textContent); | |
context.compileShader(fragmentShader); | |
if (!context.getShaderParameter(fragmentShader, context.COMPILE_STATUS)) throw new Error(context.getShaderInfoLog(fragmentShader)); | |
// Link and use the program. | |
var program = context.createProgram(); | |
context.attachShader(program, vertexShader); | |
context.attachShader(program, fragmentShader); | |
context.linkProgram(program); | |
if (!context.getProgramParameter(program, context.LINK_STATUS)) throw new Error(context.getProgramInfoLog(program)); | |
context.useProgram(program); | |
// Define the positions (as vec2) of the square that covers the canvas. | |
var positionBuffer = context.createBuffer(); | |
context.bindBuffer(context.ARRAY_BUFFER, positionBuffer); | |
context.bufferData(context.ARRAY_BUFFER, new Float32Array([ | |
-1.0, -1.0, | |
+1.0, -1.0, | |
+1.0, +1.0, | |
-1.0, +1.0 | |
]), context.STATIC_DRAW); | |
// Bind the position buffer to the position attribute. | |
var positionAttribute = context.getAttribLocation(program, "a_position"); | |
context.enableVertexAttribArray(positionAttribute); | |
context.vertexAttribPointer(positionAttribute, 2, context.FLOAT, false, 0, 0); | |
// Define the colors (as RGBA vec4) for each vertex in the square. | |
var colorBuffer = context.createBuffer(); | |
context.bindBuffer(context.ARRAY_BUFFER, colorBuffer); | |
context.bufferData(context.ARRAY_BUFFER, new Float32Array([ | |
1.0, 1.0, 0.0, 1.0, | |
0.0, 0.0, 1.0, 1.0, | |
0.0, 1.0, 1.0, 1.0, | |
1.0, 0.0, 1.0, 1.0 | |
]), context.STATIC_DRAW); | |
// Bind the color buffer to the color attribute. | |
var colorAttribute = context.getAttribLocation(program, "a_color"); | |
context.enableVertexAttribArray(colorAttribute); | |
context.vertexAttribPointer(colorAttribute, 4, context.FLOAT, false, 0, 0); | |
// Draw the square! | |
context.drawArrays(context.TRIANGLE_FAN, 0, 4); | |
</script> |