commit
890d279619
7 changed files with 884 additions and 0 deletions
-
2.gitignore
-
290cube.html
-
29gl-matrix-min.js
-
BINgravatar-256.jpg
-
17index.html
-
183square.html
-
363texture.html
@ -0,0 +1,2 @@ |
|||
toji* |
|||
Programming* |
|||
@ -0,0 +1,290 @@ |
|||
<html> |
|||
<head> |
|||
<title>First very simple WebGL example...</title> |
|||
|
|||
<script src="./gl-matrix-min.js" type="text/javascript"></script> |
|||
|
|||
<script type="text/javascript"> |
|||
var projectionMatrix, modelViewMatrix; |
|||
var rotationAxis; |
|||
var shaderProgram, shaderVertexPositionAttribute |
|||
var shaderVertexColorAttribute; |
|||
var shaderProjectionMatrixUniform, shaderModelViewMatrixUniform; |
|||
|
|||
var duration = 5000; // ms |
|||
var currentTime = Date.now(); |
|||
|
|||
function initWebGL(canvas) { |
|||
var gl = null; |
|||
var msg = "Your browser does not support WebGL, " + |
|||
"or it is not enabled by default."; |
|||
try { |
|||
gl = canvas.getContext("experimental-webgl"); |
|||
} |
|||
catch (e) { |
|||
msg = "Error creating WebGL Context!: " + e.toString(); |
|||
} |
|||
if (!gl) { |
|||
alert(msg); |
|||
throw new Error(msg); |
|||
} |
|||
|
|||
return gl; |
|||
} |
|||
|
|||
function initViewport(gl, canvas) { |
|||
gl.viewport(0, 0, canvas.width, canvas.height); |
|||
} |
|||
|
|||
// Create the vertex, color, and index data for a |
|||
// multicolored cube |
|||
function createCube(gl) { |
|||
// Vertex Data |
|||
var vertexBuffer; |
|||
vertexBuffer = gl.createBuffer(); |
|||
gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer); |
|||
var verts = [ |
|||
// Front face |
|||
-1.0, -1.0, 1.0, |
|||
1.0, -1.0, 1.0, |
|||
1.0, 1.0, 1.0, |
|||
-1.0, 1.0, 1.0, |
|||
// Back face |
|||
-1.0, -1.0, -1.0, |
|||
-1.0, 1.0, -1.0, |
|||
1.0, 1.0, -1.0, |
|||
1.0, -1.0, -1.0, |
|||
// Top face |
|||
-1.0, 1.0, -1.0, |
|||
-1.0, 1.0, 1.0, |
|||
1.0, 1.0, 1.0, |
|||
1.0, 1.0, -1.0, |
|||
// Bottom face |
|||
-1.0, -1.0, -1.0, |
|||
1.0, -1.0, -1.0, |
|||
1.0, -1.0, 1.0, |
|||
-1.0, -1.0, 1.0, |
|||
// Right face |
|||
1.0, -1.0, -1.0, |
|||
1.0, 1.0, -1.0, |
|||
1.0, 1.0, 1.0, |
|||
1.0, -1.0, 1.0, |
|||
// Left face |
|||
-1.0, -1.0, -1.0, |
|||
-1.0, -1.0, 1.0, |
|||
-1.0, 1.0, 1.0, |
|||
-1.0, 1.0, -1.0 |
|||
]; |
|||
gl.bufferData( |
|||
gl.ARRAY_BUFFER, |
|||
new Float32Array(verts), |
|||
gl.STATIC_DRAW); |
|||
// Color data |
|||
var colorBuffer = gl.createBuffer(); |
|||
gl.bindBuffer(gl.ARRAY_BUFFER, colorBuffer); |
|||
var faceColors = [ |
|||
[1.0, 0.0, 0.0, 1.0], // Front face |
|||
[0.0, 1.0, 0.0, 1.0], // Back face |
|||
[0.0, 0.0, 1.0, 1.0], // Top face |
|||
[1.0, 1.0, 0.0, 1.0], // Bottom face |
|||
[1.0, 0.0, 1.0, 1.0], // Right face |
|||
[0.0, 1.0, 1.0, 1.0] // Left face |
|||
]; |
|||
var vertexColors = []; |
|||
for (var i in faceColors) { |
|||
var color = faceColors[i]; |
|||
for (var j=0; j < 4; j++) { |
|||
vertexColors = vertexColors.concat(color); |
|||
} |
|||
} |
|||
gl.bufferData( |
|||
gl.ARRAY_BUFFER, |
|||
new Float32Array(vertexColors), |
|||
gl.STATIC_DRAW); |
|||
// Index data (defines the triangles to be drawn) |
|||
var cubeIndexBuffer = gl.createBuffer(); |
|||
gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, cubeIndexBuffer); |
|||
var cubeIndices = [ |
|||
0, 1, 2, 0, 2, 3, // Front face |
|||
4, 5, 6, 4, 6, 7, // Back face |
|||
8, 9, 10, 8, 10, 11, // Top face |
|||
12, 13, 14, 12, 14, 15, // Bottom face |
|||
16, 17, 18, 16, 18, 19, // Right face |
|||
20, 21, 22, 20, 22, 23 // Left face |
|||
]; |
|||
gl.bufferData( |
|||
gl.ELEMENT_ARRAY_BUFFER, |
|||
new Uint16Array(cubeIndices), |
|||
gl.STATIC_DRAW); |
|||
var cube = { |
|||
buffer:vertexBuffer, |
|||
colorBuffer:colorBuffer, |
|||
indices:cubeIndexBuffer, |
|||
vertSize:3, |
|||
nVerts:24, |
|||
colorSize:4, |
|||
nColors: 24, |
|||
nIndices:36, |
|||
primtype:gl.TRIANGLES}; |
|||
|
|||
return cube; |
|||
} |
|||
|
|||
function initMatrices(canvas) { |
|||
modelViewMatrix = mat4.create(); |
|||
mat4.translate( |
|||
modelViewMatrix, modelViewMatrix, [0, 0, -8]); |
|||
|
|||
// Create a project matrix with 45 degree field of view |
|||
projectionMatrix = mat4.create(); |
|||
mat4.perspective(projectionMatrix, Math.PI / 4, |
|||
canvas.width / canvas.height, 1, 10000); |
|||
|
|||
rotationAxis = vec3.create(); |
|||
vec3.normalize(rotationAxis, [1, 1, 1]); |
|||
} |
|||
|
|||
function createShader(gl, id, type) { |
|||
var shader; |
|||
var str = document.getElementById(id).text; |
|||
if (type == "fragment") { |
|||
shader = gl.createShader(gl.FRAGMENT_SHADER); |
|||
} else if (type == "vertex") { |
|||
shader = gl.createShader(gl.VERTEX_SHADER); |
|||
} else { |
|||
return null; |
|||
} |
|||
|
|||
gl.shaderSource(shader, str); |
|||
gl.compileShader(shader); |
|||
|
|||
if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) { |
|||
alert(gl.getShaderInfoLog(shader)); |
|||
return null; |
|||
} |
|||
|
|||
return shader; |
|||
} |
|||
|
|||
function initShader(gl, vertex, fragment) { |
|||
// load and compile the fragment and vertex shader |
|||
var fragmentShader = createShader(gl, fragment, "fragment"); |
|||
var vertexShader = createShader(gl, vertex, "vertex"); |
|||
|
|||
// link them together into a new program |
|||
shaderProgram = gl.createProgram(); |
|||
gl.attachShader(shaderProgram, vertexShader); |
|||
gl.attachShader(shaderProgram, fragmentShader); |
|||
gl.linkProgram(shaderProgram); |
|||
|
|||
// get pointers to the shader params |
|||
shaderVertexPositionAttribute = gl.getAttribLocation( |
|||
shaderProgram, "vertexPos"); |
|||
gl.enableVertexAttribArray(shaderVertexPositionAttribute); |
|||
shaderVertexColorAttribute = gl.getAttribLocation( |
|||
shaderProgram, "vertexColor"); |
|||
gl.enableVertexAttribArray(shaderVertexColorAttribute); |
|||
|
|||
shaderProjectionMatrixUniform = gl.getUniformLocation( |
|||
shaderProgram, "projectionMatrix"); |
|||
shaderModelViewMatrixUniform = gl.getUniformLocation( |
|||
shaderProgram, "modelViewMatrix"); |
|||
|
|||
if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { |
|||
alert("Could not initialise shaders"); |
|||
} |
|||
} |
|||
|
|||
function draw(gl, obj) { |
|||
// clear the background (transparent) |
|||
gl.clearColor(0.0, 0.0, 0.0, 0.0); |
|||
// // clear the background (black) |
|||
// gl.clearColor(0.0, 0.0, 0.0, 1.0); |
|||
gl.enable(gl.DEPTH_TEST); |
|||
gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT); |
|||
|
|||
// set the shader to use |
|||
gl.useProgram(shaderProgram); |
|||
|
|||
// connect up the shader parameters: vertex position, |
|||
// color, and projection/model matrices |
|||
// set up the buffers |
|||
gl.bindBuffer(gl.ARRAY_BUFFER, obj.buffer); |
|||
gl.vertexAttribPointer(shaderVertexPositionAttribute, |
|||
obj.vertSize, gl.FLOAT, false, 0, 0); |
|||
gl.bindBuffer(gl.ARRAY_BUFFER, obj.colorBuffer); |
|||
gl.vertexAttribPointer(shaderVertexColorAttribute, |
|||
obj.colorSize, gl.FLOAT, false, 0, 0); |
|||
gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, obj.indices); |
|||
gl.uniformMatrix4fv(shaderProjectionMatrixUniform, false, |
|||
projectionMatrix); |
|||
gl.uniformMatrix4fv(shaderModelViewMatrixUniform, false, |
|||
modelViewMatrix); |
|||
|
|||
// draw the object |
|||
gl.drawElements( |
|||
obj.primtype, obj.nIndices, gl.UNSIGNED_SHORT, 0); |
|||
} |
|||
|
|||
function animate() { |
|||
var now = Date.now(); |
|||
var deltat = now - currentTime; |
|||
currentTime = now; |
|||
var fract = deltat / duration; |
|||
var angle = Math.PI * 2 * fract; |
|||
mat4.rotate( |
|||
modelViewMatrix, modelViewMatrix, angle, rotationAxis); |
|||
} |
|||
|
|||
function run(gl, cube) { |
|||
requestAnimationFrame(function() { run(gl, cube); }); |
|||
draw(gl, cube); |
|||
animate(); |
|||
} |
|||
|
|||
function startGl() { |
|||
// Get A WebGL context |
|||
var canvas = document.getElementById("cube"); |
|||
var gl = initWebGL(canvas); |
|||
var obj = createCube(gl); |
|||
|
|||
initViewport(gl, canvas); |
|||
initMatrices(canvas); |
|||
initShader( |
|||
gl, |
|||
"cube-vertex-shader", |
|||
"cube-fragment-shader"); |
|||
run(gl, obj); |
|||
} |
|||
</script> |
|||
|
|||
<script id="cube-vertex-shader" type="x-shader/x-vertex"> |
|||
attribute vec3 vertexPos; |
|||
attribute vec4 vertexColor; |
|||
uniform mat4 modelViewMatrix; |
|||
uniform mat4 projectionMatrix; |
|||
varying vec4 vColor; |
|||
void main(void) { |
|||
// Return the transformed and projected vertex value |
|||
gl_Position = |
|||
projectionMatrix * modelViewMatrix * vec4(vertexPos, 1.0); |
|||
// Output the vertexColor in vColor |
|||
vColor = vertexColor; |
|||
} |
|||
</script> |
|||
|
|||
<script id="cube-fragment-shader" type="x-shader/x-fragment"> |
|||
precision mediump float; |
|||
varying vec4 vColor; |
|||
void main(void) { |
|||
// Return the pixel color: always output white |
|||
gl_FragColor = vColor; |
|||
} |
|||
</script> |
|||
</head> |
|||
|
|||
<body onLoad="startGl()"> |
|||
<canvas id="cube" width="200" height="200"></canvas> |
|||
</body> |
|||
</html> |
|||
<!-- vim: set ts=4 sw=4: --> |
|||
29
gl-matrix-min.js
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
|
After Width: 256 | Height: 256 | Size: 79 KiB |
@ -0,0 +1,17 @@ |
|||
<html> |
|||
<head> |
|||
<title> Oh my Gosh </title> |
|||
</head> |
|||
|
|||
<body> |
|||
<h1>Some WebGL tests</h1> |
|||
<hr> |
|||
<ul> |
|||
<li><a href="square.html">square</a></li> |
|||
<li><a href="cube.html">cube</a></li> |
|||
<li><a href="texture.html">texture</a></li> |
|||
</ul> |
|||
<hr> |
|||
</body> |
|||
</html> |
|||
<!-- vim: set ts=4 sw=4: --> |
|||
@ -0,0 +1,183 @@ |
|||
<html> |
|||
<head> |
|||
<title>First very simple WebGL example...</title> |
|||
|
|||
<script src="./gl-matrix-min.js" type="text/javascript"></script> |
|||
|
|||
<script type="text/javascript"> |
|||
var projectionMatrix, modelViewMatrix; |
|||
var shaderProgram, shaderVertexPositionAttribute; |
|||
var shaderProjectionMatrixUniform, shaderModelViewMatrixUniform; |
|||
|
|||
function initWebGL(canvas) { |
|||
var gl = null; |
|||
var msg = "Your browser does not support WebGL, " + |
|||
"or it is not enabled by default."; |
|||
try { |
|||
gl = canvas.getContext("experimental-webgl"); |
|||
} |
|||
catch (e) { |
|||
msg = "Error creating WebGL Context!: " + e.toString(); |
|||
} |
|||
if (!gl) { |
|||
alert(msg); |
|||
throw new Error(msg); |
|||
} |
|||
|
|||
return gl; |
|||
} |
|||
|
|||
function initViewport(gl, canvas) { |
|||
gl.viewport(0, 0, canvas.width, canvas.height); |
|||
} |
|||
|
|||
// Create the vertex data for a square to be drawn |
|||
function createSquare(gl) { |
|||
var vertexBuffer; |
|||
vertexBuffer = gl.createBuffer(); |
|||
gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer); |
|||
var verts = [ |
|||
.5, .5, 0.0, |
|||
-.5, .5, 0.0, |
|||
.5, -.5, 0.0, |
|||
-.5, -.5, 0.0 |
|||
]; |
|||
gl.bufferData( |
|||
gl.ARRAY_BUFFER, |
|||
new Float32Array(verts), |
|||
gl.STATIC_DRAW); |
|||
var square = { |
|||
buffer:vertexBuffer, |
|||
vertSize:3, |
|||
nVerts:4, |
|||
primtype:gl.TRIANGLE_STRIP}; |
|||
return square; |
|||
} |
|||
|
|||
function initMatrices(canvas) { |
|||
// Create a model view matrix with camera at 0, 0, −3.333 |
|||
modelViewMatrix = mat4.create(); |
|||
mat4.translate( |
|||
modelViewMatrix, modelViewMatrix, [0, 0, -3.333]); |
|||
|
|||
// Create a project matrix with 45 degree field of view |
|||
projectionMatrix = mat4.create(); |
|||
mat4.perspective(projectionMatrix, Math.PI / 4, |
|||
canvas.width / canvas.height, 1, 10000); |
|||
} |
|||
|
|||
function createShader(gl, id, type) { |
|||
var shader; |
|||
var str = document.getElementById(id).text; |
|||
if (type == "fragment") { |
|||
shader = gl.createShader(gl.FRAGMENT_SHADER); |
|||
} else if (type == "vertex") { |
|||
shader = gl.createShader(gl.VERTEX_SHADER); |
|||
} else { |
|||
return null; |
|||
} |
|||
|
|||
gl.shaderSource(shader, str); |
|||
gl.compileShader(shader); |
|||
|
|||
if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) { |
|||
alert(gl.getShaderInfoLog(shader)); |
|||
return null; |
|||
} |
|||
|
|||
return shader; |
|||
} |
|||
|
|||
function initShader(gl, vertex, fragment) { |
|||
// load and compile the fragment and vertex shader |
|||
var fragmentShader = createShader(gl, fragment, "fragment"); |
|||
var vertexShader = createShader(gl, vertex, "vertex"); |
|||
|
|||
// link them together into a new program |
|||
shaderProgram = gl.createProgram(); |
|||
gl.attachShader(shaderProgram, vertexShader); |
|||
gl.attachShader(shaderProgram, fragmentShader); |
|||
gl.linkProgram(shaderProgram); |
|||
|
|||
// get pointers to the shader params |
|||
shaderVertexPositionAttribute = gl.getAttribLocation( |
|||
shaderProgram, "vertexPos"); |
|||
gl.enableVertexAttribArray(shaderVertexPositionAttribute); |
|||
|
|||
shaderProjectionMatrixUniform = gl.getUniformLocation( |
|||
shaderProgram, "projectionMatrix"); |
|||
shaderModelViewMatrixUniform = gl.getUniformLocation( |
|||
shaderProgram, "modelViewMatrix"); |
|||
|
|||
if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { |
|||
alert("Could not initialise shaders"); |
|||
} |
|||
} |
|||
|
|||
function draw(gl, obj) { |
|||
// clear the background (with black) |
|||
gl.clearColor(0.0, 0.0, 0.0, 1.0); |
|||
gl.clear(gl.COLOR_BUFFER_BIT); |
|||
|
|||
// set the vertex buffer to be drawn |
|||
gl.bindBuffer(gl.ARRAY_BUFFER, obj.buffer); |
|||
|
|||
// set the shader to use |
|||
gl.useProgram(shaderProgram); |
|||
|
|||
// connect up the shader parameters: vertex position and |
|||
// projection/model matrices |
|||
gl.vertexAttribPointer( |
|||
shaderVertexPositionAttribute, |
|||
obj.vertSize, |
|||
gl.FLOAT, false, 0, 0); |
|||
gl.uniformMatrix4fv( |
|||
shaderProjectionMatrixUniform, |
|||
false, projectionMatrix); |
|||
gl.uniformMatrix4fv( |
|||
shaderModelViewMatrixUniform, false, modelViewMatrix); |
|||
|
|||
// draw the object |
|||
gl.drawArrays(obj.primtype, 0, obj.nVerts); |
|||
} |
|||
|
|||
function startGl() { |
|||
// Get A WebGL context |
|||
var canvas = document.getElementById("square"); |
|||
var gl = initWebGL(canvas); |
|||
var obj = createSquare(gl); |
|||
|
|||
initViewport(gl, canvas); |
|||
initMatrices(canvas); |
|||
initShader( |
|||
gl, |
|||
"square-vertex-shader", |
|||
"square-fragment-shader"); |
|||
draw(gl, obj); |
|||
} |
|||
</script> |
|||
|
|||
<script id="square-vertex-shader" type="x-shader/x-vertex"> |
|||
attribute vec3 vertexPos; |
|||
uniform mat4 modelViewMatrix; |
|||
uniform mat4 projectionMatrix; |
|||
void main(void) { |
|||
// Return the transformed and projected vertex value |
|||
gl_Position = |
|||
projectionMatrix * modelViewMatrix * vec4(vertexPos, 1.0); |
|||
} |
|||
</script> |
|||
|
|||
<script id="square-fragment-shader" type="x-shader/x-fragment"> |
|||
void main(void) { |
|||
// Return the pixel color: always output white |
|||
gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0); |
|||
} |
|||
</script> |
|||
</head> |
|||
|
|||
<body onLoad="startGl()"> |
|||
<canvas id="square" width="200" height="200"></canvas> |
|||
</body> |
|||
</html> |
|||
<!-- vim: set ts=4 sw=4: --> |
|||
@ -0,0 +1,363 @@ |
|||
<html> |
|||
<head> |
|||
<title>First very simple WebGL example...</title> |
|||
|
|||
<script src="./gl-matrix-min.js" type="text/javascript"></script> |
|||
|
|||
<script type="text/javascript"> |
|||
var projectionMatrix, modelViewMatrix; |
|||
var rotationAxis; |
|||
var shaderProgram, shaderVertexPositionAttribute |
|||
var shaderTexCoordAttribute, shaderSamplerUniform; |
|||
var shaderProjectionMatrixUniform, shaderModelViewMatrixUniform; |
|||
|
|||
var duration = 5000; // ms |
|||
var currentTime = Date.now(); |
|||
|
|||
var okToRun = false; |
|||
var webGLTexture; |
|||
|
|||
function handleTextureLoaded(gl, texture) { |
|||
gl.bindTexture(gl.TEXTURE_2D, texture); |
|||
gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, true); |
|||
gl.texImage2D( |
|||
gl.TEXTURE_2D, |
|||
0, |
|||
gl.RGBA, |
|||
gl.RGBA, |
|||
gl.UNSIGNED_BYTE, |
|||
texture.image); |
|||
gl.texParameteri( |
|||
gl.TEXTURE_2D, |
|||
gl.TEXTURE_MAG_FILTER, |
|||
gl.NEAREST); |
|||
gl.texParameteri( |
|||
gl.TEXTURE_2D, |
|||
gl.TEXTURE_MIN_FILTER, |
|||
gl.NEAREST); |
|||
gl.bindTexture(gl.TEXTURE_2D, null); |
|||
okToRun = true; |
|||
} |
|||
|
|||
function initTexture(gl) { |
|||
webGLTexture = gl.createTexture(); |
|||
webGLTexture.image = new Image(); |
|||
webGLTexture.image.onload = function () { |
|||
handleTextureLoaded(gl, webGLTexture) |
|||
} |
|||
//webGLTexture.image.src = "P3D/images/webgl-logo-256.jpg"; |
|||
webGLTexture.image.src = "gravatar-256.jpg"; |
|||
} |
|||
|
|||
function initWebGL(canvas) { |
|||
var gl = null; |
|||
var msg = "Your browser does not support WebGL, " + |
|||
"or it is not enabled by default."; |
|||
try { |
|||
gl = canvas.getContext("experimental-webgl"); |
|||
} |
|||
catch (e) { |
|||
msg = "Error creating WebGL Context!: " + e.toString(); |
|||
} |
|||
if (!gl) { |
|||
alert(msg); |
|||
throw new Error(msg); |
|||
} |
|||
|
|||
return gl; |
|||
} |
|||
|
|||
function initViewport(gl, canvas) { |
|||
gl.viewport(0, 0, canvas.width, canvas.height); |
|||
} |
|||
|
|||
// Create the vertex, color, and index data for a |
|||
// multicolored cube |
|||
function createCube(gl) { |
|||
// Vertex Data |
|||
var vertexBuffer; |
|||
vertexBuffer = gl.createBuffer(); |
|||
gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer); |
|||
var verts = [ |
|||
// Front face |
|||
-1.0, -1.0, 1.0, |
|||
1.0, -1.0, 1.0, |
|||
1.0, 1.0, 1.0, |
|||
-1.0, 1.0, 1.0, |
|||
// Back face |
|||
-1.0, -1.0, -1.0, |
|||
-1.0, 1.0, -1.0, |
|||
1.0, 1.0, -1.0, |
|||
1.0, -1.0, -1.0, |
|||
// Top face |
|||
-1.0, 1.0, -1.0, |
|||
-1.0, 1.0, 1.0, |
|||
1.0, 1.0, 1.0, |
|||
1.0, 1.0, -1.0, |
|||
// Bottom face |
|||
-1.0, -1.0, -1.0, |
|||
1.0, -1.0, -1.0, |
|||
1.0, -1.0, 1.0, |
|||
-1.0, -1.0, 1.0, |
|||
// Right face |
|||
1.0, -1.0, -1.0, |
|||
1.0, 1.0, -1.0, |
|||
1.0, 1.0, 1.0, |
|||
1.0, -1.0, 1.0, |
|||
// Left face |
|||
-1.0, -1.0, -1.0, |
|||
-1.0, -1.0, 1.0, |
|||
-1.0, 1.0, 1.0, |
|||
-1.0, 1.0, -1.0 |
|||
]; |
|||
gl.bufferData( |
|||
gl.ARRAY_BUFFER, |
|||
new Float32Array(verts), |
|||
gl.STATIC_DRAW); |
|||
|
|||
var texCoordBuffer = gl.createBuffer(); |
|||
gl.bindBuffer(gl.ARRAY_BUFFER, texCoordBuffer); |
|||
var textureCoords = [ |
|||
// Front face |
|||
0.0, 0.0, |
|||
1.0, 0.0, |
|||
1.0, 1.0, |
|||
0.0, 1.0, |
|||
|
|||
// Back face |
|||
1.0, 0.0, |
|||
1.0, 1.0, |
|||
0.0, 1.0, |
|||
0.0, 0.0, |
|||
|
|||
// Top face |
|||
0.0, 1.0, |
|||
0.0, 0.0, |
|||
1.0, 0.0, |
|||
1.0, 1.0, |
|||
|
|||
// Bottom face |
|||
1.0, 1.0, |
|||
0.0, 1.0, |
|||
0.0, 0.0, |
|||
1.0, 0.0, |
|||
|
|||
// Right face |
|||
1.0, 0.0, |
|||
1.0, 1.0, |
|||
0.0, 1.0, |
|||
0.0, 0.0, |
|||
|
|||
// Left face |
|||
0.0, 0.0, |
|||
1.0, 0.0, |
|||
1.0, 1.0, |
|||
0.0, 1.0, |
|||
]; |
|||
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(textureCoords), gl.STATIC_DRAW); |
|||
|
|||
// Index data (defines the triangles to be drawn) |
|||
var cubeIndexBuffer = gl.createBuffer(); |
|||
gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, cubeIndexBuffer); |
|||
var cubeIndices = [ |
|||
0, 1, 2, 0, 2, 3, // Front face |
|||
4, 5, 6, 4, 6, 7, // Back face |
|||
8, 9, 10, 8, 10, 11, // Top face |
|||
12, 13, 14, 12, 14, 15, // Bottom face |
|||
16, 17, 18, 16, 18, 19, // Right face |
|||
20, 21, 22, 20, 22, 23 // Left face |
|||
]; |
|||
gl.bufferData( |
|||
gl.ELEMENT_ARRAY_BUFFER, |
|||
new Uint16Array(cubeIndices), |
|||
gl.STATIC_DRAW); |
|||
var cube = { |
|||
buffer:vertexBuffer, |
|||
texCoordBuffer:texCoordBuffer, |
|||
indices:cubeIndexBuffer, |
|||
vertSize:3, |
|||
nVerts:24, |
|||
texCoordSize:2, |
|||
nTexCoords: 24, |
|||
nIndices:36, |
|||
primtype:gl.TRIANGLES}; |
|||
|
|||
return cube; |
|||
} |
|||
|
|||
function initMatrices(canvas) { |
|||
modelViewMatrix = mat4.create(); |
|||
mat4.translate( |
|||
modelViewMatrix, modelViewMatrix, [0, 0, -8]); |
|||
|
|||
// Create a project matrix with 45 degree field of view |
|||
projectionMatrix = mat4.create(); |
|||
mat4.perspective(projectionMatrix, Math.PI / 4, |
|||
canvas.width / canvas.height, 1, 10000); |
|||
|
|||
rotationAxis = vec3.create(); |
|||
vec3.normalize(rotationAxis, [1, 1, 1]); |
|||
} |
|||
|
|||
function createShader(gl, id, type) { |
|||
var shader; |
|||
var str = document.getElementById(id).text; |
|||
if (type == "fragment") { |
|||
shader = gl.createShader(gl.FRAGMENT_SHADER); |
|||
} else if (type == "vertex") { |
|||
shader = gl.createShader(gl.VERTEX_SHADER); |
|||
} else { |
|||
return null; |
|||
} |
|||
|
|||
gl.shaderSource(shader, str); |
|||
gl.compileShader(shader); |
|||
|
|||
if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) { |
|||
alert(gl.getShaderInfoLog(shader)); |
|||
return null; |
|||
} |
|||
|
|||
return shader; |
|||
} |
|||
|
|||
function initShader(gl, vertex, fragment) { |
|||
// load and compile the fragment and vertex shader |
|||
var fragmentShader = createShader(gl, fragment, "fragment"); |
|||
var vertexShader = createShader(gl, vertex, "vertex"); |
|||
|
|||
// link them together into a new program |
|||
shaderProgram = gl.createProgram(); |
|||
gl.attachShader(shaderProgram, vertexShader); |
|||
gl.attachShader(shaderProgram, fragmentShader); |
|||
gl.linkProgram(shaderProgram); |
|||
|
|||
// get pointers to the shader params |
|||
shaderVertexPositionAttribute = gl.getAttribLocation( |
|||
shaderProgram, "vertexPos"); |
|||
gl.enableVertexAttribArray(shaderVertexPositionAttribute); |
|||
shaderTexCoordAttribute = gl.getAttribLocation( |
|||
shaderProgram, "texCoord"); |
|||
gl.enableVertexAttribArray(shaderTexCoordAttribute); |
|||
|
|||
shaderProjectionMatrixUniform = gl.getUniformLocation( |
|||
shaderProgram, "projectionMatrix"); |
|||
shaderModelViewMatrixUniform = gl.getUniformLocation( |
|||
shaderProgram, "modelViewMatrix"); |
|||
shaderSamplerUniform = gl.getUniformLocation( |
|||
shaderProgram, "uSampler"); |
|||
|
|||
if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { |
|||
alert("Could not initialise shaders"); |
|||
} |
|||
} |
|||
|
|||
function draw(gl, obj) { |
|||
// clear the background (transparent) |
|||
gl.clearColor(0.0, 0.0, 0.0, 1.0); |
|||
// // clear the background (black) |
|||
// gl.clearColor(0.0, 0.0, 0.0, 1.0); |
|||
gl.enable(gl.DEPTH_TEST); |
|||
gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT); |
|||
|
|||
// set the shader to use |
|||
gl.useProgram(shaderProgram); |
|||
|
|||
// connect up the shader parameters: vertex position, |
|||
// color, and projection/model matrices |
|||
// set up the buffers |
|||
gl.bindBuffer(gl.ARRAY_BUFFER, obj.buffer); |
|||
gl.vertexAttribPointer( |
|||
shaderVertexPositionAttribute, |
|||
obj.vertSize, |
|||
gl.FLOAT, |
|||
false, 0, 0); |
|||
gl.bindBuffer(gl.ARRAY_BUFFER, obj.texCoordBuffer); |
|||
gl.vertexAttribPointer( |
|||
shaderTexCoordAttribute, |
|||
obj.texCoordSize, |
|||
gl.FLOAT, |
|||
false, 0, 0); |
|||
gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, obj.indices); |
|||
gl.uniformMatrix4fv(shaderProjectionMatrixUniform, false, |
|||
projectionMatrix); |
|||
gl.uniformMatrix4fv(shaderModelViewMatrixUniform, false, |
|||
modelViewMatrix); |
|||
|
|||
gl.activeTexture(gl.TEXTURE0); |
|||
gl.bindTexture(gl.TEXTURE_2D, webGLTexture); |
|||
gl.uniform1i(shaderSamplerUniform, 0); |
|||
|
|||
// draw the object |
|||
gl.drawElements( |
|||
obj.primtype, obj.nIndices, gl.UNSIGNED_SHORT, 0); |
|||
} |
|||
|
|||
function animate() { |
|||
var now = Date.now(); |
|||
var deltat = now - currentTime; |
|||
currentTime = now; |
|||
var fract = deltat / duration; |
|||
var angle = Math.PI * 2 * fract; |
|||
mat4.rotate( |
|||
modelViewMatrix, |
|||
modelViewMatrix, |
|||
angle, |
|||
rotationAxis); |
|||
} |
|||
|
|||
function run(gl, cube) { |
|||
requestAnimationFrame(function() { run(gl, cube); }); |
|||
if (okToRun) { |
|||
draw(gl, cube); |
|||
animate(); |
|||
} |
|||
} |
|||
|
|||
function startGl() { |
|||
// Get A WebGL context |
|||
var canvas = document.getElementById("cube"); |
|||
var gl = initWebGL(canvas); |
|||
var obj = createCube(gl); |
|||
|
|||
initViewport(gl, canvas); |
|||
initMatrices(canvas); |
|||
initShader( |
|||
gl, |
|||
"texture-vertex-shader", |
|||
"texture-fragment-shader"); |
|||
initTexture(gl); |
|||
run(gl, obj); |
|||
} |
|||
</script> |
|||
|
|||
<script id="texture-vertex-shader" type="x-shader/x-vertex"> |
|||
attribute vec3 vertexPos; |
|||
attribute vec2 texCoord; |
|||
uniform mat4 modelViewMatrix; |
|||
uniform mat4 projectionMatrix; |
|||
varying vec2 vTexCoord; |
|||
void main(void) { |
|||
// Return the transformed and projected vertex value |
|||
gl_Position = projectionMatrix * modelViewMatrix * vec4(vertexPos, 1.0); |
|||
// Output the texture coordinate in vTexCoord |
|||
vTexCoord = texCoord; |
|||
} |
|||
</script> |
|||
|
|||
<script id="texture-fragment-shader" type="x-shader/x-fragment"> |
|||
precision mediump float; |
|||
varying vec2 vTexCoord; |
|||
uniform sampler2D uSampler; |
|||
void main(void) { |
|||
// Return the pixel color: always output white |
|||
gl_FragColor = texture2D(uSampler, vec2(vTexCoord.s, vTexCoord.t)); |
|||
} |
|||
</script> |
|||
</head> |
|||
|
|||
<body onLoad="startGl()"> |
|||
<canvas id="cube" width="500" height="500"></canvas> |
|||
</body> |
|||
</html> |
|||
<!-- vim: set ts=4 sw=4: --> |
|||
Write
Preview
Loading…
Cancel
Save
Reference in new issue