效果:
代码:
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>