regl 多实例绘制ANGLE_instanced_arrays 和 instances

原文链接: regl 多实例绘制ANGLE_instanced_arrays 和 instances

上一篇: regl vao 三角形交替

下一篇: regl batch 批量绘制三角形

https://developer.mozilla.org/zh-CN/docs/Web/API/ANGLE_instanced_arrays

http://www.jiazhengblog.com/blog/2017/03/20/3104/

说的很明确了, 主要是绘制相似的图形

ANGLE_instanced_arrays 属于 WebGL API 的一个扩展API, 它允许多次绘制相同的对象或相似对象组,前提是它们共享相同的顶点数据、基本图形的个数和类型。

up-9b09453899df7b754e65f4b41124daf8a14.png

divisor 表示每个属性应用到几个实例上, angle的divisor是5, 表示一个角度的数值应用到5个实例上
up-c6fa8cfb3c7733a0fec9fffb89dcf72b8d4.png
import createREGL from "regl";

export default (canvas: HTMLCanvasElement) => {
  const regl = createREGL({ canvas, extensions: ["angle_instanced_arrays"] });
  const N = 10; // N triangles on the width, N triangles on the height.
  const divisor = 1;
  const angle = Array(N * N)
    .fill(0)
    .map(() => Math.random() * (2 * Math.PI));
  // This buffer stores the angles of all
  // the instanced triangles.
  const angleBuffer = regl.buffer({
    length: angle.length * 4,
    type: "float",
    usage: "dynamic",
  });

  const draw = regl({
    frag: `
  precision mediump float;

  varying vec3 vColor;
  void main() {
    gl_FragColor = vec4(vColor, 1.0);
  }`,

    vert: `
  precision mediump float;

  attribute vec2 position;

  // These three are instanced attributes.
  attribute vec3 color;
  attribute vec2 offset;
  attribute float angle;

  varying vec3 vColor;

  void main() {
    gl_Position = vec4(
      cos(angle) * position.x + sin(angle) * position.y + offset.x,
        -sin(angle) * position.x + cos(angle) * position.y + offset.y, 0, 1);
    vColor = color;
  }`,

    attributes: {
      position: [
        [0.0, -0.05],
        [-0.05, 0.0],
        [0.05, 0.05],
      ],

      offset: {
        buffer: regl.buffer(
          Array(N * N)
            .fill(0)
            .map((_, i) => {
              const x = -1 + (2 * Math.floor(i / N)) / N + 0.1;
              const y = -1 + (2 * (i % N)) / N + 0.1;
              return [x, y];
            })
        ),
        divisor, // one separate offset for every triangle.
      },

      color: {
        buffer: regl.buffer(
          Array(N * N)
            .fill(0)
            .map((_, i) => {
              const r = Math.floor(i / N) / N;
              const g = (i % N) / N;
              return [r, g, r * g + 0.2];
            })
        ),
        divisor, // one separate color for every triangle
      },

      angle: {
        buffer: angleBuffer,
        divisor, // one separate angle for every triangle
      },
    },

    depth: {
      enable: false,
    },

    // Every triangle is just three vertices.
    // However, every such triangle are drawn N * N times,
    // through instancing.
    count: 3,
    instances: N * N,
  });

  regl.frame(function () {
    regl.clear({
      color: [0, 0, 0, 1],
    });

    // rotate the triangles every frame.
    for (let i = 0; i < N * N; i++) {
      angle[i] += 0.01;
    }
    angleBuffer.subdata(angle);
    draw();
  });
};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值