Commit ecd186535fd6106312c1b636e5ac3a40b1eda1f3
1 parent
9582c312
More improvement in style and separation of js and html.
Showing
8 changed files
with
868 additions
and
798 deletions
| 1 | <html> | 1 | <html> |
| 2 | <head> | 2 | <head> |
| 3 | - <title>First very simple WebGL example...</title> | ||
| 4 | - | ||
| 5 | - <script src="./gl-matrix-min.js" type="text/javascript"></script> | ||
| 6 | - | ||
| 7 | - <script type="text/javascript"> | ||
| 8 | - var projectionMatrix, modelViewMatrix; | ||
| 9 | - var rotationAxis; | ||
| 10 | - var shaderProgram, shaderVertexPositionAttribute | ||
| 11 | - var shaderVertexColorAttribute; | ||
| 12 | - var shaderProjectionMatrixUniform, shaderModelViewMatrixUniform; | ||
| 13 | - | ||
| 14 | - var duration = 5000; // ms | ||
| 15 | - var currentTime = Date.now(); | ||
| 16 | - | ||
| 17 | - function initWebGL(canvas) { | ||
| 18 | - var gl = null; | ||
| 19 | - var msg = "Your browser does not support WebGL, " + | ||
| 20 | - "or it is not enabled by default."; | ||
| 21 | - try { | ||
| 22 | - gl = canvas.getContext("experimental-webgl"); | ||
| 23 | - } | ||
| 24 | - catch (e) { | ||
| 25 | - msg = "Error creating WebGL Context!: " + e.toString(); | ||
| 26 | - } | ||
| 27 | - if (!gl) { | ||
| 28 | - alert(msg); | ||
| 29 | - throw new Error(msg); | ||
| 30 | - } | ||
| 31 | - | ||
| 32 | - return gl; | ||
| 33 | - } | ||
| 34 | - | ||
| 35 | - function initViewport(gl, canvas) { | ||
| 36 | - gl.viewport(0, 0, canvas.width, canvas.height); | ||
| 37 | - } | ||
| 38 | - | ||
| 39 | - // Create the vertex, color, and index data for a | ||
| 40 | - // multicolored cube | ||
| 41 | - function createCube(gl) { | ||
| 42 | - // Vertex Data | ||
| 43 | - var vertexBuffer; | ||
| 44 | - vertexBuffer = gl.createBuffer(); | ||
| 45 | - gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer); | ||
| 46 | - var verts = [ | ||
| 47 | - // Front face | ||
| 48 | - -1.0, -1.0, 1.0, | ||
| 49 | - 1.0, -1.0, 1.0, | ||
| 50 | - 1.0, 1.0, 1.0, | ||
| 51 | - -1.0, 1.0, 1.0, | ||
| 52 | - // Back face | ||
| 53 | - -1.0, -1.0, -1.0, | ||
| 54 | - -1.0, 1.0, -1.0, | ||
| 55 | - 1.0, 1.0, -1.0, | ||
| 56 | - 1.0, -1.0, -1.0, | ||
| 57 | - // Top face | ||
| 58 | - -1.0, 1.0, -1.0, | ||
| 59 | - -1.0, 1.0, 1.0, | ||
| 60 | - 1.0, 1.0, 1.0, | ||
| 61 | - 1.0, 1.0, -1.0, | ||
| 62 | - // Bottom face | ||
| 63 | - -1.0, -1.0, -1.0, | ||
| 64 | - 1.0, -1.0, -1.0, | ||
| 65 | - 1.0, -1.0, 1.0, | ||
| 66 | - -1.0, -1.0, 1.0, | ||
| 67 | - // Right face | ||
| 68 | - 1.0, -1.0, -1.0, | ||
| 69 | - 1.0, 1.0, -1.0, | ||
| 70 | - 1.0, 1.0, 1.0, | ||
| 71 | - 1.0, -1.0, 1.0, | ||
| 72 | - // Left face | ||
| 73 | - -1.0, -1.0, -1.0, | ||
| 74 | - -1.0, -1.0, 1.0, | ||
| 75 | - -1.0, 1.0, 1.0, | ||
| 76 | - -1.0, 1.0, -1.0 | ||
| 77 | - ]; | ||
| 78 | - gl.bufferData( | ||
| 79 | - gl.ARRAY_BUFFER, | ||
| 80 | - new Float32Array(verts), | ||
| 81 | - gl.STATIC_DRAW); | ||
| 82 | - // Color data | ||
| 83 | - var colorBuffer = gl.createBuffer(); | ||
| 84 | - gl.bindBuffer(gl.ARRAY_BUFFER, colorBuffer); | ||
| 85 | - var faceColors = [ | ||
| 86 | - [1.0, 0.0, 0.0, 1.0], // Front face | ||
| 87 | - [0.0, 1.0, 0.0, 1.0], // Back face | ||
| 88 | - [0.0, 0.0, 1.0, 1.0], // Top face | ||
| 89 | - [1.0, 1.0, 0.0, 1.0], // Bottom face | ||
| 90 | - [1.0, 0.0, 1.0, 1.0], // Right face | ||
| 91 | - [0.0, 1.0, 1.0, 1.0] // Left face | ||
| 92 | - ]; | ||
| 93 | - var vertexColors = []; | ||
| 94 | - for (var i in faceColors) { | ||
| 95 | - var color = faceColors[i]; | ||
| 96 | - for (var j=0; j < 4; j++) { | ||
| 97 | - vertexColors = vertexColors.concat(color); | ||
| 98 | - } | ||
| 99 | - } | ||
| 100 | - gl.bufferData( | ||
| 101 | - gl.ARRAY_BUFFER, | ||
| 102 | - new Float32Array(vertexColors), | ||
| 103 | - gl.STATIC_DRAW); | ||
| 104 | - // Index data (defines the triangles to be drawn) | ||
| 105 | - var cubeIndexBuffer = gl.createBuffer(); | ||
| 106 | - gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, cubeIndexBuffer); | ||
| 107 | - var cubeIndices = [ | ||
| 108 | - 0, 1, 2, 0, 2, 3, // Front face | ||
| 109 | - 4, 5, 6, 4, 6, 7, // Back face | ||
| 110 | - 8, 9, 10, 8, 10, 11, // Top face | ||
| 111 | - 12, 13, 14, 12, 14, 15, // Bottom face | ||
| 112 | - 16, 17, 18, 16, 18, 19, // Right face | ||
| 113 | - 20, 21, 22, 20, 22, 23 // Left face | ||
| 114 | - ]; | ||
| 115 | - gl.bufferData( | ||
| 116 | - gl.ELEMENT_ARRAY_BUFFER, | ||
| 117 | - new Uint16Array(cubeIndices), | ||
| 118 | - gl.STATIC_DRAW); | ||
| 119 | - var cube = { | ||
| 120 | - buffer:vertexBuffer, | ||
| 121 | - colorBuffer:colorBuffer, | ||
| 122 | - indices:cubeIndexBuffer, | ||
| 123 | - vertSize:3, | ||
| 124 | - nVerts:24, | ||
| 125 | - colorSize:4, | ||
| 126 | - nColors: 24, | ||
| 127 | - nIndices:36, | ||
| 128 | - primtype:gl.TRIANGLES}; | ||
| 129 | - | ||
| 130 | - return cube; | ||
| 131 | - } | ||
| 132 | - | ||
| 133 | - function initMatrices(canvas) { | ||
| 134 | - modelViewMatrix = mat4.create(); | ||
| 135 | - mat4.translate( | ||
| 136 | - modelViewMatrix, modelViewMatrix, [0, 0, -8]); | ||
| 137 | - | ||
| 138 | - // Create a project matrix with 45 degree field of view | ||
| 139 | - projectionMatrix = mat4.create(); | ||
| 140 | - mat4.perspective(projectionMatrix, Math.PI / 4, | ||
| 141 | - canvas.width / canvas.height, 1, 10000); | ||
| 142 | - | ||
| 143 | - rotationAxis = vec3.create(); | ||
| 144 | - vec3.normalize(rotationAxis, [1, 1, 1]); | ||
| 145 | - } | ||
| 146 | - | ||
| 147 | - function createShader(gl, id, type) { | ||
| 148 | - var shader; | ||
| 149 | - var str = document.getElementById(id).text; | ||
| 150 | - if (type == "fragment") { | ||
| 151 | - shader = gl.createShader(gl.FRAGMENT_SHADER); | ||
| 152 | - } else if (type == "vertex") { | ||
| 153 | - shader = gl.createShader(gl.VERTEX_SHADER); | ||
| 154 | - } else { | ||
| 155 | - return null; | ||
| 156 | - } | ||
| 157 | - | ||
| 158 | - gl.shaderSource(shader, str); | ||
| 159 | - gl.compileShader(shader); | ||
| 160 | - | ||
| 161 | - if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) { | ||
| 162 | - alert(gl.getShaderInfoLog(shader)); | ||
| 163 | - return null; | ||
| 164 | - } | ||
| 165 | - | ||
| 166 | - return shader; | ||
| 167 | - } | ||
| 168 | - | ||
| 169 | - function initShader(gl, vertex, fragment) { | ||
| 170 | - // load and compile the fragment and vertex shader | ||
| 171 | - var fragmentShader = createShader(gl, fragment, "fragment"); | ||
| 172 | - var vertexShader = createShader(gl, vertex, "vertex"); | ||
| 173 | - | ||
| 174 | - // link them together into a new program | ||
| 175 | - shaderProgram = gl.createProgram(); | ||
| 176 | - gl.attachShader(shaderProgram, vertexShader); | ||
| 177 | - gl.attachShader(shaderProgram, fragmentShader); | ||
| 178 | - gl.linkProgram(shaderProgram); | ||
| 179 | - | ||
| 180 | - // get pointers to the shader params | ||
| 181 | - shaderVertexPositionAttribute = gl.getAttribLocation( | ||
| 182 | - shaderProgram, "vertexPos"); | ||
| 183 | - gl.enableVertexAttribArray(shaderVertexPositionAttribute); | ||
| 184 | - shaderVertexColorAttribute = gl.getAttribLocation( | ||
| 185 | - shaderProgram, "vertexColor"); | ||
| 186 | - gl.enableVertexAttribArray(shaderVertexColorAttribute); | ||
| 187 | - | ||
| 188 | - shaderProjectionMatrixUniform = gl.getUniformLocation( | ||
| 189 | - shaderProgram, "projectionMatrix"); | ||
| 190 | - shaderModelViewMatrixUniform = gl.getUniformLocation( | ||
| 191 | - shaderProgram, "modelViewMatrix"); | ||
| 192 | - | ||
| 193 | - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { | ||
| 194 | - alert("Could not initialise shaders"); | ||
| 195 | - } | ||
| 196 | - } | ||
| 197 | - | ||
| 198 | - function draw(gl, obj) { | ||
| 199 | - // clear the background (transparent) | ||
| 200 | - gl.clearColor(0.0, 0.0, 0.0, 0.0); | ||
| 201 | - // // clear the background (black) | ||
| 202 | - // gl.clearColor(0.0, 0.0, 0.0, 1.0); | ||
| 203 | - gl.enable(gl.DEPTH_TEST); | ||
| 204 | - gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT); | ||
| 205 | - | ||
| 206 | - // set the shader to use | ||
| 207 | - gl.useProgram(shaderProgram); | ||
| 208 | - | ||
| 209 | - // connect up the shader parameters: vertex position, | ||
| 210 | - // color, and projection/model matrices | ||
| 211 | - // set up the buffers | ||
| 212 | - gl.bindBuffer(gl.ARRAY_BUFFER, obj.buffer); | ||
| 213 | - gl.vertexAttribPointer(shaderVertexPositionAttribute, | ||
| 214 | - obj.vertSize, gl.FLOAT, false, 0, 0); | ||
| 215 | - gl.bindBuffer(gl.ARRAY_BUFFER, obj.colorBuffer); | ||
| 216 | - gl.vertexAttribPointer(shaderVertexColorAttribute, | ||
| 217 | - obj.colorSize, gl.FLOAT, false, 0, 0); | ||
| 218 | - gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, obj.indices); | ||
| 219 | - gl.uniformMatrix4fv(shaderProjectionMatrixUniform, false, | ||
| 220 | - projectionMatrix); | ||
| 221 | - gl.uniformMatrix4fv(shaderModelViewMatrixUniform, false, | ||
| 222 | - modelViewMatrix); | ||
| 223 | - | ||
| 224 | - // draw the object | ||
| 225 | - gl.drawElements( | ||
| 226 | - obj.primtype, obj.nIndices, gl.UNSIGNED_SHORT, 0); | ||
| 227 | - } | ||
| 228 | - | ||
| 229 | - function animate() { | ||
| 230 | - var now = Date.now(); | ||
| 231 | - var deltat = now - currentTime; | ||
| 232 | - currentTime = now; | ||
| 233 | - var fract = deltat / duration; | ||
| 234 | - var angle = Math.PI * 2 * fract; | ||
| 235 | - mat4.rotate( | ||
| 236 | - modelViewMatrix, modelViewMatrix, angle, rotationAxis); | ||
| 237 | - } | ||
| 238 | - | ||
| 239 | - function run(gl, cube) { | ||
| 240 | - requestAnimationFrame(function() { run(gl, cube); }); | ||
| 241 | - draw(gl, cube); | ||
| 242 | - animate(); | ||
| 243 | - } | ||
| 244 | - | ||
| 245 | - function startGl() { | ||
| 246 | - // Get A WebGL context | ||
| 247 | - var canvas = document.getElementById("cube"); | ||
| 248 | - var gl = initWebGL(canvas); | ||
| 249 | - var obj = createCube(gl); | ||
| 250 | - | ||
| 251 | - initViewport(gl, canvas); | ||
| 252 | - initMatrices(canvas); | ||
| 253 | - initShader( | ||
| 254 | - gl, | ||
| 255 | - "cube-vertex-shader", | ||
| 256 | - "cube-fragment-shader"); | ||
| 257 | - run(gl, obj); | ||
| 258 | - } | ||
| 259 | - </script> | 3 | + <title>Colored animated cube.</title> |
| 4 | + <link rel="stylesheet" href="main.css"> | ||
| 5 | + <script src="gl-matrix-min.js" type="text/javascript"></script> | ||
| 6 | + <script src="cube.js" type="text/javascript"></script> | ||
| 260 | 7 | ||
| 261 | <script id="cube-vertex-shader" type="x-shader/x-vertex"> | 8 | <script id="cube-vertex-shader" type="x-shader/x-vertex"> |
| 262 | attribute vec3 vertexPos; | 9 | attribute vec3 vertexPos; |
| @@ -281,10 +28,30 @@ | @@ -281,10 +28,30 @@ | ||
| 281 | gl_FragColor = vColor; | 28 | gl_FragColor = vColor; |
| 282 | } | 29 | } |
| 283 | </script> | 30 | </script> |
| 31 | + | ||
| 32 | + <style> | ||
| 33 | + .result_container { | ||
| 34 | + height: 200px; | ||
| 35 | + } | ||
| 36 | + </style> | ||
| 284 | </head> | 37 | </head> |
| 285 | 38 | ||
| 286 | <body onLoad="startGl()"> | 39 | <body onLoad="startGl()"> |
| 287 | - <canvas id="cube" width="200" height="200"></canvas> | 40 | + <div id="background"></div> |
| 41 | + <div id="back" class="text"> | ||
| 42 | + <a href="index.html">back</a> | ||
| 43 | + </div> | ||
| 44 | + <div class="content text"> | ||
| 45 | + <h1>Colored animated cube.</h1> | ||
| 46 | + <p> | ||
| 47 | + An animated cube. Each side has a different color. | ||
| 48 | + </p> | ||
| 49 | + <h2>Result</h2> | ||
| 50 | + <div class="gl"> | ||
| 51 | + <canvas id="cube" width="200" height="200"></canvas> | ||
| 52 | + </div> | ||
| 53 | + <p class="result_container"></p> | ||
| 54 | + </div> | ||
| 288 | </body> | 55 | </body> |
| 289 | </html> | 56 | </html> |
| 290 | <!-- vim: set ts=4 sw=4: --> | 57 | <!-- vim: set ts=4 sw=4: --> |
cube.js
0 → 100644
| 1 | +var projectionMatrix, modelViewMatrix; | ||
| 2 | +var rotationAxis; | ||
| 3 | +var shaderProgram, shaderVertexPositionAttribute | ||
| 4 | +var shaderVertexColorAttribute; | ||
| 5 | +var shaderProjectionMatrixUniform, shaderModelViewMatrixUniform; | ||
| 6 | + | ||
| 7 | +var duration = 5000; // ms | ||
| 8 | +var currentTime = Date.now(); | ||
| 9 | + | ||
| 10 | +function initWebGL(canvas) { | ||
| 11 | + var gl = null; | ||
| 12 | + var msg = "Your browser does not support WebGL, " + | ||
| 13 | + "or it is not enabled by default."; | ||
| 14 | + try { | ||
| 15 | + gl = canvas.getContext("experimental-webgl"); | ||
| 16 | + } | ||
| 17 | + catch (e) { | ||
| 18 | + msg = "Error creating WebGL Context!: " + e.toString(); | ||
| 19 | + } | ||
| 20 | + if (!gl) { | ||
| 21 | + alert(msg); | ||
| 22 | + throw new Error(msg); | ||
| 23 | + } | ||
| 24 | + | ||
| 25 | + return gl; | ||
| 26 | +} | ||
| 27 | + | ||
| 28 | +function initViewport(gl, canvas) { | ||
| 29 | + gl.viewport(0, 0, canvas.width, canvas.height); | ||
| 30 | +} | ||
| 31 | + | ||
| 32 | +// Create the vertex, color, and index data for a | ||
| 33 | +// multicolored cube | ||
| 34 | +function createCube(gl) { | ||
| 35 | + // Vertex Data | ||
| 36 | + var vertexBuffer; | ||
| 37 | + vertexBuffer = gl.createBuffer(); | ||
| 38 | + gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer); | ||
| 39 | + var verts = [ | ||
| 40 | + // Front face | ||
| 41 | + -1.0, -1.0, 1.0, | ||
| 42 | + 1.0, -1.0, 1.0, | ||
| 43 | + 1.0, 1.0, 1.0, | ||
| 44 | + -1.0, 1.0, 1.0, | ||
| 45 | + // Back face | ||
| 46 | + -1.0, -1.0, -1.0, | ||
| 47 | + -1.0, 1.0, -1.0, | ||
| 48 | + 1.0, 1.0, -1.0, | ||
| 49 | + 1.0, -1.0, -1.0, | ||
| 50 | + // Top face | ||
| 51 | + -1.0, 1.0, -1.0, | ||
| 52 | + -1.0, 1.0, 1.0, | ||
| 53 | + 1.0, 1.0, 1.0, | ||
| 54 | + 1.0, 1.0, -1.0, | ||
| 55 | + // Bottom face | ||
| 56 | + -1.0, -1.0, -1.0, | ||
| 57 | + 1.0, -1.0, -1.0, | ||
| 58 | + 1.0, -1.0, 1.0, | ||
| 59 | + -1.0, -1.0, 1.0, | ||
| 60 | + // Right face | ||
| 61 | + 1.0, -1.0, -1.0, | ||
| 62 | + 1.0, 1.0, -1.0, | ||
| 63 | + 1.0, 1.0, 1.0, | ||
| 64 | + 1.0, -1.0, 1.0, | ||
| 65 | + // Left face | ||
| 66 | + -1.0, -1.0, -1.0, | ||
| 67 | + -1.0, -1.0, 1.0, | ||
| 68 | + -1.0, 1.0, 1.0, | ||
| 69 | + -1.0, 1.0, -1.0 | ||
| 70 | + ]; | ||
| 71 | + gl.bufferData( | ||
| 72 | + gl.ARRAY_BUFFER, | ||
| 73 | + new Float32Array(verts), | ||
| 74 | + gl.STATIC_DRAW); | ||
| 75 | + // Color data | ||
| 76 | + var colorBuffer = gl.createBuffer(); | ||
| 77 | + gl.bindBuffer(gl.ARRAY_BUFFER, colorBuffer); | ||
| 78 | + var faceColors = [ | ||
| 79 | + [1.0, 0.0, 0.0, 1.0], // Front face | ||
| 80 | + [0.0, 1.0, 0.0, 1.0], // Back face | ||
| 81 | + [0.0, 0.0, 1.0, 1.0], // Top face | ||
| 82 | + [1.0, 1.0, 0.0, 1.0], // Bottom face | ||
| 83 | + [1.0, 0.0, 1.0, 1.0], // Right face | ||
| 84 | + [0.0, 1.0, 1.0, 1.0] // Left face | ||
| 85 | + ]; | ||
| 86 | + var vertexColors = []; | ||
| 87 | + for (var i in faceColors) { | ||
| 88 | + var color = faceColors[i]; | ||
| 89 | + for (var j=0; j < 4; j++) { | ||
| 90 | + vertexColors = vertexColors.concat(color); | ||
| 91 | + } | ||
| 92 | + } | ||
| 93 | + gl.bufferData( | ||
| 94 | + gl.ARRAY_BUFFER, | ||
| 95 | + new Float32Array(vertexColors), | ||
| 96 | + gl.STATIC_DRAW); | ||
| 97 | + // Index data (defines the triangles to be drawn) | ||
| 98 | + var cubeIndexBuffer = gl.createBuffer(); | ||
| 99 | + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, cubeIndexBuffer); | ||
| 100 | + var cubeIndices = [ | ||
| 101 | + 0, 1, 2, 0, 2, 3, // Front face | ||
| 102 | + 4, 5, 6, 4, 6, 7, // Back face | ||
| 103 | + 8, 9, 10, 8, 10, 11, // Top face | ||
| 104 | + 12, 13, 14, 12, 14, 15, // Bottom face | ||
| 105 | + 16, 17, 18, 16, 18, 19, // Right face | ||
| 106 | + 20, 21, 22, 20, 22, 23 // Left face | ||
| 107 | + ]; | ||
| 108 | + gl.bufferData( | ||
| 109 | + gl.ELEMENT_ARRAY_BUFFER, | ||
| 110 | + new Uint16Array(cubeIndices), | ||
| 111 | + gl.STATIC_DRAW); | ||
| 112 | + var cube = { | ||
| 113 | + buffer:vertexBuffer, | ||
| 114 | + colorBuffer:colorBuffer, | ||
| 115 | + indices:cubeIndexBuffer, | ||
| 116 | + vertSize:3, | ||
| 117 | + nVerts:24, | ||
| 118 | + colorSize:4, | ||
| 119 | + nColors: 24, | ||
| 120 | + nIndices:36, | ||
| 121 | + primtype:gl.TRIANGLES}; | ||
| 122 | + | ||
| 123 | + return cube; | ||
| 124 | +} | ||
| 125 | + | ||
| 126 | +function initMatrices(canvas) { | ||
| 127 | + modelViewMatrix = mat4.create(); | ||
| 128 | + mat4.translate( | ||
| 129 | + modelViewMatrix, modelViewMatrix, [0, 0, -4.6]); | ||
| 130 | + | ||
| 131 | + // Create a project matrix with 45 degree field of view | ||
| 132 | + projectionMatrix = mat4.create(); | ||
| 133 | + mat4.perspective(projectionMatrix, Math.PI / 4, | ||
| 134 | + canvas.width / canvas.height, 1, 10000); | ||
| 135 | + | ||
| 136 | + rotationAxis = vec3.create(); | ||
| 137 | + vec3.normalize(rotationAxis, [1, 1, 1]); | ||
| 138 | +} | ||
| 139 | + | ||
| 140 | +function createShader(gl, id, type) { | ||
| 141 | + var shader; | ||
| 142 | + var str = document.getElementById(id).text; | ||
| 143 | + if (type == "fragment") { | ||
| 144 | + shader = gl.createShader(gl.FRAGMENT_SHADER); | ||
| 145 | + } else if (type == "vertex") { | ||
| 146 | + shader = gl.createShader(gl.VERTEX_SHADER); | ||
| 147 | + } else { | ||
| 148 | + return null; | ||
| 149 | + } | ||
| 150 | + | ||
| 151 | + gl.shaderSource(shader, str); | ||
| 152 | + gl.compileShader(shader); | ||
| 153 | + | ||
| 154 | + if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) { | ||
| 155 | + alert(gl.getShaderInfoLog(shader)); | ||
| 156 | + return null; | ||
| 157 | + } | ||
| 158 | + | ||
| 159 | + return shader; | ||
| 160 | +} | ||
| 161 | + | ||
| 162 | +function initShader(gl, vertex, fragment) { | ||
| 163 | + // load and compile the fragment and vertex shader | ||
| 164 | + var fragmentShader = createShader(gl, fragment, "fragment"); | ||
| 165 | + var vertexShader = createShader(gl, vertex, "vertex"); | ||
| 166 | + | ||
| 167 | + // link them together into a new program | ||
| 168 | + shaderProgram = gl.createProgram(); | ||
| 169 | + gl.attachShader(shaderProgram, vertexShader); | ||
| 170 | + gl.attachShader(shaderProgram, fragmentShader); | ||
| 171 | + gl.linkProgram(shaderProgram); | ||
| 172 | + | ||
| 173 | + // get pointers to the shader params | ||
| 174 | + shaderVertexPositionAttribute = gl.getAttribLocation( | ||
| 175 | + shaderProgram, "vertexPos"); | ||
| 176 | + gl.enableVertexAttribArray(shaderVertexPositionAttribute); | ||
| 177 | + shaderVertexColorAttribute = gl.getAttribLocation( | ||
| 178 | + shaderProgram, "vertexColor"); | ||
| 179 | + gl.enableVertexAttribArray(shaderVertexColorAttribute); | ||
| 180 | + | ||
| 181 | + shaderProjectionMatrixUniform = gl.getUniformLocation( | ||
| 182 | + shaderProgram, "projectionMatrix"); | ||
| 183 | + shaderModelViewMatrixUniform = gl.getUniformLocation( | ||
| 184 | + shaderProgram, "modelViewMatrix"); | ||
| 185 | + | ||
| 186 | + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { | ||
| 187 | + alert("Could not initialise shaders"); | ||
| 188 | + } | ||
| 189 | +} | ||
| 190 | + | ||
| 191 | +function draw(gl, obj) { | ||
| 192 | + // clear the background (transparent) | ||
| 193 | + gl.clearColor(0.0, 0.0, 0.0, 0.0); | ||
| 194 | + // // clear the background (black) | ||
| 195 | + // gl.clearColor(0.0, 0.0, 0.0, 1.0); | ||
| 196 | + gl.enable(gl.DEPTH_TEST); | ||
| 197 | + gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT); | ||
| 198 | + | ||
| 199 | + // set the shader to use | ||
| 200 | + gl.useProgram(shaderProgram); | ||
| 201 | + | ||
| 202 | + // connect up the shader parameters: vertex position, | ||
| 203 | + // color, and projection/model matrices | ||
| 204 | + // set up the buffers | ||
| 205 | + gl.bindBuffer(gl.ARRAY_BUFFER, obj.buffer); | ||
| 206 | + gl.vertexAttribPointer(shaderVertexPositionAttribute, | ||
| 207 | + obj.vertSize, gl.FLOAT, false, 0, 0); | ||
| 208 | + gl.bindBuffer(gl.ARRAY_BUFFER, obj.colorBuffer); | ||
| 209 | + gl.vertexAttribPointer(shaderVertexColorAttribute, | ||
| 210 | + obj.colorSize, gl.FLOAT, false, 0, 0); | ||
| 211 | + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, obj.indices); | ||
| 212 | + gl.uniformMatrix4fv(shaderProjectionMatrixUniform, false, | ||
| 213 | + projectionMatrix); | ||
| 214 | + gl.uniformMatrix4fv(shaderModelViewMatrixUniform, false, | ||
| 215 | + modelViewMatrix); | ||
| 216 | + | ||
| 217 | + // draw the object | ||
| 218 | + gl.drawElements( | ||
| 219 | + obj.primtype, obj.nIndices, gl.UNSIGNED_SHORT, 0); | ||
| 220 | +} | ||
| 221 | + | ||
| 222 | +function animate() { | ||
| 223 | + var now = Date.now(); | ||
| 224 | + var deltat = now - currentTime; | ||
| 225 | + currentTime = now; | ||
| 226 | + var fract = deltat / duration; | ||
| 227 | + var angle = Math.PI * 2 * fract; | ||
| 228 | + mat4.rotate( | ||
| 229 | + modelViewMatrix, modelViewMatrix, angle, rotationAxis); | ||
| 230 | +} | ||
| 231 | + | ||
| 232 | +function run(gl, cube) { | ||
| 233 | + requestAnimationFrame(function() { run(gl, cube); }); | ||
| 234 | + draw(gl, cube); | ||
| 235 | + animate(); | ||
| 236 | +} | ||
| 237 | + | ||
| 238 | +function startGl() { | ||
| 239 | + // Get A WebGL context | ||
| 240 | + var canvas = document.getElementById("cube"); | ||
| 241 | + var gl = initWebGL(canvas); | ||
| 242 | + var obj = createCube(gl); | ||
| 243 | + | ||
| 244 | + initViewport(gl, canvas); | ||
| 245 | + initMatrices(canvas); | ||
| 246 | + initShader( | ||
| 247 | + gl, | ||
| 248 | + "cube-vertex-shader", | ||
| 249 | + "cube-fragment-shader"); | ||
| 250 | + run(gl, obj); | ||
| 251 | +} | ||
| 252 | +/* vim: set ts=4 sw=4: */ |
| 1 | <html> | 1 | <html> |
| 2 | <head> | 2 | <head> |
| 3 | <title> Oh my Gosh </title> | 3 | <title> Oh my Gosh </title> |
| 4 | + <link rel="stylesheet" href="main.css"> | ||
| 4 | </head> | 5 | </head> |
| 5 | 6 | ||
| 6 | <body> | 7 | <body> |
| 7 | - <h1>Some WebGL tests</h1> | ||
| 8 | - <hr> | ||
| 9 | - <ul> | ||
| 10 | - <li><a href="square.html">square</a></li> | ||
| 11 | - <li><a href="cube.html">cube</a></li> | ||
| 12 | - <li><a href="texture.html">texture</a></li> | ||
| 13 | - </ul> | ||
| 14 | - <hr> | 8 | + <div id="background"></div> |
| 9 | + <div class="content text"> | ||
| 10 | + <h1>Some WebGL tests</h1> | ||
| 11 | + <p> | ||
| 12 | + This is my WebGL playground. The examples are taken from the | ||
| 13 | + book <a href="http://oreil.ly/program-3d-apps-html5-webGL"> | ||
| 14 | + Programming 3D Applications with HTML5 and WebGL</a> written | ||
| 15 | + by Tony Parisi and published at O'Reily. | ||
| 16 | + </p> | ||
| 17 | + <h2>Examples</h2> | ||
| 18 | + <p> | ||
| 19 | + <ul> | ||
| 20 | + <li><a href="square.html">square</a></li> | ||
| 21 | + <li><a href="cube.html">cube</a></li> | ||
| 22 | + <li><a href="texture.html">texture</a></li> | ||
| 23 | + </ul> | ||
| 24 | + </p> | ||
| 25 | + </div> | ||
| 15 | </body> | 26 | </body> |
| 16 | </html> | 27 | </html> |
| 17 | <!-- vim: set ts=4 sw=4: --> | 28 | <!-- vim: set ts=4 sw=4: --> |
main.css
0 → 100644
| 1 | +* { | ||
| 2 | + font-family: Verdana, sans-serif; | ||
| 3 | +} | ||
| 4 | +.gl { | ||
| 5 | + position: absolute; | ||
| 6 | + left: 50%; | ||
| 7 | + transform: translate(-50%, 0); | ||
| 8 | + width: 200px; | ||
| 9 | + height: 200px; | ||
| 10 | + z-index: 2; | ||
| 11 | +} | ||
| 12 | +.text { | ||
| 13 | + background: white; | ||
| 14 | + border-style: solid; | ||
| 15 | + border-color: rgb(100, 190, 12); | ||
| 16 | + border-radius: 30px; | ||
| 17 | + border-width: 3px; | ||
| 18 | + padding: 10px; | ||
| 19 | +} | ||
| 20 | +.content { | ||
| 21 | + position: fixed; | ||
| 22 | + top: 50%; | ||
| 23 | + left: 50%; | ||
| 24 | + /* bring your own prefixes */ | ||
| 25 | + transform: translate(-50%, -50%); | ||
| 26 | + width: 800px; | ||
| 27 | + z-index: 1; | ||
| 28 | +} | ||
| 29 | +#background { | ||
| 30 | + position: absolute; | ||
| 31 | + left: 0px; | ||
| 32 | + top: 0px; | ||
| 33 | + width: 1920px; | ||
| 34 | + height: 1200px; | ||
| 35 | + background-image: url(./background1.jpg); | ||
| 36 | + padding: 0px; | ||
| 37 | + margin: 0px; | ||
| 38 | + z-index: -1; | ||
| 39 | +} | ||
| 40 | +#back { | ||
| 41 | + position: fixed; | ||
| 42 | + border-radius: 15px; | ||
| 43 | + border-width: 2px; | ||
| 44 | + z-index: 1; | ||
| 45 | +} | ||
| 46 | +h1,h2,h3,h4,h5,h6 { | ||
| 47 | + font-weight: normal; | ||
| 48 | +} | ||
| 49 | +h1,h4 { | ||
| 50 | + text-decoration: underline; | ||
| 51 | +} | ||
| 52 | +h1 { | ||
| 53 | + font-size: x-large; | ||
| 54 | +} | ||
| 55 | +a { | ||
| 56 | + text-decoration: none; | ||
| 57 | + color: rgb(110, 210, 12); | ||
| 58 | +} | ||
| 59 | +a:visited { | ||
| 60 | + color: rgb(60, 130, 12); | ||
| 61 | +} | ||
| 62 | +/* vim: set ts=4 sw=4: */ |
| 1 | <html> | 1 | <html> |
| 2 | <head> | 2 | <head> |
| 3 | <title>First very simple WebGL example...</title> | 3 | <title>First very simple WebGL example...</title> |
| 4 | - | ||
| 5 | - <script src="./gl-matrix-min.js" type="text/javascript"></script> | ||
| 6 | - | ||
| 7 | - <script type="text/javascript"> | ||
| 8 | - var projectionMatrix, modelViewMatrix; | ||
| 9 | - var shaderProgram, shaderVertexPositionAttribute; | ||
| 10 | - var shaderProjectionMatrixUniform, shaderModelViewMatrixUniform; | ||
| 11 | - | ||
| 12 | - function initWebGL(canvas) { | ||
| 13 | - var gl = null; | ||
| 14 | - var msg = "Your browser does not support WebGL, " + | ||
| 15 | - "or it is not enabled by default."; | ||
| 16 | - try { | ||
| 17 | - gl = canvas.getContext("experimental-webgl"); | ||
| 18 | - } | ||
| 19 | - catch (e) { | ||
| 20 | - msg = "Error creating WebGL Context!: " + e.toString(); | ||
| 21 | - } | ||
| 22 | - if (!gl) { | ||
| 23 | - alert(msg); | ||
| 24 | - throw new Error(msg); | ||
| 25 | - } | ||
| 26 | - | ||
| 27 | - return gl; | ||
| 28 | - } | ||
| 29 | - | ||
| 30 | - function initViewport(gl, canvas) { | ||
| 31 | - gl.viewport(0, 0, canvas.width, canvas.height); | ||
| 32 | - } | ||
| 33 | - | ||
| 34 | - // Create the vertex data for a square to be drawn | ||
| 35 | - function createSquare(gl) { | ||
| 36 | - var vertexBuffer; | ||
| 37 | - vertexBuffer = gl.createBuffer(); | ||
| 38 | - gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer); | ||
| 39 | - var verts = [ | ||
| 40 | - .5, .5, 0.0, | ||
| 41 | - -.5, .5, 0.0, | ||
| 42 | - .5, -.5, 0.0, | ||
| 43 | - -.5, -.5, 0.0 | ||
| 44 | - ]; | ||
| 45 | - gl.bufferData( | ||
| 46 | - gl.ARRAY_BUFFER, | ||
| 47 | - new Float32Array(verts), | ||
| 48 | - gl.STATIC_DRAW); | ||
| 49 | - var square = { | ||
| 50 | - buffer:vertexBuffer, | ||
| 51 | - vertSize:3, | ||
| 52 | - nVerts:4, | ||
| 53 | - primtype:gl.TRIANGLE_STRIP}; | ||
| 54 | - return square; | ||
| 55 | - } | ||
| 56 | - | ||
| 57 | - function initMatrices(canvas) { | ||
| 58 | - // Create a model view matrix with camera at 0, 0, −3.333 | ||
| 59 | - modelViewMatrix = mat4.create(); | ||
| 60 | - mat4.translate( | ||
| 61 | - modelViewMatrix, modelViewMatrix, [0, 0, -3.333]); | ||
| 62 | - | ||
| 63 | - // Create a project matrix with 45 degree field of view | ||
| 64 | - projectionMatrix = mat4.create(); | ||
| 65 | - mat4.perspective(projectionMatrix, Math.PI / 4, | ||
| 66 | - canvas.width / canvas.height, 1, 10000); | ||
| 67 | - } | ||
| 68 | - | ||
| 69 | - function createShader(gl, id, type) { | ||
| 70 | - var shader; | ||
| 71 | - var str = document.getElementById(id).text; | ||
| 72 | - if (type == "fragment") { | ||
| 73 | - shader = gl.createShader(gl.FRAGMENT_SHADER); | ||
| 74 | - } else if (type == "vertex") { | ||
| 75 | - shader = gl.createShader(gl.VERTEX_SHADER); | ||
| 76 | - } else { | ||
| 77 | - return null; | ||
| 78 | - } | ||
| 79 | - | ||
| 80 | - gl.shaderSource(shader, str); | ||
| 81 | - gl.compileShader(shader); | ||
| 82 | - | ||
| 83 | - if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) { | ||
| 84 | - alert(gl.getShaderInfoLog(shader)); | ||
| 85 | - return null; | ||
| 86 | - } | ||
| 87 | - | ||
| 88 | - return shader; | ||
| 89 | - } | ||
| 90 | - | ||
| 91 | - function initShader(gl, vertex, fragment) { | ||
| 92 | - // load and compile the fragment and vertex shader | ||
| 93 | - var fragmentShader = createShader(gl, fragment, "fragment"); | ||
| 94 | - var vertexShader = createShader(gl, vertex, "vertex"); | ||
| 95 | - | ||
| 96 | - // link them together into a new program | ||
| 97 | - shaderProgram = gl.createProgram(); | ||
| 98 | - gl.attachShader(shaderProgram, vertexShader); | ||
| 99 | - gl.attachShader(shaderProgram, fragmentShader); | ||
| 100 | - gl.linkProgram(shaderProgram); | ||
| 101 | - | ||
| 102 | - // get pointers to the shader params | ||
| 103 | - shaderVertexPositionAttribute = gl.getAttribLocation( | ||
| 104 | - shaderProgram, "vertexPos"); | ||
| 105 | - gl.enableVertexAttribArray(shaderVertexPositionAttribute); | ||
| 106 | - | ||
| 107 | - shaderProjectionMatrixUniform = gl.getUniformLocation( | ||
| 108 | - shaderProgram, "projectionMatrix"); | ||
| 109 | - shaderModelViewMatrixUniform = gl.getUniformLocation( | ||
| 110 | - shaderProgram, "modelViewMatrix"); | ||
| 111 | - | ||
| 112 | - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { | ||
| 113 | - alert("Could not initialise shaders"); | ||
| 114 | - } | ||
| 115 | - } | ||
| 116 | - | ||
| 117 | - function draw(gl, obj) { | ||
| 118 | - // clear the background (with black) | ||
| 119 | - gl.clearColor(0.0, 0.0, 0.0, 1.0); | ||
| 120 | - gl.clear(gl.COLOR_BUFFER_BIT); | ||
| 121 | - | ||
| 122 | - // set the vertex buffer to be drawn | ||
| 123 | - gl.bindBuffer(gl.ARRAY_BUFFER, obj.buffer); | ||
| 124 | - | ||
| 125 | - // set the shader to use | ||
| 126 | - gl.useProgram(shaderProgram); | ||
| 127 | - | ||
| 128 | - // connect up the shader parameters: vertex position and | ||
| 129 | - // projection/model matrices | ||
| 130 | - gl.vertexAttribPointer( | ||
| 131 | - shaderVertexPositionAttribute, | ||
| 132 | - obj.vertSize, | ||
| 133 | - gl.FLOAT, false, 0, 0); | ||
| 134 | - gl.uniformMatrix4fv( | ||
| 135 | - shaderProjectionMatrixUniform, | ||
| 136 | - false, projectionMatrix); | ||
| 137 | - gl.uniformMatrix4fv( | ||
| 138 | - shaderModelViewMatrixUniform, false, modelViewMatrix); | ||
| 139 | - | ||
| 140 | - // draw the object | ||
| 141 | - gl.drawArrays(obj.primtype, 0, obj.nVerts); | ||
| 142 | - } | ||
| 143 | - | ||
| 144 | - function startGl() { | ||
| 145 | - // Get A WebGL context | ||
| 146 | - var canvas = document.getElementById("square"); | ||
| 147 | - var gl = initWebGL(canvas); | ||
| 148 | - var obj = createSquare(gl); | ||
| 149 | - | ||
| 150 | - initViewport(gl, canvas); | ||
| 151 | - initMatrices(canvas); | ||
| 152 | - initShader( | ||
| 153 | - gl, | ||
| 154 | - "square-vertex-shader", | ||
| 155 | - "square-fragment-shader"); | ||
| 156 | - draw(gl, obj); | ||
| 157 | - } | ||
| 158 | - </script> | 4 | + <link rel="stylesheet" href="main.css"> |
| 5 | + <script src="gl-matrix-min.js" type="text/javascript"></script> | ||
| 6 | + <script src="square.js" type="text/javascript"></script> | ||
| 159 | 7 | ||
| 160 | <script id="square-vertex-shader" type="x-shader/x-vertex"> | 8 | <script id="square-vertex-shader" type="x-shader/x-vertex"> |
| 161 | attribute vec3 vertexPos; | 9 | attribute vec3 vertexPos; |
| @@ -174,10 +22,31 @@ | @@ -174,10 +22,31 @@ | ||
| 174 | gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0); | 22 | gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0); |
| 175 | } | 23 | } |
| 176 | </script> | 24 | </script> |
| 25 | + | ||
| 26 | + <style> | ||
| 27 | + .result_container { | ||
| 28 | + height: 200px; | ||
| 29 | + } | ||
| 30 | + </style> | ||
| 177 | </head> | 31 | </head> |
| 178 | 32 | ||
| 179 | <body onLoad="startGl()"> | 33 | <body onLoad="startGl()"> |
| 180 | - <canvas id="square" width="200" height="200"></canvas> | 34 | + <div id="background"></div> |
| 35 | + <div id="back" class="text"> | ||
| 36 | + <a href="index.html">back</a> | ||
| 37 | + </div> | ||
| 38 | + <div class="content text"> | ||
| 39 | + <h1>First very simple WebGL example...</h1> | ||
| 40 | + <p> | ||
| 41 | + This is the beginning, not even 3D. Just initialize the | ||
| 42 | + GL context and draw a square. | ||
| 43 | + </p> | ||
| 44 | + <h2>Result</h2> | ||
| 45 | + <div class="gl"> | ||
| 46 | + <canvas id="square" width="200" height="200"></canvas> | ||
| 47 | + </div> | ||
| 48 | + <p class="result_container"></p> | ||
| 49 | + </div> | ||
| 181 | </body> | 50 | </body> |
| 182 | </html> | 51 | </html> |
| 183 | <!-- vim: set ts=4 sw=4: --> | 52 | <!-- vim: set ts=4 sw=4: --> |
square.js
0 → 100644
| 1 | +var projectionMatrix, modelViewMatrix; | ||
| 2 | +var shaderProgram, shaderVertexPositionAttribute; | ||
| 3 | +var shaderProjectionMatrixUniform, shaderModelViewMatrixUniform; | ||
| 4 | + | ||
| 5 | +function initWebGL(canvas) { | ||
| 6 | + var gl = null; | ||
| 7 | + var msg = "Your browser does not support WebGL, " + | ||
| 8 | + "or it is not enabled by default."; | ||
| 9 | + try { | ||
| 10 | + gl = canvas.getContext("experimental-webgl"); | ||
| 11 | + } | ||
| 12 | + catch (e) { | ||
| 13 | + msg = "Error creating WebGL Context!: " + e.toString(); | ||
| 14 | + } | ||
| 15 | + if (!gl) { | ||
| 16 | + alert(msg); | ||
| 17 | + throw new Error(msg); | ||
| 18 | + } | ||
| 19 | + | ||
| 20 | + return gl; | ||
| 21 | +} | ||
| 22 | + | ||
| 23 | +function initViewport(gl, canvas) { | ||
| 24 | + gl.viewport(0, 0, canvas.width, canvas.height); | ||
| 25 | +} | ||
| 26 | + | ||
| 27 | +// Create the vertex data for a square to be drawn | ||
| 28 | +function createSquare(gl) { | ||
| 29 | + var vertexBuffer; | ||
| 30 | + vertexBuffer = gl.createBuffer(); | ||
| 31 | + gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer); | ||
| 32 | + var verts = [ | ||
| 33 | + .5, .5, 0.0, | ||
| 34 | + -.5, .5, 0.0, | ||
| 35 | + .5, -.5, 0.0, | ||
| 36 | + -.5, -.5, 0.0 | ||
| 37 | + ]; | ||
| 38 | + gl.bufferData( | ||
| 39 | + gl.ARRAY_BUFFER, | ||
| 40 | + new Float32Array(verts), | ||
| 41 | + gl.STATIC_DRAW); | ||
| 42 | + var square = { | ||
| 43 | + buffer:vertexBuffer, | ||
| 44 | + vertSize:3, | ||
| 45 | + nVerts:4, | ||
| 46 | + primtype:gl.TRIANGLE_STRIP}; | ||
| 47 | + return square; | ||
| 48 | +} | ||
| 49 | + | ||
| 50 | +function initMatrices(canvas) { | ||
| 51 | + // Create a model view matrix with camera at 0, 0, −3.333 | ||
| 52 | + modelViewMatrix = mat4.create(); | ||
| 53 | + mat4.translate( | ||
| 54 | + modelViewMatrix, modelViewMatrix, [0, 0, -3.333]); | ||
| 55 | + | ||
| 56 | + // Create a project matrix with 45 degree field of view | ||
| 57 | + projectionMatrix = mat4.create(); | ||
| 58 | + mat4.perspective(projectionMatrix, Math.PI / 4, | ||
| 59 | + canvas.width / canvas.height, 1, 10000); | ||
| 60 | +} | ||
| 61 | + | ||
| 62 | +function createShader(gl, id, type) { | ||
| 63 | + var shader; | ||
| 64 | + var str = document.getElementById(id).text; | ||
| 65 | + if (type == "fragment") { | ||
| 66 | + shader = gl.createShader(gl.FRAGMENT_SHADER); | ||
| 67 | + } else if (type == "vertex") { | ||
| 68 | + shader = gl.createShader(gl.VERTEX_SHADER); | ||
| 69 | + } else { | ||
| 70 | + return null; | ||
| 71 | + } | ||
| 72 | + | ||
| 73 | + gl.shaderSource(shader, str); | ||
| 74 | + gl.compileShader(shader); | ||
| 75 | + | ||
| 76 | + if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) { | ||
| 77 | + alert(gl.getShaderInfoLog(shader)); | ||
| 78 | + return null; | ||
| 79 | + } | ||
| 80 | + | ||
| 81 | + return shader; | ||
| 82 | +} | ||
| 83 | + | ||
| 84 | +function initShader(gl, vertex, fragment) { | ||
| 85 | + // load and compile the fragment and vertex shader | ||
| 86 | + var fragmentShader = createShader(gl, fragment, "fragment"); | ||
| 87 | + var vertexShader = createShader(gl, vertex, "vertex"); | ||
| 88 | + | ||
| 89 | + // link them together into a new program | ||
| 90 | + shaderProgram = gl.createProgram(); | ||
| 91 | + gl.attachShader(shaderProgram, vertexShader); | ||
| 92 | + gl.attachShader(shaderProgram, fragmentShader); | ||
| 93 | + gl.linkProgram(shaderProgram); | ||
| 94 | + | ||
| 95 | + // get pointers to the shader params | ||
| 96 | + shaderVertexPositionAttribute = gl.getAttribLocation( | ||
| 97 | + shaderProgram, "vertexPos"); | ||
| 98 | + gl.enableVertexAttribArray(shaderVertexPositionAttribute); | ||
| 99 | + | ||
| 100 | + shaderProjectionMatrixUniform = gl.getUniformLocation( | ||
| 101 | + shaderProgram, "projectionMatrix"); | ||
| 102 | + shaderModelViewMatrixUniform = gl.getUniformLocation( | ||
| 103 | + shaderProgram, "modelViewMatrix"); | ||
| 104 | + | ||
| 105 | + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { | ||
| 106 | + alert("Could not initialise shaders"); | ||
| 107 | + } | ||
| 108 | +} | ||
| 109 | + | ||
| 110 | +function draw(gl, obj) { | ||
| 111 | + // clear the background (with black) | ||
| 112 | + gl.clearColor(0.0, 0.0, 0.0, 1.0); | ||
| 113 | + gl.clear(gl.COLOR_BUFFER_BIT); | ||
| 114 | + | ||
| 115 | + // set the vertex buffer to be drawn | ||
| 116 | + gl.bindBuffer(gl.ARRAY_BUFFER, obj.buffer); | ||
| 117 | + | ||
| 118 | + // set the shader to use | ||
| 119 | + gl.useProgram(shaderProgram); | ||
| 120 | + | ||
| 121 | + // connect up the shader parameters: vertex position and | ||
| 122 | + // projection/model matrices | ||
| 123 | + gl.vertexAttribPointer( | ||
| 124 | + shaderVertexPositionAttribute, | ||
| 125 | + obj.vertSize, | ||
| 126 | + gl.FLOAT, false, 0, 0); | ||
| 127 | + gl.uniformMatrix4fv( | ||
| 128 | + shaderProjectionMatrixUniform, | ||
| 129 | + false, projectionMatrix); | ||
| 130 | + gl.uniformMatrix4fv( | ||
| 131 | + shaderModelViewMatrixUniform, false, modelViewMatrix); | ||
| 132 | + | ||
| 133 | + // draw the object | ||
| 134 | + gl.drawArrays(obj.primtype, 0, obj.nVerts); | ||
| 135 | +} | ||
| 136 | + | ||
| 137 | +function startGl() { | ||
| 138 | + // Get A WebGL context | ||
| 139 | + var canvas = document.getElementById("square"); | ||
| 140 | + var gl = initWebGL(canvas); | ||
| 141 | + var obj = createSquare(gl); | ||
| 142 | + | ||
| 143 | + initViewport(gl, canvas); | ||
| 144 | + initMatrices(canvas); | ||
| 145 | + initShader( | ||
| 146 | + gl, | ||
| 147 | + "square-vertex-shader", | ||
| 148 | + "square-fragment-shader"); | ||
| 149 | + draw(gl, obj); | ||
| 150 | +} | ||
| 151 | +// vim: set ts=4 sw=4: |
| 1 | <html> | 1 | <html> |
| 2 | <head> | 2 | <head> |
| 3 | <title>My first animated and textured WebGL content.</title> | 3 | <title>My first animated and textured WebGL content.</title> |
| 4 | - | ||
| 5 | - <script src="./gl-matrix-min.js" type="text/javascript"></script> | ||
| 6 | - | ||
| 7 | - <script type="text/javascript"> | ||
| 8 | - var projectionMatrix, modelViewMatrix; | ||
| 9 | - var rotationAxis; | ||
| 10 | - var shaderProgram, shaderVertexPositionAttribute | ||
| 11 | - var shaderTexCoordAttribute, shaderSamplerUniform; | ||
| 12 | - var shaderProjectionMatrixUniform, shaderModelViewMatrixUniform; | ||
| 13 | - | ||
| 14 | - var duration = 5000; // ms | ||
| 15 | - var currentTime = Date.now(); | ||
| 16 | - | ||
| 17 | - var okToRun = false; | ||
| 18 | - var webGLTexture; | ||
| 19 | - | ||
| 20 | - function handleTextureLoaded(gl, texture) { | ||
| 21 | - gl.bindTexture(gl.TEXTURE_2D, texture); | ||
| 22 | - gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, true); | ||
| 23 | - gl.texImage2D( | ||
| 24 | - gl.TEXTURE_2D, | ||
| 25 | - 0, | ||
| 26 | - gl.RGBA, | ||
| 27 | - gl.RGBA, | ||
| 28 | - gl.UNSIGNED_BYTE, | ||
| 29 | - texture.image); | ||
| 30 | - gl.texParameteri( | ||
| 31 | - gl.TEXTURE_2D, | ||
| 32 | - gl.TEXTURE_MAG_FILTER, | ||
| 33 | - gl.NEAREST); | ||
| 34 | - gl.texParameteri( | ||
| 35 | - gl.TEXTURE_2D, | ||
| 36 | - gl.TEXTURE_MIN_FILTER, | ||
| 37 | - gl.NEAREST); | ||
| 38 | - gl.bindTexture(gl.TEXTURE_2D, null); | ||
| 39 | - okToRun = true; | ||
| 40 | - } | ||
| 41 | - | ||
| 42 | - function initTexture(gl) { | ||
| 43 | - webGLTexture = gl.createTexture(); | ||
| 44 | - webGLTexture.image = new Image(); | ||
| 45 | - webGLTexture.image.onload = function () { | ||
| 46 | - handleTextureLoaded(gl, webGLTexture) | ||
| 47 | - } | ||
| 48 | - //webGLTexture.image.src = "P3D/images/webgl-logo-256.jpg"; | ||
| 49 | - webGLTexture.image.src = "gravatar-256.jpg"; | ||
| 50 | - } | ||
| 51 | - | ||
| 52 | - function initWebGL(canvas) { | ||
| 53 | - var gl = null; | ||
| 54 | - var msg = "Your browser does not support WebGL, " + | ||
| 55 | - "or it is not enabled by default."; | ||
| 56 | - try { | ||
| 57 | - gl = canvas.getContext("experimental-webgl"); | ||
| 58 | - } | ||
| 59 | - catch (e) { | ||
| 60 | - msg = "Error creating WebGL Context!: " + e.toString(); | ||
| 61 | - } | ||
| 62 | - if (!gl) { | ||
| 63 | - alert(msg); | ||
| 64 | - throw new Error(msg); | ||
| 65 | - } | ||
| 66 | - | ||
| 67 | - return gl; | ||
| 68 | - } | ||
| 69 | - | ||
| 70 | - function initViewport(gl, canvas) { | ||
| 71 | - gl.viewport(0, 0, canvas.width, canvas.height); | ||
| 72 | - } | ||
| 73 | - | ||
| 74 | - // Create the vertex, color, and index data for a | ||
| 75 | - // multicolored cube | ||
| 76 | - function createCube(gl) { | ||
| 77 | - // Vertex Data | ||
| 78 | - var vertexBuffer; | ||
| 79 | - vertexBuffer = gl.createBuffer(); | ||
| 80 | - gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer); | ||
| 81 | - var verts = [ | ||
| 82 | - // Front face | ||
| 83 | - -1.0, -1.0, 1.0, | ||
| 84 | - 1.0, -1.0, 1.0, | ||
| 85 | - 1.0, 1.0, 1.0, | ||
| 86 | - -1.0, 1.0, 1.0, | ||
| 87 | - // Back face | ||
| 88 | - -1.0, -1.0, -1.0, | ||
| 89 | - -1.0, 1.0, -1.0, | ||
| 90 | - 1.0, 1.0, -1.0, | ||
| 91 | - 1.0, -1.0, -1.0, | ||
| 92 | - // Top face | ||
| 93 | - -1.0, 1.0, -1.0, | ||
| 94 | - -1.0, 1.0, 1.0, | ||
| 95 | - 1.0, 1.0, 1.0, | ||
| 96 | - 1.0, 1.0, -1.0, | ||
| 97 | - // Bottom face | ||
| 98 | - -1.0, -1.0, -1.0, | ||
| 99 | - 1.0, -1.0, -1.0, | ||
| 100 | - 1.0, -1.0, 1.0, | ||
| 101 | - -1.0, -1.0, 1.0, | ||
| 102 | - // Right face | ||
| 103 | - 1.0, -1.0, -1.0, | ||
| 104 | - 1.0, 1.0, -1.0, | ||
| 105 | - 1.0, 1.0, 1.0, | ||
| 106 | - 1.0, -1.0, 1.0, | ||
| 107 | - // Left face | ||
| 108 | - -1.0, -1.0, -1.0, | ||
| 109 | - -1.0, -1.0, 1.0, | ||
| 110 | - -1.0, 1.0, 1.0, | ||
| 111 | - -1.0, 1.0, -1.0 | ||
| 112 | - ]; | ||
| 113 | - gl.bufferData( | ||
| 114 | - gl.ARRAY_BUFFER, | ||
| 115 | - new Float32Array(verts), | ||
| 116 | - gl.STATIC_DRAW); | ||
| 117 | - | ||
| 118 | - var texCoordBuffer = gl.createBuffer(); | ||
| 119 | - gl.bindBuffer(gl.ARRAY_BUFFER, texCoordBuffer); | ||
| 120 | - var textureCoords = [ | ||
| 121 | - // Front face | ||
| 122 | - 0.0, 0.0, | ||
| 123 | - 1.0, 0.0, | ||
| 124 | - 1.0, 1.0, | ||
| 125 | - 0.0, 1.0, | ||
| 126 | - | ||
| 127 | - // Back face | ||
| 128 | - 1.0, 0.0, | ||
| 129 | - 1.0, 1.0, | ||
| 130 | - 0.0, 1.0, | ||
| 131 | - 0.0, 0.0, | ||
| 132 | - | ||
| 133 | - // Top face | ||
| 134 | - 0.0, 1.0, | ||
| 135 | - 0.0, 0.0, | ||
| 136 | - 1.0, 0.0, | ||
| 137 | - 1.0, 1.0, | ||
| 138 | - | ||
| 139 | - // Bottom face | ||
| 140 | - 1.0, 1.0, | ||
| 141 | - 0.0, 1.0, | ||
| 142 | - 0.0, 0.0, | ||
| 143 | - 1.0, 0.0, | ||
| 144 | - | ||
| 145 | - // Right face | ||
| 146 | - 1.0, 0.0, | ||
| 147 | - 1.0, 1.0, | ||
| 148 | - 0.0, 1.0, | ||
| 149 | - 0.0, 0.0, | ||
| 150 | - | ||
| 151 | - // Left face | ||
| 152 | - 0.0, 0.0, | ||
| 153 | - 1.0, 0.0, | ||
| 154 | - 1.0, 1.0, | ||
| 155 | - 0.0, 1.0, | ||
| 156 | - ]; | ||
| 157 | - gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(textureCoords), gl.STATIC_DRAW); | ||
| 158 | - | ||
| 159 | - // Index data (defines the triangles to be drawn) | ||
| 160 | - var cubeIndexBuffer = gl.createBuffer(); | ||
| 161 | - gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, cubeIndexBuffer); | ||
| 162 | - var cubeIndices = [ | ||
| 163 | - 0, 1, 2, 0, 2, 3, // Front face | ||
| 164 | - 4, 5, 6, 4, 6, 7, // Back face | ||
| 165 | - 8, 9, 10, 8, 10, 11, // Top face | ||
| 166 | - 12, 13, 14, 12, 14, 15, // Bottom face | ||
| 167 | - 16, 17, 18, 16, 18, 19, // Right face | ||
| 168 | - 20, 21, 22, 20, 22, 23 // Left face | ||
| 169 | - ]; | ||
| 170 | - gl.bufferData( | ||
| 171 | - gl.ELEMENT_ARRAY_BUFFER, | ||
| 172 | - new Uint16Array(cubeIndices), | ||
| 173 | - gl.STATIC_DRAW); | ||
| 174 | - var cube = { | ||
| 175 | - buffer:vertexBuffer, | ||
| 176 | - texCoordBuffer:texCoordBuffer, | ||
| 177 | - indices:cubeIndexBuffer, | ||
| 178 | - vertSize:3, | ||
| 179 | - nVerts:24, | ||
| 180 | - texCoordSize:2, | ||
| 181 | - nTexCoords: 24, | ||
| 182 | - nIndices:36, | ||
| 183 | - primtype:gl.TRIANGLES}; | ||
| 184 | - | ||
| 185 | - return cube; | ||
| 186 | - } | ||
| 187 | - | ||
| 188 | - function initMatrices(canvas) { | ||
| 189 | - modelViewMatrix = mat4.create(); | ||
| 190 | - mat4.translate( | ||
| 191 | - modelViewMatrix, modelViewMatrix, [0, 0, -4.6]); | ||
| 192 | - | ||
| 193 | - // Create a project matrix with 45 degree field of view | ||
| 194 | - projectionMatrix = mat4.create(); | ||
| 195 | - mat4.perspective(projectionMatrix, Math.PI / 4, | ||
| 196 | - canvas.width / canvas.height, 1, 10000); | ||
| 197 | - | ||
| 198 | - rotationAxis = vec3.create(); | ||
| 199 | - vec3.normalize(rotationAxis, [1, 1, 1]); | ||
| 200 | - } | ||
| 201 | - | ||
| 202 | - function createShader(gl, id, type) { | ||
| 203 | - var shader; | ||
| 204 | - var str = document.getElementById(id).text; | ||
| 205 | - if (type == "fragment") { | ||
| 206 | - shader = gl.createShader(gl.FRAGMENT_SHADER); | ||
| 207 | - } else if (type == "vertex") { | ||
| 208 | - shader = gl.createShader(gl.VERTEX_SHADER); | ||
| 209 | - } else { | ||
| 210 | - return null; | ||
| 211 | - } | ||
| 212 | - | ||
| 213 | - gl.shaderSource(shader, str); | ||
| 214 | - gl.compileShader(shader); | ||
| 215 | - | ||
| 216 | - if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) { | ||
| 217 | - alert(gl.getShaderInfoLog(shader)); | ||
| 218 | - return null; | ||
| 219 | - } | ||
| 220 | - | ||
| 221 | - return shader; | ||
| 222 | - } | ||
| 223 | - | ||
| 224 | - function initShader(gl, vertex, fragment) { | ||
| 225 | - // load and compile the fragment and vertex shader | ||
| 226 | - var fragmentShader = createShader(gl, fragment, "fragment"); | ||
| 227 | - var vertexShader = createShader(gl, vertex, "vertex"); | ||
| 228 | - | ||
| 229 | - // link them together into a new program | ||
| 230 | - shaderProgram = gl.createProgram(); | ||
| 231 | - gl.attachShader(shaderProgram, vertexShader); | ||
| 232 | - gl.attachShader(shaderProgram, fragmentShader); | ||
| 233 | - gl.linkProgram(shaderProgram); | ||
| 234 | - | ||
| 235 | - // get pointers to the shader params | ||
| 236 | - shaderVertexPositionAttribute = gl.getAttribLocation( | ||
| 237 | - shaderProgram, "vertexPos"); | ||
| 238 | - gl.enableVertexAttribArray(shaderVertexPositionAttribute); | ||
| 239 | - shaderTexCoordAttribute = gl.getAttribLocation( | ||
| 240 | - shaderProgram, "texCoord"); | ||
| 241 | - gl.enableVertexAttribArray(shaderTexCoordAttribute); | ||
| 242 | - | ||
| 243 | - shaderProjectionMatrixUniform = gl.getUniformLocation( | ||
| 244 | - shaderProgram, "projectionMatrix"); | ||
| 245 | - shaderModelViewMatrixUniform = gl.getUniformLocation( | ||
| 246 | - shaderProgram, "modelViewMatrix"); | ||
| 247 | - shaderSamplerUniform = gl.getUniformLocation( | ||
| 248 | - shaderProgram, "uSampler"); | ||
| 249 | - | ||
| 250 | - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { | ||
| 251 | - alert("Could not initialise shaders"); | ||
| 252 | - } | ||
| 253 | - } | ||
| 254 | - | ||
| 255 | - function draw(gl, obj) { | ||
| 256 | - // clear the background (transparent) | ||
| 257 | - gl.clearColor(0.0, 0.0, 0.0, 0.0); | ||
| 258 | - // // clear the background (black) | ||
| 259 | - // gl.clearColor(0.0, 0.0, 0.0, 1.0); | ||
| 260 | - gl.enable(gl.DEPTH_TEST); | ||
| 261 | - gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT); | ||
| 262 | - | ||
| 263 | - // set the shader to use | ||
| 264 | - gl.useProgram(shaderProgram); | ||
| 265 | - | ||
| 266 | - // connect up the shader parameters: vertex position, | ||
| 267 | - // color, and projection/model matrices | ||
| 268 | - // set up the buffers | ||
| 269 | - gl.bindBuffer(gl.ARRAY_BUFFER, obj.buffer); | ||
| 270 | - gl.vertexAttribPointer( | ||
| 271 | - shaderVertexPositionAttribute, | ||
| 272 | - obj.vertSize, | ||
| 273 | - gl.FLOAT, | ||
| 274 | - false, 0, 0); | ||
| 275 | - gl.bindBuffer(gl.ARRAY_BUFFER, obj.texCoordBuffer); | ||
| 276 | - gl.vertexAttribPointer( | ||
| 277 | - shaderTexCoordAttribute, | ||
| 278 | - obj.texCoordSize, | ||
| 279 | - gl.FLOAT, | ||
| 280 | - false, 0, 0); | ||
| 281 | - gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, obj.indices); | ||
| 282 | - gl.uniformMatrix4fv(shaderProjectionMatrixUniform, false, | ||
| 283 | - projectionMatrix); | ||
| 284 | - gl.uniformMatrix4fv(shaderModelViewMatrixUniform, false, | ||
| 285 | - modelViewMatrix); | ||
| 286 | - | ||
| 287 | - gl.activeTexture(gl.TEXTURE0); | ||
| 288 | - gl.bindTexture(gl.TEXTURE_2D, webGLTexture); | ||
| 289 | - gl.uniform1i(shaderSamplerUniform, 0); | ||
| 290 | - | ||
| 291 | - // draw the object | ||
| 292 | - gl.drawElements( | ||
| 293 | - obj.primtype, obj.nIndices, gl.UNSIGNED_SHORT, 0); | ||
| 294 | - } | ||
| 295 | - | ||
| 296 | - function animate() { | ||
| 297 | - var now = Date.now(); | ||
| 298 | - var deltat = now - currentTime; | ||
| 299 | - currentTime = now; | ||
| 300 | - var fract = deltat / duration; | ||
| 301 | - var angle = Math.PI * 2 * fract; | ||
| 302 | - mat4.rotate( | ||
| 303 | - modelViewMatrix, | ||
| 304 | - modelViewMatrix, | ||
| 305 | - angle, | ||
| 306 | - rotationAxis); | ||
| 307 | - } | ||
| 308 | - | ||
| 309 | - function run(gl, cube) { | ||
| 310 | - requestAnimationFrame(function() { run(gl, cube); }); | ||
| 311 | - if (okToRun) { | ||
| 312 | - draw(gl, cube); | ||
| 313 | - animate(); | ||
| 314 | - } | ||
| 315 | - } | ||
| 316 | - | ||
| 317 | - function startGl() { | ||
| 318 | - // Get A WebGL context | ||
| 319 | - var canvas = document.getElementById("cube"); | ||
| 320 | - var gl = initWebGL(canvas); | ||
| 321 | - var obj = createCube(gl); | ||
| 322 | - | ||
| 323 | - initViewport(gl, canvas); | ||
| 324 | - initMatrices(canvas); | ||
| 325 | - initShader( | ||
| 326 | - gl, | ||
| 327 | - "texture-vertex-shader", | ||
| 328 | - "texture-fragment-shader"); | ||
| 329 | - initTexture(gl); | ||
| 330 | - run(gl, obj); | ||
| 331 | - } | ||
| 332 | - </script> | 4 | + <link rel="stylesheet" href="main.css"> |
| 5 | + <script src="gl-matrix-min.js" type="text/javascript"></script> | ||
| 6 | + <script src="texture.js" type="text/javascript"></script> | ||
| 333 | 7 | ||
| 334 | <script id="texture-vertex-shader" type="x-shader/x-vertex"> | 8 | <script id="texture-vertex-shader" type="x-shader/x-vertex"> |
| 335 | attribute vec3 vertexPos; | 9 | attribute vec3 vertexPos; |
| @@ -355,60 +29,19 @@ | @@ -355,60 +29,19 @@ | ||
| 355 | } | 29 | } |
| 356 | </script> | 30 | </script> |
| 357 | <style> | 31 | <style> |
| 358 | - * { | ||
| 359 | - font-family: Verdana, sans-serif; | ||
| 360 | - } | ||
| 361 | - .gl { | ||
| 362 | - position: absolute; | 32 | + .texture { |
| 363 | top: 130px; | 33 | top: 130px; |
| 364 | - left: 50%; | ||
| 365 | - transform: translate(-50%, 0); | ||
| 366 | - width: 200px; | ||
| 367 | - height: 200px; | ||
| 368 | - z-index: 2; | ||
| 369 | - } | ||
| 370 | - .content { | ||
| 371 | - position: fixed; | ||
| 372 | - top: 50%; | ||
| 373 | - left: 50%; | ||
| 374 | - /* bring your own prefixes */ | ||
| 375 | - transform: translate(-50%, -50%); | ||
| 376 | - width: 800px; | ||
| 377 | - background: white; | ||
| 378 | - padding: 10px; | ||
| 379 | - border-style: solid; | ||
| 380 | - border-color: rgb(100, 190, 12); | ||
| 381 | - border-radius: 30px; | ||
| 382 | - border-width: 3px; | ||
| 383 | - z-index: 1; | ||
| 384 | - } | ||
| 385 | - #background { | ||
| 386 | - position: absolute; | ||
| 387 | - left: 0px; | ||
| 388 | - top: 0px; | ||
| 389 | - width: 1920px; | ||
| 390 | - height: 1200px; | ||
| 391 | - background-image: url(./background1.jpg); | ||
| 392 | - padding: 0px; | ||
| 393 | - margin: 0px; | ||
| 394 | - z-index: -1; | ||
| 395 | - } | ||
| 396 | - h1,h2,h3,h4,h5,h6 { | ||
| 397 | - font-weight: normal; | ||
| 398 | - } | ||
| 399 | - h1,h4 { | ||
| 400 | - text-decoration: underline; | ||
| 401 | - } | ||
| 402 | - h1 { | ||
| 403 | - font-size: x-large; | ||
| 404 | } | 34 | } |
| 405 | </style> | 35 | </style> |
| 406 | </head> | 36 | </head> |
| 407 | 37 | ||
| 408 | <body onLoad="startGl()"> | 38 | <body onLoad="startGl()"> |
| 409 | <div id="background"></div> | 39 | <div id="background"></div> |
| 410 | - <div class="content"> | ||
| 411 | - <div class="gl"> | 40 | + <div id="back" class="text"> |
| 41 | + <a href="index.html">back</a> | ||
| 42 | + </div> | ||
| 43 | + <div class="content text"> | ||
| 44 | + <div class="gl texture"> | ||
| 412 | <canvas id="cube" width="200", height="200"></canvas> | 45 | <canvas id="cube" width="200", height="200"></canvas> |
| 413 | </div> | 46 | </div> |
| 414 | <h1>My first animated and textured WebGL content.</h1> | 47 | <h1>My first animated and textured WebGL content.</h1> |
texture.js
0 → 100644
| 1 | +var projectionMatrix, modelViewMatrix; | ||
| 2 | +var rotationAxis; | ||
| 3 | +var shaderProgram, shaderVertexPositionAttribute | ||
| 4 | +var shaderTexCoordAttribute, shaderSamplerUniform; | ||
| 5 | +var shaderProjectionMatrixUniform, shaderModelViewMatrixUniform; | ||
| 6 | + | ||
| 7 | +var duration = 5000; // ms | ||
| 8 | +var currentTime = Date.now(); | ||
| 9 | + | ||
| 10 | +var okToRun = false; | ||
| 11 | +var webGLTexture; | ||
| 12 | + | ||
| 13 | +function handleTextureLoaded(gl, texture) { | ||
| 14 | + gl.bindTexture(gl.TEXTURE_2D, texture); | ||
| 15 | + gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, true); | ||
| 16 | + gl.texImage2D( | ||
| 17 | + gl.TEXTURE_2D, | ||
| 18 | + 0, | ||
| 19 | + gl.RGBA, | ||
| 20 | + gl.RGBA, | ||
| 21 | + gl.UNSIGNED_BYTE, | ||
| 22 | + texture.image); | ||
| 23 | + gl.texParameteri( | ||
| 24 | + gl.TEXTURE_2D, | ||
| 25 | + gl.TEXTURE_MAG_FILTER, | ||
| 26 | + gl.NEAREST); | ||
| 27 | + gl.texParameteri( | ||
| 28 | + gl.TEXTURE_2D, | ||
| 29 | + gl.TEXTURE_MIN_FILTER, | ||
| 30 | + gl.NEAREST); | ||
| 31 | + gl.bindTexture(gl.TEXTURE_2D, null); | ||
| 32 | + okToRun = true; | ||
| 33 | +} | ||
| 34 | + | ||
| 35 | +function initTexture(gl) { | ||
| 36 | + webGLTexture = gl.createTexture(); | ||
| 37 | + webGLTexture.image = new Image(); | ||
| 38 | + webGLTexture.image.onload = function () { | ||
| 39 | + handleTextureLoaded(gl, webGLTexture) | ||
| 40 | + } | ||
| 41 | + //webGLTexture.image.src = "P3D/images/webgl-logo-256.jpg"; | ||
| 42 | + webGLTexture.image.src = "gravatar-256.jpg"; | ||
| 43 | +} | ||
| 44 | + | ||
| 45 | +function initWebGL(canvas) { | ||
| 46 | + var gl = null; | ||
| 47 | + var msg = "Your browser does not support WebGL, " + | ||
| 48 | + "or it is not enabled by default."; | ||
| 49 | + try { | ||
| 50 | + gl = canvas.getContext("experimental-webgl"); | ||
| 51 | + } | ||
| 52 | + catch (e) { | ||
| 53 | + msg = "Error creating WebGL Context!: " + e.toString(); | ||
| 54 | + } | ||
| 55 | + if (!gl) { | ||
| 56 | + alert(msg); | ||
| 57 | + throw new Error(msg); | ||
| 58 | + } | ||
| 59 | + | ||
| 60 | + return gl; | ||
| 61 | +} | ||
| 62 | + | ||
| 63 | +function initViewport(gl, canvas) { | ||
| 64 | + gl.viewport(0, 0, canvas.width, canvas.height); | ||
| 65 | +} | ||
| 66 | + | ||
| 67 | +// Create the vertex, color, and index data for a | ||
| 68 | +// multicolored cube | ||
| 69 | +function createCube(gl) { | ||
| 70 | + // Vertex Data | ||
| 71 | + var vertexBuffer; | ||
| 72 | + vertexBuffer = gl.createBuffer(); | ||
| 73 | + gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer); | ||
| 74 | + var verts = [ | ||
| 75 | + // Front face | ||
| 76 | + -1.0, -1.0, 1.0, | ||
| 77 | + 1.0, -1.0, 1.0, | ||
| 78 | + 1.0, 1.0, 1.0, | ||
| 79 | + -1.0, 1.0, 1.0, | ||
| 80 | + // Back face | ||
| 81 | + -1.0, -1.0, -1.0, | ||
| 82 | + -1.0, 1.0, -1.0, | ||
| 83 | + 1.0, 1.0, -1.0, | ||
| 84 | + 1.0, -1.0, -1.0, | ||
| 85 | + // Top face | ||
| 86 | + -1.0, 1.0, -1.0, | ||
| 87 | + -1.0, 1.0, 1.0, | ||
| 88 | + 1.0, 1.0, 1.0, | ||
| 89 | + 1.0, 1.0, -1.0, | ||
| 90 | + // Bottom face | ||
| 91 | + -1.0, -1.0, -1.0, | ||
| 92 | + 1.0, -1.0, -1.0, | ||
| 93 | + 1.0, -1.0, 1.0, | ||
| 94 | + -1.0, -1.0, 1.0, | ||
| 95 | + // Right face | ||
| 96 | + 1.0, -1.0, -1.0, | ||
| 97 | + 1.0, 1.0, -1.0, | ||
| 98 | + 1.0, 1.0, 1.0, | ||
| 99 | + 1.0, -1.0, 1.0, | ||
| 100 | + // Left face | ||
| 101 | + -1.0, -1.0, -1.0, | ||
| 102 | + -1.0, -1.0, 1.0, | ||
| 103 | + -1.0, 1.0, 1.0, | ||
| 104 | + -1.0, 1.0, -1.0 | ||
| 105 | + ]; | ||
| 106 | + gl.bufferData( | ||
| 107 | + gl.ARRAY_BUFFER, | ||
| 108 | + new Float32Array(verts), | ||
| 109 | + gl.STATIC_DRAW); | ||
| 110 | + | ||
| 111 | + var texCoordBuffer = gl.createBuffer(); | ||
| 112 | + gl.bindBuffer(gl.ARRAY_BUFFER, texCoordBuffer); | ||
| 113 | + var textureCoords = [ | ||
| 114 | + // Front face | ||
| 115 | + 0.0, 0.0, | ||
| 116 | + 1.0, 0.0, | ||
| 117 | + 1.0, 1.0, | ||
| 118 | + 0.0, 1.0, | ||
| 119 | + | ||
| 120 | + // Back face | ||
| 121 | + 1.0, 0.0, | ||
| 122 | + 1.0, 1.0, | ||
| 123 | + 0.0, 1.0, | ||
| 124 | + 0.0, 0.0, | ||
| 125 | + | ||
| 126 | + // Top face | ||
| 127 | + 0.0, 1.0, | ||
| 128 | + 0.0, 0.0, | ||
| 129 | + 1.0, 0.0, | ||
| 130 | + 1.0, 1.0, | ||
| 131 | + | ||
| 132 | + // Bottom face | ||
| 133 | + 1.0, 1.0, | ||
| 134 | + 0.0, 1.0, | ||
| 135 | + 0.0, 0.0, | ||
| 136 | + 1.0, 0.0, | ||
| 137 | + | ||
| 138 | + // Right face | ||
| 139 | + 1.0, 0.0, | ||
| 140 | + 1.0, 1.0, | ||
| 141 | + 0.0, 1.0, | ||
| 142 | + 0.0, 0.0, | ||
| 143 | + | ||
| 144 | + // Left face | ||
| 145 | + 0.0, 0.0, | ||
| 146 | + 1.0, 0.0, | ||
| 147 | + 1.0, 1.0, | ||
| 148 | + 0.0, 1.0, | ||
| 149 | + ]; | ||
| 150 | + gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(textureCoords), gl.STATIC_DRAW); | ||
| 151 | + | ||
| 152 | + // Index data (defines the triangles to be drawn) | ||
| 153 | + var cubeIndexBuffer = gl.createBuffer(); | ||
| 154 | + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, cubeIndexBuffer); | ||
| 155 | + var cubeIndices = [ | ||
| 156 | + 0, 1, 2, 0, 2, 3, // Front face | ||
| 157 | + 4, 5, 6, 4, 6, 7, // Back face | ||
| 158 | + 8, 9, 10, 8, 10, 11, // Top face | ||
| 159 | + 12, 13, 14, 12, 14, 15, // Bottom face | ||
| 160 | + 16, 17, 18, 16, 18, 19, // Right face | ||
| 161 | + 20, 21, 22, 20, 22, 23 // Left face | ||
| 162 | + ]; | ||
| 163 | + gl.bufferData( | ||
| 164 | + gl.ELEMENT_ARRAY_BUFFER, | ||
| 165 | + new Uint16Array(cubeIndices), | ||
| 166 | + gl.STATIC_DRAW); | ||
| 167 | + var cube = { | ||
| 168 | + buffer:vertexBuffer, | ||
| 169 | + texCoordBuffer:texCoordBuffer, | ||
| 170 | + indices:cubeIndexBuffer, | ||
| 171 | + vertSize:3, | ||
| 172 | + nVerts:24, | ||
| 173 | + texCoordSize:2, | ||
| 174 | + nTexCoords: 24, | ||
| 175 | + nIndices:36, | ||
| 176 | + primtype:gl.TRIANGLES}; | ||
| 177 | + | ||
| 178 | + return cube; | ||
| 179 | +} | ||
| 180 | + | ||
| 181 | +function initMatrices(canvas) { | ||
| 182 | + modelViewMatrix = mat4.create(); | ||
| 183 | + mat4.translate( | ||
| 184 | + modelViewMatrix, modelViewMatrix, [0, 0, -4.6]); | ||
| 185 | + | ||
| 186 | + // Create a project matrix with 45 degree field of view | ||
| 187 | + projectionMatrix = mat4.create(); | ||
| 188 | + mat4.perspective(projectionMatrix, Math.PI / 4, | ||
| 189 | + canvas.width / canvas.height, 1, 10000); | ||
| 190 | + | ||
| 191 | + rotationAxis = vec3.create(); | ||
| 192 | + vec3.normalize(rotationAxis, [1, 1, 1]); | ||
| 193 | +} | ||
| 194 | + | ||
| 195 | +function createShader(gl, id, type) { | ||
| 196 | + var shader; | ||
| 197 | + var str = document.getElementById(id).text; | ||
| 198 | + if (type == "fragment") { | ||
| 199 | + shader = gl.createShader(gl.FRAGMENT_SHADER); | ||
| 200 | + } else if (type == "vertex") { | ||
| 201 | + shader = gl.createShader(gl.VERTEX_SHADER); | ||
| 202 | + } else { | ||
| 203 | + return null; | ||
| 204 | + } | ||
| 205 | + | ||
| 206 | + gl.shaderSource(shader, str); | ||
| 207 | + gl.compileShader(shader); | ||
| 208 | + | ||
| 209 | + if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) { | ||
| 210 | + alert(gl.getShaderInfoLog(shader)); | ||
| 211 | + return null; | ||
| 212 | + } | ||
| 213 | + | ||
| 214 | + return shader; | ||
| 215 | +} | ||
| 216 | + | ||
| 217 | +function initShader(gl, vertex, fragment) { | ||
| 218 | + // load and compile the fragment and vertex shader | ||
| 219 | + var fragmentShader = createShader(gl, fragment, "fragment"); | ||
| 220 | + var vertexShader = createShader(gl, vertex, "vertex"); | ||
| 221 | + | ||
| 222 | + // link them together into a new program | ||
| 223 | + shaderProgram = gl.createProgram(); | ||
| 224 | + gl.attachShader(shaderProgram, vertexShader); | ||
| 225 | + gl.attachShader(shaderProgram, fragmentShader); | ||
| 226 | + gl.linkProgram(shaderProgram); | ||
| 227 | + | ||
| 228 | + // get pointers to the shader params | ||
| 229 | + shaderVertexPositionAttribute = gl.getAttribLocation( | ||
| 230 | + shaderProgram, "vertexPos"); | ||
| 231 | + gl.enableVertexAttribArray(shaderVertexPositionAttribute); | ||
| 232 | + shaderTexCoordAttribute = gl.getAttribLocation( | ||
| 233 | + shaderProgram, "texCoord"); | ||
| 234 | + gl.enableVertexAttribArray(shaderTexCoordAttribute); | ||
| 235 | + | ||
| 236 | + shaderProjectionMatrixUniform = gl.getUniformLocation( | ||
| 237 | + shaderProgram, "projectionMatrix"); | ||
| 238 | + shaderModelViewMatrixUniform = gl.getUniformLocation( | ||
| 239 | + shaderProgram, "modelViewMatrix"); | ||
| 240 | + shaderSamplerUniform = gl.getUniformLocation( | ||
| 241 | + shaderProgram, "uSampler"); | ||
| 242 | + | ||
| 243 | + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { | ||
| 244 | + alert("Could not initialise shaders"); | ||
| 245 | + } | ||
| 246 | +} | ||
| 247 | + | ||
| 248 | +function draw(gl, obj) { | ||
| 249 | + // clear the background (transparent) | ||
| 250 | + gl.clearColor(0.0, 0.0, 0.0, 0.0); | ||
| 251 | + // // clear the background (black) | ||
| 252 | + // gl.clearColor(0.0, 0.0, 0.0, 1.0); | ||
| 253 | + gl.enable(gl.DEPTH_TEST); | ||
| 254 | + gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT); | ||
| 255 | + | ||
| 256 | + // set the shader to use | ||
| 257 | + gl.useProgram(shaderProgram); | ||
| 258 | + | ||
| 259 | + // connect up the shader parameters: vertex position, | ||
| 260 | + // color, and projection/model matrices | ||
| 261 | + // set up the buffers | ||
| 262 | + gl.bindBuffer(gl.ARRAY_BUFFER, obj.buffer); | ||
| 263 | + gl.vertexAttribPointer( | ||
| 264 | + shaderVertexPositionAttribute, | ||
| 265 | + obj.vertSize, | ||
| 266 | + gl.FLOAT, | ||
| 267 | + false, 0, 0); | ||
| 268 | + gl.bindBuffer(gl.ARRAY_BUFFER, obj.texCoordBuffer); | ||
| 269 | + gl.vertexAttribPointer( | ||
| 270 | + shaderTexCoordAttribute, | ||
| 271 | + obj.texCoordSize, | ||
| 272 | + gl.FLOAT, | ||
| 273 | + false, 0, 0); | ||
| 274 | + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, obj.indices); | ||
| 275 | + gl.uniformMatrix4fv(shaderProjectionMatrixUniform, false, | ||
| 276 | + projectionMatrix); | ||
| 277 | + gl.uniformMatrix4fv(shaderModelViewMatrixUniform, false, | ||
| 278 | + modelViewMatrix); | ||
| 279 | + | ||
| 280 | + gl.activeTexture(gl.TEXTURE0); | ||
| 281 | + gl.bindTexture(gl.TEXTURE_2D, webGLTexture); | ||
| 282 | + gl.uniform1i(shaderSamplerUniform, 0); | ||
| 283 | + | ||
| 284 | + // draw the object | ||
| 285 | + gl.drawElements( | ||
| 286 | + obj.primtype, obj.nIndices, gl.UNSIGNED_SHORT, 0); | ||
| 287 | +} | ||
| 288 | + | ||
| 289 | +function animate() { | ||
| 290 | + var now = Date.now(); | ||
| 291 | + var deltat = now - currentTime; | ||
| 292 | + currentTime = now; | ||
| 293 | + var fract = deltat / duration; | ||
| 294 | + var angle = Math.PI * 2 * fract; | ||
| 295 | + mat4.rotate( | ||
| 296 | + modelViewMatrix, | ||
| 297 | + modelViewMatrix, | ||
| 298 | + angle, | ||
| 299 | + rotationAxis); | ||
| 300 | +} | ||
| 301 | + | ||
| 302 | +function run(gl, cube) { | ||
| 303 | + requestAnimationFrame(function() { run(gl, cube); }); | ||
| 304 | + if (okToRun) { | ||
| 305 | + draw(gl, cube); | ||
| 306 | + animate(); | ||
| 307 | + } | ||
| 308 | +} | ||
| 309 | + | ||
| 310 | +function startGl() { | ||
| 311 | + // Get A WebGL context | ||
| 312 | + var canvas = document.getElementById("cube"); | ||
| 313 | + var gl = initWebGL(canvas); | ||
| 314 | + var obj = createCube(gl); | ||
| 315 | + | ||
| 316 | + initViewport(gl, canvas); | ||
| 317 | + initMatrices(canvas); | ||
| 318 | + initShader( | ||
| 319 | + gl, | ||
| 320 | + "texture-vertex-shader", | ||
| 321 | + "texture-fragment-shader"); | ||
| 322 | + initTexture(gl); | ||
| 323 | + run(gl, obj); | ||
| 324 | +} | ||
| 325 | +/* vim: set ts=4 sw=4: */ |
Please
register
or
login
to post a comment