【webgl】 buffer的使用

什么是缓冲区对象

webgl提供一种很方便的机制 ,就是缓冲区对象,它可以一次性向着色器传入多个顶点的数据。缓冲区对象是WebGL系统中的一块内存区域,我们可以一次性地向缓冲区对象中填充大量的顶点数据,然后将这些数据保存在其中,供顶点着色器使用。

为什么用缓冲区

如果没有用缓冲区,然后循环遍历 数组列表,位置传递到顶点着色器, 然后去绘制顶点 就像下面代码一样循环一次,绘制一次。

function render() {
      gl.clear(gl.COLOR_BUFFER_BIT);
      a_points.forEach(({ x, y }) => {
        gl.vertexAttrib2f(a_Position, x, y);
        gl.drawArrays(gl.POINTS, 0, 1);
      });
    }

使用缓冲区

  1. 第一步:创建缓冲区对象(gl.createBuffer())
    // 删除缓冲区对象gl.deleteBuffer(buffer)
  2. 第二步:绑定缓冲区对象(gl.bindBuffer())
  3. 第三步:将数据写入缓冲区对象(gl.bufferData())
  4. 第四步:将缓冲区对象分配给一个attribute变量(gl.vertexAttribPointer())
  5. 第五步:开启attribute变量(gl.enableVertexAttribArray())
//顶点数据
    const vertices = new Float32Array([
      0, 0.2,
      -0.2, -0.1,
      0.2, -0.1,
      0.4, 0.2
    ]);
    //缓冲对象
    const vertexBuffer = gl.createBuffer();
    //绑定缓冲对象
    gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer);
    //写入数据
    gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW)
    //获取attribute 变量
    const a_Position = gl.getAttribLocation(gl.program, 'a_Position')
    // 将缓冲区对象分配给这个变量
    gl.vertexAttribPointer(a_Position, 2, gl.FLOAT, false, 0, 0)
    //赋能-批处理 链接a_Position变量与分配给它的缓冲区对象
    gl.enableVertexAttribArray(a_Position)

将缓冲区的对象 分配给这个变量 ,我们看下这个api 「gl.vertexAttribPointer」
6. 第一个参数的话其实 指定要修改的顶点属性的索引, 而这个索引 就是我们通过上面在顶点着色器中去查找到的
7. 第二参数 的表示 指定每个顶点属性的组成数量,必须是1,2,3或4。这是为什么呢 ,因为顶点坐标 默认是(x,y,z,w)如果你选择是1 那么 程序会帮你把剩下的参数补充。2 3 设置为0 4 设置为 1 。因为我们这里 其实就是个二维坐标 , 所以只用到了 x,y 这样的坐标 所以是2
8. 第三个 表示数据类型, 我们这里是浮点型
9. 第四个 表示归一化 ,就是把 非浮点型的数据 归一到 【0,1】 或者 是【-1,1】 区间
10. 第五个 表示相邻两个顶点之间的字节数
11. 最后一个 表示 我们获取的这个顶点索引 是在缓冲区 的何处 开始存储的 , 我们缓冲区对象 存的都是顶点数据, 所以这里是0

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
WebGL 是一种基于 OpenGL ES 的 JavaScript API,用于在 Web 浏览器中呈现 2D 和 3D 图形。它可以让开发使用 JavaScriptWebGL API 编写出高性能的 3D 应用程序,包括游戏、数据可视化和模拟等。 下面是一个简单的 WebGL 示例,它使用 WebGL 绘制一个矩形: ```html <!DOCTYPE html> <html> <head> <title>WebGL Example</title> <style> #canvas { width: 400px; height: 400px; } </style> </head> <body> <canvas id="canvas"></canvas> <script> const canvas = document.getElementById("canvas"); const gl = canvas.getContext("webgl"); // 设置清除颜色为黑色 gl.clearColor(0, 0, 0, 1); // 清除画布 gl.clear(gl.COLOR_BUFFER_BIT); // 定义顶点数据 const vertices = [ -0.5, 0.5, 0.5, 0.5, 0.5, -0.5, -0.5, -0.5, ]; // 创建顶点缓冲区 const vertexBuffer = gl.createBuffer(); // 绑定顶点缓冲区 gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer); // 将顶点数据写入缓冲区 gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(vertices), gl.STATIC_DRAW); // 定义顶点着色器 const vertexShaderSource = ` attribute vec2 a_position; void main() { gl_Position = vec4(a_position, 0, 1); } `; // 创建顶点着色器 const vertexShader = gl.createShader(gl.VERTEX_SHADER); // 编译顶点着色器 gl.shaderSource(vertexShader, vertexShaderSource); gl.compileShader(vertexShader); // 定义片元着色器 const fragmentShaderSource = ` precision mediump float; void main() { gl_FragColor = vec4(1, 1, 1, 1); } `; // 创建片元着色器 const fragmentShader = gl.createShader(gl.FRAGMENT_SHADER); // 编译片元着色器 gl.shaderSource(fragmentShader, fragmentShaderSource); gl.compileShader(fragmentShader); // 创建着色器程序 const program = gl.createProgram(); // 将顶点着色器和片元着色器链接到着色器程序中 gl.attachShader(program, vertexShader); gl.attachShader(program, fragmentShader); gl.linkProgram(program); gl.useProgram(program); // 获取顶点属性 a_position 的位置 const positionLocation = gl.getAttribLocation(program, "a_position"); // 启用顶点属性数组 gl.enableVertexAttribArray(positionLocation); // 将当前绑定的顶点缓冲区分配给顶点属性 a_position gl.vertexAttribPointer(positionLocation, 2, gl.FLOAT, false, 0, 0); // 绘制矩形 gl.drawArrays(gl.TRIANGLE_FAN, 0, 4); </script> </body> </html> ``` 这个示例首先获取到一个 `canvas` 元素,并使用 `getContext` 方法获取 WebGL 上下文对象 `gl`。然后,它设置清除颜色为黑色,清除画布,并定义了一个矩形的顶点数据。接下来,它创建了一个顶点缓冲区,并将顶点数据写入缓冲区。然后,它定义了一个顶点着色器和一个片元着色器,并将它们链接到着色器程序中。最后,它启用了顶点属性数组,并将当前绑定的顶点缓冲区分配给顶点属性,然后使用 `gl.drawArrays` 方法绘制矩形。 这只是一个简单的 WebGL 示例,WebGL 还有很多其他功能和用法,包括纹理映射、着色器编程、深度测试、透明度、光照、阴影和反射等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值