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 | 1 | <html> |
| 2 | 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 | 8 | <script id="cube-vertex-shader" type="x-shader/x-vertex"> |
| 262 | 9 | attribute vec3 vertexPos; |
| ... | ... | @@ -281,10 +28,30 @@ |
| 281 | 28 | gl_FragColor = vColor; |
| 282 | 29 | } |
| 283 | 30 | </script> |
| 31 | + | |
| 32 | + <style> | |
| 33 | + .result_container { | |
| 34 | + height: 200px; | |
| 35 | + } | |
| 36 | + </style> | |
| 284 | 37 | </head> |
| 285 | 38 | |
| 286 | 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 | 55 | </body> |
| 289 | 56 | </html> |
| 290 | 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 | 1 | <html> |
| 2 | 2 | <head> |
| 3 | 3 | <title> Oh my Gosh </title> |
| 4 | + <link rel="stylesheet" href="main.css"> | |
| 4 | 5 | </head> |
| 5 | 6 | |
| 6 | 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 | 26 | </body> |
| 16 | 27 | </html> |
| 17 | 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 | 1 | <html> |
| 2 | 2 | <head> |
| 3 | 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 | 8 | <script id="square-vertex-shader" type="x-shader/x-vertex"> |
| 161 | 9 | attribute vec3 vertexPos; |
| ... | ... | @@ -174,10 +22,31 @@ |
| 174 | 22 | gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0); |
| 175 | 23 | } |
| 176 | 24 | </script> |
| 25 | + | |
| 26 | + <style> | |
| 27 | + .result_container { | |
| 28 | + height: 200px; | |
| 29 | + } | |
| 30 | + </style> | |
| 177 | 31 | </head> |
| 178 | 32 | |
| 179 | 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 | 50 | </body> |
| 182 | 51 | </html> |
| 183 | 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 | 1 | <html> |
| 2 | 2 | <head> |
| 3 | 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 | 8 | <script id="texture-vertex-shader" type="x-shader/x-vertex"> |
| 335 | 9 | attribute vec3 vertexPos; |
| ... | ... | @@ -355,60 +29,19 @@ |
| 355 | 29 | } |
| 356 | 30 | </script> |
| 357 | 31 | <style> |
| 358 | - * { | |
| 359 | - font-family: Verdana, sans-serif; | |
| 360 | - } | |
| 361 | - .gl { | |
| 362 | - position: absolute; | |
| 32 | + .texture { | |
| 363 | 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 | 35 | </style> |
| 406 | 36 | </head> |
| 407 | 37 | |
| 408 | 38 | <body onLoad="startGl()"> |
| 409 | 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 | 45 | <canvas id="cube" width="200", height="200"></canvas> |
| 413 | 46 | </div> |
| 414 | 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