Commit ecd186535fd6106312c1b636e5ac3a40b1eda1f3

Authored by Georg Hopp
1 parent 9582c312

More improvement in style and separation of js and html.

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