webgl instance 绘制

news2024/12/22 17:05:38

webgl instance 绘制

效果:
在这里插入图片描述

key1: 创建实例缓存
function createMesh() {
  for (let i = 0; i < NUM_CUBE; i++) {
    const angle = i * 2 * Math.PI / NUM_CUBE;
    const x = Math.sin(angle) * RADIUS;
    const y = 0;
    const z = Math.cos(angle) * RADIUS;

    cubes[i] = {
      scale: new THREE.Vector3(0.5, 0.5, 0.5),
      position: new THREE.Vector3(x, y, z),
      modelMatrix: new THREE.Matrix4(),
      rotation: new THREE.Euler(0, 0, 0),
      quaternion: new THREE.Quaternion(),
    };
  }

  // key1: 创建实例缓存
  modelMatrixData = new Float32Array(NUM_CUBE * 16);
  modelMatrixBuffer = WebGLVertex.createMatrix4x4(gl, {
    location: 3,
    data: modelMatrixData,
  });
}
key2: 在创建vao之后创建 实例缓存
// key2: 在创建vao之后创建 实例缓存
const geometry = getCubeGeometry(gl, createMesh)
/**
 * @export
 * @param {*} gl
 * @param {*} unbindVaoBefor 解绑vao之前的回调函数
 */
