your browser doesn't support html5,Html5Lesson10QQ.html

Html5 Lesson 10 (Canvas 3D)

header {

background: #FFCC99;

color: white;

-moz-box-shadow: 0 2px 8px -3px rgba(0, 0, 0, .5), 0 1.4em 2em -0.7em rgba(255, 255, 255, .2) inset;

-webkit-box-shadow: 0 2px 8px -3px rgba(0, 0, 0, .5), 0 1.4em 2em -0.7em rgba(255, 255, 255, .2) inset;

box-shadow: 0 2px 8px -3px rgba(0, 0, 0, .5), 0 1.4em 2em -0.7em rgba(255, 255, 255, .2) inset;

text-shadow: 1px 1px 1px #444;

}

header h1, header h2 {

display: inline-block;

padding: 12px 15px;

font-size: 105%;

line-height: 1;

margin: 0;

}

header h1 {

background: #FF9966;

}

.arrow-right {

display: inline-block;

width: 0;

height: 0;

border-top: 18px solid transparent;

border-bottom: 18px solid transparent;

border-left: 18px solid #FF9966;

margin-bottom: -11px;

}

#drag-zone {

list-style: none;

float: left;

}

#drag-zone li * {

border: 4px solid #888;

display: block;

margin: 10px 0;

}

#drag-zone, #drop-zone, #drop-data {

width: 20%;

}

#drop-zone, #drop-data {

padding: 40px;

border: 5px solid #888;

float: right;

height: 240px;

overflow: auto;

}

#drop-zone.hovering {

border: 5px solid #aaa;

background-color: rgba(255, 0, 0, 0.199219);

}

#drop-data {

background-color: #eee;

font-family: Monospace;

-ms-word-wrap: break-word;

word-wrap: break-word;

}

.datatypes {

font-weight: bold;

}

.draggable-text {

padding: 5px;

}

canvas {

border: 2px solid black;

-moz-box-shadow: black 2px 2px 2px;

background-color: black;

}

varying highp vec2 vTextureCoord;

uniform sampler2D uSampler;

void main(void) {

gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.s, vTextureCoord.t));

}

attribute highp vec3 aVertexNormal;

attribute highp vec3 aVertexPosition;

attribute highp vec2 aTextureCoord;

uniform highp mat4 uMVMatrix;

uniform highp mat4 uPMatrix;

varying highp vec2 vTextureCoord;

void main(void) {

gl_Position = uPMatrix * uMVMatrix * vec4(aVertexPosition, 1.0);

vTextureCoord = aTextureCoord;

}

3D画布

WebGl绘制

Your browser doesn't appear to support the HTML5 <canvas> element.

var canvas;

var gl;

var vertexPositionAttribute;

var verticesBuffer;

var verticesIndexBuffer;

var textureCoordAttribute;

var verticesTextureCoordBuffer;

var vertexNormalAttribute;

var verticesNormalBuffer;

var lastCubeUpdateTime = 0;

var mvMatrix;

var shaderProgram;

var perspectiveMatrix;

var xrotation = 0;

var yrotation = 0;

var zrotation = 0;

var lastUpdateTime = 0;

var cubeImage;

var cubeTexture;

start();

//

// start

//

// Called when the canvas is created to get the ball rolling.

//

function start() {

canvas = document.getElementById("glcanvas");

initWebGL(); // Initialize the GL context

// Only continue if WebGL is available and working

if (gl) {

gl.clearColor(0.0, 0.0, 0.0, 1.0); // Clear to black, fully opaque

gl.clearDepth(1.0); // Clear everything

gl.enable(gl.DEPTH_TEST); // Enable depth testing

gl.depthFunc(gl.LEQUAL); // Near things obscure far things

// Initialize the shaders; this is where all the lighting for the

// vertices and so forth is established.

initShaders();

// Here's where we call the routine that builds all the objects

// we'll be drawing.

initBuffers();

// Next, load and set up the textures we'll be using.

initTextures();

// Set up to draw the scene periodically.

setInterval(drawScene, 15);

}

}

//

// initWebGL

//

// Initialize WebGL, returning the GL context or null if

// WebGL isn't available or could not be initialized.

//

function initWebGL() {

gl = null;

try {

gl = canvas.getContext("experimental-webgl");

}

catch(e) {

}

// If we don't have a GL context, give up now

if (!gl) {

alert("Unable to initialize WebGL. Your browser may not support it.");

}

}

//

// initBuffers

//

// Initialize the buffers we'll need. For this demo, we just have

// one object -- a simple two-dimensional cube.

//

