目录
shader的创建与绑定
- demo.html
<!doctype html>
<html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
</head>
<body>
<canvas id="myCanvas" width="400" height="400"></canvas>
<!-- 矩阵变换用 -->
<script type="text/javascript" src="./matrix.js"></script>
<script type="text/javascript" src="./demo.js"></script>
</body>
</html>
- demo.js
var canvas = document.getElementById('myCanvas')//获取canvas
var gl = canvas.getContext('webgl')//获取上下文
var VSHADER_SOURCE,FSHADER_SOURCE//定义顶点、片元源代码
var program = gl.createProgram()//创建webgl程序
var vertexShader, fragmentShader
//创建着色器(gl上下文、着色器源码,着色器类型)
function createShader(gl, sourceCode, type) {
// create shader
var shader = gl.createShader(type)
gl.shaderSource(shader, sourceCode)//挂载代码
gl.compileShader(shader)//编译
//打印shader中的编译错误信息
var compiled = gl.getShaderParameter(shader, gl.COMPILE_STATUS);
if (!compiled) {
var error = gl.getShaderInfoLog(shader);
console.log('Failed to compile shader : ' + error);
gl.deleteShader(shader);
return null;
}
return shader
}
//定义顶点着色器vertex shader
vertexShader = createShader(gl,VSHADER_SOURCE,gl.VERTEX_SHADER)
//定义片元着色器frament shader
fragmentShader = createShader(gl,FSHADER_SOURCE,gl.FRAGMENT_SHADER)
//program中添加shader
gl.attachShader(program, vertexShader)
gl.attachShader(program,fragmentShader)
//连接program to context
gl.linkProgram(program)
gl.useProgram(program)
gl.program = program
静态三角形绘制
- demo.js
var VSHADER_SOURCE,FSHADER_SOURCE//定义顶点、片元源代码
VSHADER_SOURCE =
'attribute vec4 a_Position;\n'+
'void main (){\n'+
'gl_Position = a_Position;\n'+
'}\n'
FSHADER_SOURCE =
'void main (){\n'+
'gl_FragColor = vec4(1.0,0.0,0.0,1.0);\n'+
'}\n'
function initVertexBuffers (gl) {
var vertices = new Float32Array([
0, 0.5, -0.5, -0.5, 0.5, -0.5
])
var n = 3//取3个点
var vertexBuffer = gl.createBuffer()
gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer)
// write data into the buffer object
gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW)
// get attribute a_Position address in vertex shader
var a_Position = gl.getAttribLocation(gl.program, 'a_Position')
gl.vertexAttribPointer(a_Position, 2, gl.FLOAT, false, 0, 0)//每2个data为一点
// enable a_Position variable
gl.enableVertexAttribArray(a_Position)
return n
}
// write the positions of vertices to a vertex shader
var n = initVertexBuffers(gl)
//绘制
gl.clearColor(0, 0, 0, 1)//背景色
function draw() {
//cleaer canvas and add background color
gl.clear(gl.COLOR_BUFFER_BIT)//背景色
gl.drawArrays(gl.TRIANGLES, 0, n)
}
draw()
旋转三角绘制
- demo.js:关键代码
顶点着色器源码
VSHADER_SOURCE =
'attribute vec4 a_Position;\n'+
'uniform mat4 u_ModelMatrix;\n' +//旋转
'void main (){\n'+
'gl_Position = u_ModelMatrix*a_Position;\n'+//位置*旋转角度
'}\n'
角度定义与变换
//旋转角度定义
var currentAngle = 0
var g_last = Date.now()
var u_ModelMatrix = gl.getUniformLocation(gl.program, 'u_ModelMatrix')
var modelMatrix = new Matrix4()
在draw中设置旋转轴
//设置旋转轴与角度,关联gl
modelMatrix.setRotate(currentAngle, 0, 1, 0)//angle,x,y,z
gl.uniformMatrix4fv(u_ModelMatrix, false, modelMatrix.elements)
动画
function animate () {
var now = Date.now()
var duration = now - g_last
g_last = now
currentAngle = currentAngle + duration / 1000 * 180
}
效果汇总
var tick = function () {//效果汇总
// update the new rotation angle
animate()
// draw
draw()
requestAnimationFrame(tick)//H5API
}
tick()
矩阵基础部分明天有空再练笔咯。 (源码:https://github.com/11zouzouzou/Webgl-basic)