<html>
<head>
<title>
旋转动画
</title>
<script type="text/javascript" src="./lib/webgl-debug.js"></script>
<script type="text/javascript" src="./lib/webgl-utils.js"></script>
<script type="text/javascript" src="./lib/cuon-utils.js"></script>
<script type="text/javascript" src="./lib/cuon-matrix.js"></script>
</head>
<body onload="main()">
<canvas id='canvas' width="800" height="800"></canvas>
<script type="text/javascript">
var VShader =
"attribute vec4 a_color;\n" +
"uniform mat4 u_rotate;\n" +
"varying vec4 v_color;\n" +
"attribute vec4 a_position;\n" +
"void main(){\n" +
"gl_Position=a_position*u_rotate;" +
"gl_PointSize=10.0;\n" +
"v_color=a_color;\n" +
"}"
var FShader =
"precision mediump float;\n" +
"varying vec4 v_color;\n" +
"void main(){\n" +
"gl_FragColor=v_color;\n" +
"}"
function main() {
var canvas = document.getElementById("canvas");
var gl = getWebGLContext(canvas);
if (!gl) {
console.log("获取webgl上下文失败")
return;
}
if (!initShaders(gl, VShader, FShader)) {
console.log("初始化着色器失败");
return;
}
var a_position = gl.getAttribLocation(gl.program, 'a_position')
if (a_position < 0) {
console.log("获取a_position变量地址失败")
return;
}
var a_color = gl.getAttribLocation(gl.program, 'a_color')
if (a_color < 0) {
console.log("获取a_color变量地址失败")
return;
}
var u_rotate = gl.getUniformLocation(gl.program, 'u_rotate')
if (u_rotate < 0) {
console.log("获取u_rotate变量地址失败")
return;
}
initVertexBuffer(gl, a_position, a_color, u_rotate);
var angle_step = 10
var tick = function() {
currentAngle = animate(currentAngle)
draw(currentAngle)
requestAnimationFrame(tick)
}
tick()
function draw(currentAngle) {
var rotateMat = new Matrix4();
rotateMat.setRotate(currentAngle, 0, 0);
gl.uniformMatrix4fv(u_rotate, false, rotateMat.elements);
gl.clearColor(0, 0, 0, 1)
gl.clear(gl.COLOR_BUFFER_BIT)
gl.drawArrays(gl.TRIANGLES, 0, 3)
}
var currentAngle = 0;
var last_time = Date.now();
function animate(currentAngle) {
var now = Date.now();
var time_length = now - last_time;
last_time = now;
var newAngle = currentAngle + (angle_step * time_length) / 1000
return newAngle %= 360
}
}
function initVertexBuffer(gl, a_position, a_color, u_rotate) {
var vertexs = new Float32Array([
1.0, 0, 0.0, 1, 0, 0, 1, -1.0, 0, 0.0, 0, 1, 0, 1,
0, 1.0, 0.0, 0, 0, 1, 1
])
var fsize = vertexs.BYTES_PER_ELEMENT;
var vextexBuffer = gl.createBuffer();
if (!vextexBuffer) {
console.log("创建缓冲区失败")
return;
}
gl.bindBuffer(gl.ARRAY_BUFFER, vextexBuffer);
gl.bufferData(gl.ARRAY_BUFFER, vertexs, gl.STATIC_DRAW);
gl.vertexAttribPointer(a_position, 3, gl.FLOAT, false, fsize * 7, 0);
gl.enableVertexAttribArray(a_position)
gl.vertexAttribPointer(a_color, 4, gl.FLOAT, false, fsize * 7, fsize * 3);
gl.enableVertexAttribArray(a_color)
}
</script>
</body>
</html>
