WebGl 平移(矩阵变换)

  1 <!DOCTYPE html>
  2 <html lang="en">
  3 <head>
  4     <meta charset="UTF-8">
  5     <title>WebGl 平移(矩阵变换)</title>
  6 </head>
  7 <body>
  8 <h6>使用键盘方向键←、↑、→、↓平移三角形</h6>
  9 <canvas ></canvas>
 10 </body>
 11 <script>
 12 
 13     window.onload = function () {
 14 
 15         //第1步 - 准备Canvas和获取WebGL的渲染上下文
 16         var canvas = document.getElementById('myCanvas'),
 17             gl = canvas.getContext('webgl');
 18 
 19         //第2步 - 定义几何并将其存储在缓冲区对象
 20         var vertices = [
 21                 -0.5,0.5,0.0,
 22                 0.0,0.5,0.0,
 23                 -0.25,0.25,0.0,
 24                 0.5,0.5,0.0,
 25                 0.25,0.25,0.0,
 26             ],
 27             indices =[0,1,2,1,3,4];
 28 
 29         var vertex_buffer = gl.createBuffer();
 30         gl.bindBuffer(gl.ARRAY_BUFFER, vertex_buffer);
 31         gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(vertices), gl.STATIC_DRAW);
 32 
 33         var Index_Buffer = gl.createBuffer();
 34         gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, Index_Buffer);
 35         gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, new Uint16Array(indices), gl.STATIC_DRAW);
 36 
 37         //第3步 - 创建和编译着色器程序
 38         var vertCode =
 39             'attribute vec3 coordinates;' +
 40             'uniform mat4 translation;' +
 41             'void main(void) {' +
 42             ' gl_Position = translation*vec4(coordinates,1.0);' +//这里一定要注意  是translation在前
 43             '}';
 44 
 45         var fragCode =
 46             'void main(void) {' +
 47             ' gl_FragColor = vec4(1, 0.5, 0.0, 1);' +
 48             '}';
 49 
 50         var vertShader = gl.createShader(gl.VERTEX_SHADER);
 51         var fragShader = gl.createShader(gl.FRAGMENT_SHADER);
 52         gl.shaderSource(vertShader, vertCode);
 53         gl.shaderSource(fragShader, fragCode);
 54         gl.compileShader(vertShader);
 55         gl.compileShader(fragShader);
 56         var shaderProgram = gl.createProgram();
 57         gl.attachShader(shaderProgram, vertShader);
 58         gl.attachShader(shaderProgram, fragShader);
 59         gl.linkProgram(shaderProgram);
 60         gl.useProgram(shaderProgram);
 61 
 62 
 63         //第4步 - 关联着色器程序到缓冲区对象
 64         var coord = gl.getAttribLocation(shaderProgram, 'coordinates');
 65         gl.vertexAttribPointer(coord, 3, gl.FLOAT, false, 0, 0);
 66         gl.enableVertexAttribArray(coord);
 67 
 68         var Tx =0.0,Ty = 0.0,Tz = 0.0;
 69         //注意WebGL的矩阵式列主序的
 70         var xformMatrix = new Float32Array([
 71             1.0, 0.0, 0.0, 0.0,
 72             0.0, 1.0, 0.0, 0.0,
 73             0.0, 0.0, 1.0, 0.0,
 74             Tx, Ty, Tz, 1.0
 75         ]);
 76         //然后将矩阵传输给定点着色器
 77         var translation = gl.getUniformLocation(shaderProgram,'translation');
 78         gl.uniformMatrix4fv(translation, false, xformMatrix);
 79 
 80 
 81         //第5步 - 绘制所需的对象
 82         gl.clearColor(0.5, 0.5, 0.5, 0.9);
 83         gl.enable(gl.DEPTH_TEST);
 84         gl.clear(gl.COLOR_BUFFER_BIT);
 85         gl.viewport(0, 0, myCanvas.width, myCanvas.height);
 86         gl.drawElements(gl.TRIANGLES, indices.length, gl.UNSIGNED_SHORT, 0);
 87 
 88 
 89         //监听事件
 90         document.addEventListener("keyup",function (event) {
 91             switch (event.keyCode){
 92                 case 37:
 93                     Tx -= 0.05;
 94                     break;
 95                 case 38:
 96                     Ty += 0.05;
 97                     break;
 98                 case 39:
 99                     Tx += 0.05;
100                     break;
101                 case 40:
102                     Ty -= 0.05;
103                     break;
104             }
105 
106             //重复以上部分操作
107             xformMatrix = new Float32Array([
108                 1.0, 0.0, 0.0, 0.0,
109                 0.0, 1.0, 0.0, 0.0,
110                 0.0, 0.0, 1.0, 0.0,
111                 Tx, Ty, Tz, 1.0
112             ]);
113             gl.uniformMatrix4fv(translation, false, xformMatrix);
114             //重复 第5步 - 绘制所需的对象
115             gl.clearColor(0.5, 0.5, 0.5, 0.9);
116             gl.enable(gl.DEPTH_TEST);
117             gl.clear(gl.COLOR_BUFFER_BIT);
118             gl.viewport(0, 0, myCanvas.width, myCanvas.height);
119             gl.drawElements(gl.TRIANGLES, indices.length, gl.UNSIGNED_SHORT, 0);
120 
121         });
122 
123 
124     }
125 
126 </script>
127 </html>