webgl instance 绘制

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();
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

redis穿透、雪崩、击穿及其解决方案

redis穿透、雪崩、击穿及其解决方案 redis三个问题及解决方案缓存穿透缓存雪崩缓存击穿 redis三个问题及解决方案 缓存穿透 缓存穿透是指客户端请求的数据在缓存中和数据库中都不存在&#xff0c;这样缓存永远不会生效&#xff0c;这些请求都会打到数据库。也就是说key对应的…

黑马程序员-瑞吉外卖Day10

1.菜品分页查询 而在我们的实体类 Dish 中&#xff0c;仅仅包含 categoryId&#xff0c; 不包含 categoryName&#xff0c;那么我们应该如何封装查询的数据呢&#xff1f; 其实&#xff0c;这里我们可以返回DishDto对象&#xff0c;在该对象中我们可以拓展一个属性 categoryN…

高精度10m/30米NPP净初级生产力分布数据

引言 第一性生产力是绿色植物呼吸后所剩下的单位面积单位时间内所固定的能量或所生产的有机物质&#xff0c;即是总第一性生产量减去植物呼吸作用所剩下的能量或有机物质。多种卫星遥感数据反演净初级生产力&#xff08;NPP&#xff09;产品是地理遥感生态网平台推出的生态环境…

java-ssm-jsp的问卷调查系统的设计与实现

java-ssm-jsp的问卷调查系统的设计与实现

使用Python查询和下载Sentinel卫星数据

欢迎学习本教程,了解如何使用 Python 访问和下载 Sentinel 卫星数据。在深入探讨技术方面之前,让我们先了解一下哨兵卫星是什么以及它们为何如此重要。 哨兵家族。资料来源:欧空局。 Sentinel 卫星是欧洲航天局 (ESA) 开发的一组地球观测任务,是哥白尼计划的一部分,该计划…

论文阅读 Stepwise Feature Fusion: Local Guides Global

1&#xff0c;另一个ssfomer 我在找论文时发现&#xff0c;把自己的分割模型命名为ssformer的有两个&#xff1a;&#xff0c;一个论文SSformer: A Lightweight Transformer for Semantic Segmentation中提出的一种轻量级Transformer模型&#xff0c;结构如下 这个结构很简单&…

安装配置HBase

HBase集群需要整个集群所有节点安装的HBase版本保持一致&#xff0c;并且拥有相同的配置&#xff0c;具体配置步骤如下&#xff1a; 1. 解压缩HBase的压缩包 2. 配置HBase的环境变量 3. 修改HBase的配置文件&#xff0c;HBase的配置文件存放在HBase安装目录下的conf中 4. 首…

Docker Desktop将镜像存储位置从C盘迁移到其它盘

一、简述 Docker Desktop默认安装在C盘,默认镜像存储位置在 C:\用户\Administrator\AppData\Local\Docker\wsl Docker Desktop 通过WSL2启动,会自动创建2个子系统,分别对应2个 vhdx 硬盘映像文件。 可以命令行执行wsl --list -v 看到 二、迁移步骤 1、在Docker Desktop…

加载spacy中文语言模型 zh_core_web_sm错误解决办法

如果你代码在运行时找不到该模型且报错 并且安装该模块也报错 那么可以试一下手动安装 Chinese spaCy Models Documentationhttps://spacy.io/models/zh#zh_core_web_sm 点击安装到C盘&#xff0c;就是你平时pip install的标准路径 最后进入终端 即可安装成功&#xff01;

【编程语言】C#语言相关知识

前言&#xff1a;我们在游戏开发的过程中&#xff0c;往往会通过游戏引擎结合编程语言的方式&#xff0c;来作为项目开发的手段。因此&#xff0c;了解相关语言的特性、发展和前沿知识&#xff0c;就显得相当必要。笔者这里结合自身的工作经验和学习心得&#xff0c;用简洁通俗…

Jmeter入参问题小记

表单入参的时候&#xff0c;这个地方需要勾选&#xff0c;如果不☑️选的话&#xff0c;会提示errorMsg":"Required String parameter code is not present",

MYSQL Unknown column ‘appreciation.latitude‘ in ‘where clause‘

问题 笔者编写mysql语句&#xff0c;执行报错 详细问题 笔者sql代码 SELECT ap.*, su.username, wh.wheat_name FROM appreciation ap LEFT JOIN sys_user su ON su.id ap.user_id LEFT JOIN wheat wh ON wh.id ap.crop_id WHERE appreciation.latitude 1报错信息 >…

100. Go单测系列0---单元测试基础

文章目录 一、Go语言测试1. go test工具2. 单元测试函数3. 单元测试示例4. 子测试5. 表格驱动测试6. 并行测试 二、使用工具生成测试代码三、测试覆盖率四、testify/assert五、总结 本文主要讲解在Go语言中如何编写单元测试以及介绍表格驱动测试、回归测试和单元测试中常用的断…

【SpringBoot3】快速启动框架 快速入门 配置文件

文章目录 SpringBoot3介绍一、快速入门二、入门总结1. 为什么依赖不需要写版本&#xff1f;2. 启动器(Starter)是什么3. SpringBootApplication注解包括的效果&#xff1f; 三、SpringBoot3配置文件3.1 统一配置管理概述3.2 属性配置文件使用3.3 YAML配置文件使用3.4 批量配置文…

【开源】SpringBoot框架开发新能源电池回收系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 用户档案模块2.2 电池品类模块2.3 回收机构模块2.4 电池订单模块2.5 客服咨询模块 三、系统设计3.1 用例设计3.2 业务流程设计3.3 E-R 图设计 四、系统展示五、核心代码5.1 增改电池类型5.2 查询电池品类5.3 查询电池回…

大语言模型系列-提示工程

文章目录 前言一、Prompt Learning二、上下文学习&#xff08;In-Context Learning&#xff09;三、指示学习&#xff08;Instruction Learning&#xff09;四、思维链&#xff08;Chain-of-Thought&#xff09;总结 前言 前文提到自BERT以来&#xff0c;LLM的训练范式变为预训…

C#-WPF 入门

WPF 应用 使用 Visual Studio 创建新应用教程 - WPF .NET | Microsoft Learn Windows Presentation Foundation (WPF) &#xff0c;这是一个与分辨率无关的 UI 框架&#xff0c;使用基于矢量的呈现引擎&#xff0c;构建用于利用现代图形硬件。 WPF 提供一套完善的应用程序开发…

软考68-上午题-【面向对象技术2-UML】-事物

一、事物 UML中有4种事物&#xff1a; 结构事物&#xff1b;&#xff08;模型的静态部分&#xff09;行为事物&#xff1b;&#xff08;模型的动态部分&#xff09;分组事物&#xff1b;注释事物。 1-1、结构事物 静态图&#xff1a;类图、对象图、用例图 1-2、行为事物 动态…

【CSS面试题】外边距折叠的原因和解决

参考文章 什么时候出现外边距塌陷 外边距塌陷&#xff0c;也叫外边距折叠&#xff0c;在普通文档流中&#xff0c;在垂直方向上的2个或多个相邻的块级元素&#xff08;父子或者兄弟&#xff09;外边距合并成一个外边距的现象&#xff0c;不过只有上下外边距才会有塌陷&#x…

抖音开放平台第三方开发,实现代小程序备案申请

大家好&#xff0c;我是小悟 抖音小程序备案整体流程总共分为五个环节&#xff1a;备案信息填写、平台初审、工信部短信核验、通管局审核和备案成功。 服务商可以代小程序发起备案申请。在申请小程序备案之前&#xff0c;需要确保小程序基本信息已填写完成、小程序至少存在一个…