export function getCubeGeometry(gl, unbindVaoBefor) {
  const { attributes, index } = new THREE.BoxGeometry();

  const vao = gl.createVertexArray();
  gl.bindVertexArray(vao);

  WebGLVertex.createBuffer(gl, {
    data: attributes.position.array
  });

  WebGLVertex.configureAttribute(gl, {
    location: 0,
    count: attributes.position.itemSize,
    type: gl.FLOAT,
    stride: 0,
    offset: 0,
  });

  WebGLVertex.createBuffer(gl, {
    data: attributes.uv.array
  });

  WebGLVertex.configureAttribute(gl, {
    location: 1,
    count: attributes.uv.itemSize,
    type: gl.FLOAT,
    stride: 0,
    offset: 0,
  });

  WebGLVertex.createBuffer(gl, {
    data: attributes.normal.array
  });

  WebGLVertex.configureAttribute(gl, {
    location: 2,
    count: attributes.normal.itemSize,
    type: gl.FLOAT,
    stride: 0,
    offset: 0,
  });

  WebGLVertex.createBuffer(gl, {
    glBufferType: gl.ELEMENT_ARRAY_BUFFER,
    data: index.array
  });

  unbindVaoBefor && unbindVaoBefor();
  gl.bindVertexArray(null);

  return {
    vao,
    attributes,
    indexed: true,
    index: index.array
  };
}
key3: 指定实例数量
const { program, uniforms } = WebGLProgram.buildPrograms(gl, shaders).cube;
cubeCommand = new DrawCommand({
  gl,
  camera,
  geometry: new Geometry(geometry),
  program: program,
  uniforms: uniforms,
  // key3: 指定实例数量
  instanceCount: cubes.length,
  renderState: new RenderState({
    depthTest: {
      enabled: true,
    }
  }),
  uniformsData: {
    uTexture: {
      type: "t",
      value: sphereTexture
    },
  }
})
key4: 更新矩阵
function updateMesh() {
  for (let i = 0; i < cubes.length; ++i) {
    cubes[i].rotation.x += i * 0.01 * Math.random();
    cubes[i].rotation.y += i * 0.01 * Math.random();
    cubes[i].rotation.z += i * 0.01 * Math.random();

    cubes[i].quaternion.setFromEuler(cubes[i].rotation, false);
    cubes[i].modelMatrix.compose(cubes[i].position, 		   cubes[i].quaternion, cubes[i].scale);

    // key4: 更新矩阵
    modelMatrixData.set(cubes[i].modelMatrix.elements, i * 16);
    WebGLVertex.updateBuffer(gl, {
      buffer: modelMatrixBuffer,
      data: modelMatrixData,
    })
  }
}
循环渲染
function render() {
  updateCamera()
  updateMesh();

  gl.clearColor(0, 0, 0, 0);
  gl.clear(gl.COLOR_BUFFER_BIT);
  gl.viewport(0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight);

  gl.useProgram(program);
  cubeCommand.execute();
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1510136.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

从零开始实现ORB_SLAM2编译与运行

文章目录 前言一、前期准备二、库安装1.engin库安装方法1&#xff1a;apt安装方法2&#xff1a;源码安装 2.Pangolin库安装3.openCV源码安装 三、build编译四、测试五、ROS安装六、build-ros编译七、测试总结 前言 ORB_SLAM2作为一种优秀的开源VSLAM解决方案&#xff0c;以其高…

高浓度纸浆废水如何处理达标排放

在纸浆生产过程中&#xff0c;高浓度纸浆废水是一个常见的环境污染源&#xff0c;其处理对于环境保护和可持续发展至关重要。为了实现高浓度纸浆废水的达标排放&#xff0c;必须采用一系列专业的处理技术&#xff0c;以确保废水处理的高效性和环境友好性。 首先&#xff0c;通过…

Oracle之ADG与DG的区别?

在上云后的Oracle数据灾备场景中&#xff0c;我们经常听到DBA迁移工程师讲到“在这个项目中用ADG进行数据实时备份&#xff0c;ADG比DG更好&#xff01;”。究竟ADG作Oracle数据灾备的优势在什么地方&#xff1f; 一、ADG主要解决了DG时代读写不能并行的问题 DG时代的数据同步…

Kutools For Excel | 新增 300+ 高级功能

Kutools For Excel 是一个便捷的 Excel 插件&#xff0c;具有 300 多种高级功能&#xff0c;可将各种复杂的任务简化为在 Excel 中的几次单击。 功能强大且用户友好的加载项将为 Excel 用户节省大量工作时间&#xff0c;并大大提高工作效率。支持 Excel 2021 / 2019 / 2016 / …

【Python使用】python高级进阶知识md总结第3篇:静态Web服务器-返回指定页面数据,静态Web服务器-多任务版【附代码文档】

python高级进阶全知识知识笔记总结完整教程&#xff08;附代码资料&#xff09;主要内容讲述&#xff1a;操作系统&#xff0c;虚拟机软件&#xff0c;Ubuntu操作系统&#xff0c;Linux内核及发行版&#xff0c;查看目录命令&#xff0c;切换目录命令&#xff0c;绝对路径和相对…

‘UnityEngine.Application‘ does not contain a definition for isBatchMode

unity 2017.4.37f1. 解决办法: Try to replace Application.isBatchMode with UnityEditorInternal.InternalEditorUtility.inBatchMode

NCDA大赛交互网页设计优秀作品有哪些?

现在&#xff0c;越来越多 UX/UI 设计者将互动 / 在其网站设计中添加动画元素(如鼠标悬停状态、音频或视频媒体、滚动交互等。).这样一方面可以让网站本身更加华丽有趣&#xff0c;吸引更多的访问者&#xff0c;激励访问者更加关注和阅读网站内容。这就是为什么互动网站设计已经…

机器学习开源分子生成系列(1)-DeepFrag的本地部署及使用

欢迎浏览我的CSND博客&#xff01; Blockbuater_drug …进入 文章目录 前言一、DeepFrag是什么&#xff1f;二、conda中安装DeepFrag CLI环境1. 创建环境并激活2. 下载pre-trained model3. DeepFrag CLI 使用方法必需参数&#xff1a;可选参数&#xff1a; 4. DeepFrag CLI 使用…

猫头虎分享已解决Bug || 网络攻击(Network Attack):DDoSError, NetworkIntrusion

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

2048游戏代码

创建一个2048游戏的最小完整实现需要HTML、CSS和JavaScript。以下是一个简单的实现&#xff0c;你可以将这些代码复制到本地文件中&#xff0c;比如命名为2048.html&#xff0c;然后用浏览器打开这个文件来玩游戏。 <html> <head><title>2048 Game</title…

AJAX入门:前端连接后端

一.概述 AJAX即Asynchronous Javascript And XML&#xff0c;即异步JavaScript和XML。 AJAX作用&#xff1a; 与服务器进行数据交换&#xff1a;通过Ajax可以给服务器发送请求&#xff0c;并获取服务器响应的数据。&#xff08;使用Ajax和服务器进行通信&#xff0c;就可以使用…

Java_6 数组拆分 I

数组拆分 I 给定长度为 2n 的整数数组 nums &#xff0c;你的任务是将这些数分成 n 对, 例如 (a1, b1), (a2, b2), ..., (an, bn) &#xff0c;使得从 1 到 n 的 min(ai, bi) 总和最大。 返回该 最大总和 。 示例 1&#xff1a; 输入&#xff1a;nums [1,4,3,2] 输出&#…

如何看待Linux桌面操作系统的火速增长

文章目录 1. 使用过Linux桌面操作系统吗&#xff1f;Linux系统有什么优势&#xff1f;对于Linux桌面操作系统份额的火速增长怎么看呢认为未来Linux会主导桌面操作系统吗&#xff1f; #如何看待Linux桌面操作系统的火速增长&#xff1f; 1. 使用过Linux桌面操作系统吗&#xff…

蓝桥杯[OJ 2928]分糖果-CPP(贪心、字典序)

目录 一、题目描述&#xff1a; 二、整体思路 (一)字典序比较规则 (二)正确理解题意 &#xff08;三&#xff09;分类讨论 三、代码 一、题目描述&#xff1a; 二、整体思路 (一)字典序比较规则 首先要知道字典序是怎么比较大小的&#xff0c;简单来说按以下次序进行比较&am…

污水磷资源回收工艺及海普树脂除杂

#污水磷资源回收工艺及海普树脂除杂 ​磷矿资源也是一种不可再生资源&#xff0c;目前磷矿产业仍在扩张&#xff0c;随着新能源行业磷酸铁锂电池的大范围应用&#xff0c;对磷的需求量仍在增加。基于污水中相对较高的磷负荷&#xff0c;从污泥焚烧灰分中回收磷显得十分有必要&a…

iTOP-3588开发板快速启动手册Windows安装串口终端软件创建串口会话

双击上图中红框的应用程序后&#xff0c;软件会启动&#xff0c;界面启动后如下图所示&#xff1a; 下面来创建第一个SSH 会话。点击菜单栏 「会话」 --> 「新建会话」&#xff0c;即可弹出 「会话设置」 对话框&#xff0c;如下图所示&#xff1a; 在会话设置框里面选择串口…

如何提高API接口的性能和设计安全可靠的API

如何提高API接口的性能 下图显示了提高 API 性能的 5 种常见技巧。 分页 这是在结果集较大时常用的优化方法。结果会以流式方式传回客户端&#xff0c;以提高服务响应速度。 异步日志 同步日志每次调用都要处理磁盘&#xff0c;会降低系统速度。异步日志会先将日志发送到无…

Oracle增量更新备份(更快的备份策略)

正常的备份策略包括&#xff1a;全库备份&#xff0c;full备份&#xff0c;创建镜像备份&#xff0c;累积增量备份以及差异增量备份&#xff1a; 全库备份&#xff1a;如名&#xff0c;对oracle整个数据库进行备份&#xff0c;包括archivedlog&#xff0c;数据文件&#xff0c;…

Verilog刷题笔记37

题目&#xff1a;3位二进制加法器 Now that you know how to build a full adder, make 3 instances of it to create a 3-bit binary ripple-carry adder. The adder adds two 3-bit numbers and a carry-in to produce a 3-bit sum and carry out. To encourage you to actua…

Mixamo动画素材导入UE5的最简单方法

一、Mixamo素材 官网&#xff1a;https://www.mixamo.com/ Mixamo是Adobe公司出品的免费动画库&#xff0c;可商用。软件分为characters(角色&#xff09;、Animations&#xff08;动画)两个部分。 二、辅助工具MIXAMO CONVERTER 官网&#xff1a;https://terribilisstudio…