WebGl 多缓冲区传递颜色和坐标(矩形)

效果:

代码:

  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,
 24             -0.5,-0.5,0.0,
 25             0.5,-0.5,0.0,
 26             0.5,0.5,0.0
 27         ];
 28         var colors = [
 29             0,0,1,
 30             1,0,0,
 31             0,1,0,
 32             1,0,1,
 33         ];
 34         var indices = [3,2,1,3,1,0];
 35 
 36         var vertex_buffer = gl.createBuffer();
 37         gl.bindBuffer(gl.ARRAY_BUFFER,vertex_buffer);
 38         gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(vertices), gl.STATIC_DRAW);
 39 
 40         var Index_Buffer = gl.createBuffer();
 41         gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER,Index_Buffer);//注意  是  ELEMENT_ARRAY_BUFFER  不是  ARRAY_BUFFER
 42         gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, new Uint16Array(indices), gl.STATIC_DRAW);
 43 
 44         var color_buffer = gl.createBuffer ();
 45         gl.bindBuffer(gl.ARRAY_BUFFER,color_buffer);
 46         gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(colors), gl.STATIC_DRAW);
 47 
 48         //创建和编译着色器程序
 49         var vertCode = 'attribute vec3 coordinates;'+
 50             'attribute vec3 color;'+
 51             'varying vec3 vColor;'+
 52 
 53             'void main(void) {' +
 54             ' gl_Position = vec4(coordinates, 1.0);' +
 55             'vColor = color;'+
 56             '}';
 57         var fragCode = 'precision mediump float;'+
 58             'varying vec3 vColor;'+
 59             'void main(void) {'+
 60             'gl_FragColor = vec4(vColor, 1.0);'+
 61             '}';
 62 
 63         var vertShader = gl.createShader(gl.VERTEX_SHADER);
 64         gl.shaderSource(vertShader, vertCode);
 65         gl.compileShader(vertShader);
 66 
 67         var fragShader = gl.createShader(gl.FRAGMENT_SHADER);
 68         gl.shaderSource(fragShader, fragCode);
 69         gl.compileShader(fragShader);
 70 
 71         var shaderProgram = gl.createProgram();
 72         gl.attachShader(shaderProgram, vertShader);
 73         gl.attachShader(shaderProgram, fragShader);
 74         gl.linkProgram(shaderProgram);
 75         gl.useProgram(shaderProgram);
 76 
 77 
 78         //与缓冲区对象相关联着色器程序
 79         gl.bindBuffer(gl.ARRAY_BUFFER,vertex_buffer);//这里要注意的是  现在存在多个缓冲区  取属性值得时候  一定先告诉从哪个缓冲区取值  否则默认是最后一个bindBuffer()指定的;
 80         var coord = gl.getAttribLocation(shaderProgram, "coordinates");
 81         gl.vertexAttribPointer(coord, 3, gl.FLOAT, false, 0, 0);
 82         gl.enableVertexAttribArray(coord);
 83 
 84         gl.bindBuffer(gl.ARRAY_BUFFER,color_buffer);//这里要注意的是  现在存在多个缓冲区  取属性值得时候  一定先告诉从哪个缓冲区取值  否则默认是最后一个bindBuffer()指定的;
 85         var color = gl.getAttribLocation(shaderProgram, "color");
 86         gl.vertexAttribPointer(color, 3, gl.FLOAT, false,0,0) ;
 87         gl.enableVertexAttribArray(color);
 88 
 89 
 90         //绘制所需的对象
 91         gl.clearColor(0.5, 0.5, 0.5, 0.9);
 92         gl.enable(gl.DEPTH_TEST);
 93         gl.clear(gl.COLOR_BUFFER_BIT);
 94         gl.viewport(0,0,canvas.width,canvas.height);
 95         gl.drawElements(gl.TRIANGLES, indices.length, gl.UNSIGNED_SHORT,0);
 96 
 97     }
 98 
 99 </script>
100 
101 </html>
原文地址:https://www.cnblogs.com/zhinian-/p/10631478.html