function initBuffers() {

// Create a buffer for the cube's vertices.

verticesBuffer = gl.createBuffer();

// Select the cubeVerticesBuffer as the one to apply vertex

// operations to from here out.

gl.bindBuffer(gl.ARRAY_BUFFER, verticesBuffer);

// Now create an array of vertices for the cube.

var vertices = [

1.0, 1.0, -1.0,

-1.0, 1.0, -1.0,

-1.0, 1.0, 1.0,

1.0, 1.0, 1.0,

1.0, -1.0, 1.0,

-1.0, -1.0, 1.0,

-1.0, -1.0, -1.0,

1.0, -1.0, -1.0,

1.0, 1.0, 1.0,

-1.0, 1.0, 1.0,

-1.0, -1.0, 1.0,

1.0, -1.0, 1.0,

1.0, -1.0, -1.0,

-1.0, -1.0, -1.0,

-1.0, 1.0, -1.0,

1.0, 1.0, -1.0,

-1.0, 1.0, 1.0,

-1.0, 1.0, -1.0,

-1.0, -1.0, -1.0,

-1.0, -1.0, 1.0,

1.0, 1.0, -1.0,

1.0, 1.0, 1.0,

1.0, -1.0, 1.0,

1.0, -1.0, -1.0

];

// Now pass the list of vertices into WebGL to build the shape. We

// do this by creating a Float32Array from the JavaScript array,

// then use it to fill the current vertex buffer.

gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(vertices), gl.STATIC_DRAW);

// Build the element array buffer; this specifies the indices

// into the vertex array for each face's vertices.

verticesIndexBuffer = gl.createBuffer();

gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, verticesIndexBuffer);

var vertexIndices = [

0, 1, 2, 0, 2, 3, // front

4, 5, 6, 4, 6, 7, // back

8, 9, 10, 8, 10, 11, // top

12, 13, 14, 12, 14, 15, // bottom

16, 17, 18, 16, 18, 19, // right

20, 21, 22, 20, 22, 23 // left

];

gl.bufferData(gl.ELEMENT_ARRAY_BUFFER,

new Uint16Array(vertexIndices), gl.STATIC_DRAW);

verticesTextureCoordBuffer = gl.createBuffer();

gl.bindBuffer(gl.ARRAY_BUFFER, verticesTextureCoordBuffer);

var textureCoordinates = [

// Front

0.0, 0.0,

1.0, 0.0,

1.0, 1.0,

0.0, 1.0,

// Back

0.0, 0.0,

1.0, 0.0,

1.0, 1.0,

0.0, 1.0,

// Top

0.0, 0.0,

1.0, 0.0,

1.0, 1.0,

0.0, 1.0,

// Bottom

0.0, 0.0,

1.0, 0.0,

1.0, 1.0,

0.0, 1.0,

// Right

0.0, 0.0,

1.0, 0.0,

1.0, 1.0,

0.0, 1.0,

// Left

0.0, 0.0,

1.0, 0.0,

1.0, 1.0,

0.0, 1.0

];

gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(textureCoordinates),

gl.STATIC_DRAW);

verticesNormalBuffer = gl.createBuffer();

gl.bindBuffer(gl.ARRAY_BUFFER, verticesNormalBuffer);

var vertexNormals = [

// Front

0.0, 0.0, 1.0,

0.0, 0.0, 1.0,

0.0, 0.0, 1.0,

0.0, 0.0, 1.0,

// Back

0.0, 0.0, -1.0,

0.0, 0.0, -1.0,

0.0, 0.0, -1.0,

0.0, 0.0, -1.0,

// Top

0.0, 1.0, 0.0,

0.0, 1.0, 0.0,

0.0, 1.0, 0.0,

0.0, 1.0, 0.0,

// Bottom

0.0, -1.0, 0.0,

0.0, -1.0, 0.0,

0.0, -1.0, 0.0,

0.0, -1.0, 0.0,

// Right

1.0, 0.0, 0.0,

1.0, 0.0, 0.0,

1.0, 0.0, 0.0,

1.0, 0.0, 0.0,

// Left

-1.0, 0.0, 0.0,

-1.0, 0.0, 0.0,

-1.0, 0.0, 0.0,

-1.0, 0.0, 0.0

];

gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(vertexNormals),

gl.STATIC_DRAW);

}

//

// initTextures

//

// Initialize the textures we'll be using, then initiate a load of

// the texture images. The handleTextureLoaded() callback will finish

// the job; it gets called each time a texture finishes loading.

//

function initTextures() {

cubeTexture = gl.createTexture();

cubeImage = new Image();

cubeImage.crossOrigin = "";

cubeImage.onload = function() { handleTextureLoaded(cubeImage, cubeTexture); }

cubeImage.src = "http://derekliu.blog.51cto.com/album/4479510/133601721149.png";

}

function handleTextureLoaded(image, texture) {

gl.bindTexture(gl.TEXTURE_2D, texture);

gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, image);

gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);

gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR_MIPMAP_NEAREST);

gl.generateMipmap(gl.TEXTURE_2D);

gl.bindTexture(gl.TEXTURE_2D, null);

}

//

// drawScene

//

// Draw the scene.

//

function drawScene() {

// Clear the canvas before we start drawing on it.

gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);

// Establish the perspective with which we want to view the

// scene. Our field of view is 45 degrees, with a width/height

// ratio of 640:480, and we only want to see objects between 0.1 units

// and 100 units away from the camera.

perspectiveMatrix = makePerspective(45, 640.0/480.0, 0.1, 100.0);

// Set the drawing position to the "identity" point, which is

// the center of the scene.

loadIdentity();

gl.bindBuffer(gl.ARRAY_BUFFER, verticesBuffer);

