|
<html> <head>11</head> <body> <canvas id = "test" width = "200" height = "200">canvas </canvas> <script src = "webgltest/cuon-matrix.js"></script> <script > //顶点着色器 var vertexShaderSource = 'attribute vec4 a_Position;\n' + 'attribute vec4 a_Color;\n' + 'uniform mat4 u_mvpMatrix;\n' + 'varying vec4 v_Color;\n' + //varying变量 'void main() {\n' + //'gl_Position = u_ModelViewMatrix * a_Position;\n'+ //设置坐标 'gl_Position = u_mvpMatrix * a_Position;\n'+ //设置坐标 'v_Color = a_Color;\n' + //将数据传给片元着色器 '}\n';
//片元着色器 var fragmentShaderSource = 'precision mediump float;\n' + 'varying vec4 v_Color;\n' + //varying变量 'void main() {\n' + 'gl_FragColor = v_Color;\n'+ //设置颜色 '}\n';
//创建着色器方法,输入参数:渲染上下文,着色器类型,数据源 function createShader(gl, type, source) { //创建着色器对象 var shader = gl.createShader(type); //提供数据源 gl.shaderSource(shader,source); //编译着色器 gl.compileShader(shader); //链接 var success = gl.getShaderParameter(shader, gl.COMPILE_STATUS); if(success) { return shader; } console.log(gl.getShaderInfoLog(shader)); gl.deleteShader(shader); } //将顶点着色器和像素着色器链接到一个着色程序 function createProgram(gl, vertexShader, fragmentShader) { var program = gl.createProgram(); gl.attachShader( program, vertexShader); gl.attachShader( program, fragmentShader); gl.linkProgram( program ); var success = gl.getProgramParameter(program, gl.LINK_STATUS); if(success) { console.log("link right"); return program; } console.log(gl.getProgramInfoLog(program)); gl.deleteProgram(program); } var canvas = document.getElementById("test"); //创建webgl渲染上下文 var gl = canvas.getContext("webgl"); //var gl = WebGLUtils.setupWebGL(canvas); if(!gl) { console.log("wrong"); } else { console.log("right"); } //初始化着色器
var vertexShader = createShader(gl,gl.VERTEX_SHADER,vertexShaderSource); var fragmentShader = createShader(gl,gl.FRAGMENT_SHADER, fragmentShaderSource); var program = createProgram(gl, vertexShader, fragmentShader); gl.useProgram(program); //创建顶点数组 var vertices = new Float32Array([ 0.0, 2.5, -5.0, 0.0, 1.0, 0.0, //第一个点 -2.5, -2.5, -5.0, 0.0, 1.0, 0.0, //第二个点 2.5, -2.5, -5.0, 1.0, 0.0, 0.0, //第三个点 0.0, 3.0, -5.0, 1.0, 0.0, 0.0, //第一个点 -3.0, -3.0, -5.0, 1.0, 1.0, 0.0, //第二个点 3.0, -3.0, -5.0, 1.0, 1.0, 0.0, //第三个点 ]); var numberVertices = 6; //创建缓冲区对象 var vertexBuffer = gl.createBuffer(); //将缓冲区对象绑定到目标 gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer); //向绑定的缓冲区对象中写入数据 gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW); var FSIZE = vertices.BYTES_PER_ELEMENT; //获取位置变量并传递顶点位置 var thePosition = gl.getAttribLocation(program, 'a_Position'); //将缓冲区对象分配给位置变量 gl.vertexAttribPointer(thePosition, 2, gl.FLOAT, false, FSIZE * 6, 0 ); //启动缓冲区 gl.enableVertexAttribArray(thePosition); var theColor = gl.getAttribLocation(program, 'a_Color'); gl.vertexAttribPointer(theColor, 3, gl.FLOAT, false, FSIZE * 6, FSIZE * 3 ); gl.enableVertexAttribArray(theColor); //设置世界坐标系 var modelMatrix = new Matrix4(); modelMatrix.setRotate(30.0,0,0,1); //设置视点、视线和上方向 var viewMatrix = new Matrix4(); viewMatrix.setLookAt(0, 0, 5, 0, 0, -100, 0, 1, 0); //投影矩阵 var projMatrix = new Matrix4(); var g_near = 1.0, g_far = 100.0; projMatrix.setPerspective(30, canvas.width / canvas.height,g_near, g_far); //模型视图投影矩阵 var mvpMatrix = new Matrix4(); //计算模型视图投影矩阵 mvpMatrix.set(projMatrix).multiply(viewMatrix).multiply(modelMatrix); //获取投影矩阵 var u_mvpMatrix = gl.getUniformLocation(program, 'u_mvpMatrix'); //将投影矩阵传给u_ProjMatrix变量 gl.uniformMatrix4fv(u_mvpMatrix, false, mvpMatrix.elements); //清除颜色 //在绘制之前,清除深度缓冲区 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); //启用多边形偏移 gl.enable(gl.POLYGON_OFFSET_FILL); //绘制绿色三角形 gl.drawArrays(gl.TRIANGLES, 0, numberVertices / 2); //设置多边形偏移 gl.polygonOffset(1.0,1.0); //绘制黄色三角形 gl.drawArrays(gl.TRIANGLES, numberVertices / 2, numberVertices / 2);
</script> </body> </html>

|