-   1 <!DOCTYPE html>
-   2 <html lang="en">
-   3 <head>
-   4     <meta charset="UTF-8">
-   5     <title>WebGl  二维纹理贴图(矩形)</title>
-   6 </head>
-   7 <body>
-   8 
-   9 <canvas id="myCanvas" width="500" height="300" style='border:1px solid red'></canvas>
-  10 
-  11 </body>
-  12 
-  13 <script>
-  14 
-  15     window.onload = function () {
-  16 
-  17         //获取上下文
-  18         var canvas = document.getElementById('myCanvas');
-  19         var gl = canvas.getContext('webgl');
-  20 
-  21         //定义矩形数据 并 将其储存在缓存对象
-  22         var vertices = [
-  23             -0.5,0.5,0.0,    0.0,0.0,//(x,y,z)(r,g,b)分别代表坐标和颜色
-  24             -0.5,-0.5,0.0,   1.0,0.0,
-  25             0.5,-0.5,0.0,    0.0,1.0,
-  26             0.5,0.5,0.0,     1.0,1.0,
-  27         ];
-  28 
-  29         var indices = [3,2,1,3,1,0];
-  30 
-  31         var vertex_buffer = gl.createBuffer();
-  32         gl.bindBuffer(gl.ARRAY_BUFFER,vertex_buffer);
-  33         gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(vertices), gl.STATIC_DRAW);
-  34 
-  35         var Index_Buffer = gl.createBuffer();
-  36         gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER,Index_Buffer);//注意  是  ELEMENT_ARRAY_BUFFER  不是  ARRAY_BUFFER
-  37         gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, new Uint16Array(indices), gl.STATIC_DRAW);
-  38 
-  39         //创建和编译着色器程序
-  40         var vertCode = 'attribute vec3 coordinates;' +
-  41             'attribute vec2 texCoord;' +
-  42             'varying vec2 vtexCoord;' +
-  43             'void main() {' +
-  44             '   gl_Position = vec4(coordinates, 1.0);' +
-  45             '   vtexCoord = texCoord;' +
-  46             '}';
-  47         var fragCode = 'precision mediump float;' +
-  48             'varying vec2 vtexCoord;' +
-  49             'uniform sampler2D u_Sampler;' +
-  50             'void main() {' +
-  51             '   gl_FragColor = texture2D(u_Sampler, vtexCoord);' +
-  52             '}';
-  53 
-  54         var vertShader = gl.createShader(gl.VERTEX_SHADER);
-  55         gl.shaderSource(vertShader, vertCode);
-  56         gl.compileShader(vertShader);
-  57 
-  58         var fragShader = gl.createShader(gl.FRAGMENT_SHADER);
-  59         gl.shaderSource(fragShader, fragCode);
-  60         gl.compileShader(fragShader);
-  61 
-  62         var shaderProgram = gl.createProgram();
-  63         gl.attachShader(shaderProgram, vertShader);
-  64         gl.attachShader(shaderProgram, fragShader);
-  65         gl.linkProgram(shaderProgram);
-  66         gl.useProgram(shaderProgram);
-  67 
-  68 
-  69         //与缓冲区对象相关联着色器程序
-  70         var bytes = new Float32Array(vertices).BYTES_PER_ELEMENT;// vertices中每个元素的字节数 ,这里是 float 类型, 所以是 4 个字节
-  71 
-  72         var coord = gl.getAttribLocation(shaderProgram, "coordinates");
-  73         gl.vertexAttribPointer(coord, 3, gl.FLOAT, false, bytes*5, 0);
-  74         gl.enableVertexAttribArray(coord);
-  75 
-  76         var texCoord = gl.getAttribLocation(shaderProgram, "texCoord");
-  77         gl.vertexAttribPointer(texCoord, 2, gl.FLOAT, false, bytes*5, bytes*3) ;
-  78         gl.enableVertexAttribArray(texCoord);
-  79 
-  80 
-  81         //创建纹理对象并调用纹理绘制方法
-  82         var texture = gl.createTexture();//创建纹理对象
-  83         var u_Sampler = gl.getUniformLocation(shaderProgram,"u_Sampler");//获取u_Sampler的存储位置
-  84         var image = new Image();//创建image对象
-  85         image.src = "./timg.jpg";
-  86         image.onload = function () {//加载纹理
-  87             //纹理绘制
-  88             gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL,1);//对纹理图像进行y轴反转
-  89             gl.activeTexture(gl.TEXTURE0);//开启0号纹理单元
-  90             gl.bindTexture(gl.TEXTURE_2D,texture);//向target绑定纹理对象
-  91             gl.texParameteri(gl.TEXTURE_2D,gl.TEXTURE_MIN_FILTER,gl.LINEAR);//配置纹理参数
-  92             gl.texImage2D(gl.TEXTURE_2D,0,gl.RGB,gl.RGB,gl.UNSIGNED_BYTE,image);//配置纹理图像
-  93             gl.uniform1i(u_Sampler,0);//将0号纹理传递给着色器
-  94 
-  95             //绘制
-  96             gl.clearColor(0.0,0.0,0.0,1.0);
-  97             gl.clear(gl.COLOR_BUFFER_BIT);
-  98             gl.drawElements(gl.TRIANGLE_STRIP, indices.length, gl.UNSIGNED_SHORT,0);
-  99 
- 100         };
- 101 
- 102 
- 103     }
- 104 
- 105 </script>
- 106 
- 107 </html>