gl.vertexAttribPointer(vertexPositionAttribute, 3, gl.FLOAT, false, 0, 0);

gl.bindBuffer(gl.ARRAY_BUFFER, verticesTextureCoordBuffer);

gl.vertexAttribPointer(textureCoordAttribute, 2, gl.FLOAT, false, 0, 0);

gl.bindBuffer(gl.ARRAY_BUFFER, verticesNormalBuffer);

gl.vertexAttribPointer(vertexNormalAttribute, 3, gl.FLOAT, false, 0, 0);

gl.activeTexture(gl.TEXTURE0);

gl.bindTexture(gl.TEXTURE_2D, cubeTexture);

gl.uniform1i(gl.getUniformLocation(shaderProgram, "uSampler"), 0);

gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, verticesIndexBuffer);

mvPushMatrix();

mvTranslate([0.0, 0.0, -6.0]);

mvRotate(xrotation, [1, 0, 0]);

mvRotate(yrotation, [0, 1, 0]);

mvRotate(zrotation, [0, 0, 1]);

setMatrixUniforms();

gl.drawElements(gl.TRIANGLES, 36, gl.UNSIGNED_SHORT, 0);

mvPopMatrix();

// Update the rotation for the next draw, if it's time to do so.

var currentTime = (new Date).getTime();

if (lastUpdateTime) {

var delta = currentTime - lastUpdateTime;

xrotation += (30 * delta) / 200.0;

yrotation += (20 * delta) / 200.0;

zrotation += (40 * delta) / 200.0;

}

lastUpdateTime = currentTime;

}

//

// initShaders

//

// Initialize the shaders, so WebGL knows how to light our scene.

//

function initShaders() {

var fragmentShader = getShader(gl, "shader-fs");

var vertexShader = getShader(gl, "shader-vs");

// Create the shader program

shaderProgram = gl.createProgram();

gl.attachShader(shaderProgram, vertexShader);

gl.attachShader(shaderProgram, fragmentShader);

gl.linkProgram(shaderProgram);

// If creating the shader program failed, alert

if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) {

alert("Unable to initialize the shader program.");

}

gl.useProgram(shaderProgram);

vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition");

gl.enableVertexAttribArray(vertexPositionAttribute);

textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord");

gl.enableVertexAttribArray(textureCoordAttribute);

vertexNormalAttribute = gl.getAttribLocation(shaderProgram, "aVertexNormal");

gl.enableVertexAttribArray(vertexNormalAttribute);

}

//

// getShader

//

// Loads a shader program by scouring the current document,

// looking for a script with the specified ID.

//

function getShader(gl, id) {

var shaderScript = document.getElementById(id);

// Didn't find an element with the specified ID; abort.

if (!shaderScript) {

return null;

}

// Walk through the source element's children, building the

// shader source string.

var theSource = "";

var currentChild = shaderScript.firstChild;

while(currentChild) {

if (currentChild.nodeType == 3) {

theSource += currentChild.textContent;

}

currentChild = currentChild.nextSibling;

}

// Now figure out what type of shader script we have,

// based on its MIME type.

var shader;

if (shaderScript.type == "x-shader/x-fragment") {

shader = gl.createShader(gl.FRAGMENT_SHADER);

} else if (shaderScript.type == "x-shader/x-vertex") {

shader = gl.createShader(gl.VERTEX_SHADER);

} else {

return null; // Unknown shader type

}

// Send the source to the shader object

gl.shaderSource(shader, theSource);

// Compile the shader program

gl.compileShader(shader);

// See if it compiled successfully

if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {

alert("An error occurred compiling the shaders: " + gl.getShaderInfoLog(shader));

return null;

}

return shader;

}

//

// Matrix utility functions

//

function loadIdentity() {

mvMatrix = Matrix.I(4);

}

function multMatrix(m) {

mvMatrix = mvMatrix.x(m);

}

function mvTranslate(v) {

multMatrix(Matrix.Translation($V([v[0], v[1], v[2]])).ensure4x4());

}

function setMatrixUniforms() {

var pUniform = gl.getUniformLocation(shaderProgram, "uPMatrix");

gl.uniformMatrix4fv(pUniform, false, new Float32Array(perspectiveMatrix.flatten()));

var mvUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix");

gl.uniformMatrix4fv(mvUniform, false, new Float32Array(mvMatrix.flatten()));

}

var mvMatrixStack = [];

function mvPushMatrix(m) {

if (m) {

mvMatrixStack.push(m.dup());

mvMatrix = m.dup();

} else {

mvMatrixStack.push(mvMatrix.dup());

}

}

function mvPopMatrix() {

if (!mvMatrixStack.length) {

throw("Can't pop from an empty matrix stack.");

}

mvMatrix = mvMatrixStack.pop();

return mvMatrix;

}

function mvRotate(angle, v) {

var inRadians = angle * Math.PI / 180.0;

var m = Matrix.Rotation(inRadians, $V([v[0], v[1], v[2]])).ensure4x4();

multMatrix(m);

}

一键复制

编辑

Web IDE

原始数据

按行查看

历史

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值