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

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

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

相关文章

Rust 使 Python 函数速度提高 5000%

大家应该都听说过&#xff0c;Rust 因其卓越的性能和安全性&#xff0c;正被越来越多的科技巨头采用&#xff0c;推荐开发者使用Rust来构建关键软件。 今天&#xff0c;来深入学习一下&#xff0c;如何利用 Rust 来大幅提升你的 Python代码性能&#xff01; 寻找第N个质数&…

Node.js作用

Node.js可以开发应用 开发服务器应用 开发工具类应用 开发桌面端应用

Linux查看磁盘命令df-h详解

df -h 是一个常用的 Linux 命令&#xff0c;用于查看文件系统的磁盘使用情况并以易于阅读的方式显示。以下是 df -h 命令的详细解释&#xff1a; -h&#xff1a;以人类可读的格式显示磁盘空间大小。例如&#xff0c;使用 GB、MB、KB 等单位代替字节。 执行 df -h 命令后&…

【webrtc】m122:PacingController 源码阅读

PacingController 关系与BitrateProber 关系更为密切PacingController 内置BitrateProber G:\CDN\signalapp_webrtc\modules\pacing\pacing_controller.hPacingControllerBitrateProber prober_;PacingController 关系与BitrateProber 关系更为密切,在整个系统中的地位也更重要…

阿里云2核4G服务器ECS规格清单、CPU性能详解和租用价格表

阿里云2核4G服务器多少钱一年&#xff1f;2核4G服务器1个月费用多少&#xff1f;2核4G服务器30元3个月、85元一年&#xff0c;轻量应用服务器2核4G4M带宽165元一年&#xff0c;企业用户2核4G5M带宽199元一年。本文阿里云服务器网整理的2核4G参加活动的主机是ECS经济型e实例和u1…

C++关于socket中收发数据不完整问题

1、socket缓冲区 每一个socket在被创建之后&#xff0c;系统都会给它分配两个缓冲区&#xff0c;即输入缓冲区和输出缓冲区。 &#xff08;1&#xff09;send函数并不是直接将数据传输到网络中&#xff0c;而是负责将数据写入输出缓冲区&#xff0c;数据从输出缓冲区发送到目标…

【电路笔记】-晶体管作为开关

晶体管作为开关 文章目录 晶体管作为开关1、概述2、截止区域3、饱和区域4、示例5、晶体管开关类型及应用5.1 数字逻辑晶体管开关5.2 PNP晶体管开关5.3 达林顿晶体管开关6、总结1、概述 晶体管开关可用于通过使用处于饱和或截止状态的晶体管来打开或关闭低压直流设备(例如 LED…

python 蓝桥杯 之 字符串

文章目录 题目一find(str,start,end) 函数 题目一 find(str,start,end) 函数 在Python中&#xff0c;find()函数用于在字符串中查找子字符串&#xff0c;并返回第一次出现的子字符串的索引。如果找不到子字符串&#xff0c;则返回-1。find()函数的语法如下&#xff1a; str.f…

OpenHarmony开发—购物示例应用

介绍 本示例展示在进场时加载进场动画&#xff0c;整体使用Tabs容器设计应用框架&#xff0c;通过TabContent组件设置分页面&#xff0c;在子页面中绘制界面。通过Navigation完成页面之间的切换。在详情页中通过 Video组件加载视频资源&#xff0c;使用CustomDialogController…

探索 PostgreSQL 的高级数据类型 - 第二部分

范围类型 范围类型提供了一种简洁的方式来表示单个数据库字段中的值范围。它们在从时间数据到数字间隔的各种领域中都有应用。在本篇博客文章中&#xff0c;我们将通过 DML/SQL 语句和 Navicat for PostgreSQL 16 来深入了解它们的使用&#xff08;以及好处&#xff01;&#…

9个免费游戏后端平台

在这篇文章中&#xff0c;您将看到 九个免费的游戏服务平台提供商&#xff0c;这可以帮助您开始在线多人游戏&#xff0c;而无需预先投入大量资金。 每个提供商都有非常独特的功能&#xff0c;因此成本应该只是决定时要考虑的方面之一。 我还从低预算项目的角度对免费提供商进…

信钰证券|AI用电需求井喷 新能源板块“火花”四溅

近日&#xff0c;“ChatGPT耗电量惊人”登上热搜。据估算&#xff0c;ChatGPT每天要响应大约2亿个请求&#xff0c;日耗费电力超越50万度&#xff0c;相当于1.7万个美国家庭的用电量。 AI越智能&#xff0c;需要处理的信息就越多&#xff0c;所需电力也将呈几何级增加。马斯克…

SpringBoot注解--08--注解@JsonInclude

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 JsonInclude注解是jackSon中最常用的注解之一&#xff0c;是为实体类在接口序列化返回值时增加规则的注解 1.JsonInclude用法2.JsonInclude注解中的规则有 案例需求…

Kubernetes--ingress实现七层负载

目录 一、传统方式&#xff1a;不借助ingress实现七层代理 二、nginx-ingress 三、使用ingress实现七层代理 四、部署ingrss-nginx及功能 五、样例 1.Ingress-nginx HTTP代理访问 2.Ingress HTTPS代理访问&#xff08;会话卸载层&#xff09; 3.Nginx进行BasicAuth&…

第七届强网杯-PWN-【warmup】

文章目录 warmup libc 2.35检查IDA逆向maindeldelete_noteadd_noteshow_noteinput_numberread_16atoi __errno_location()相关解释prctl相关 思路高版本off by null利用技巧产生chunk extend泄露libc基地址泄露heap基地址修改放入tcachebin中的chunk的fd为stdout最后add两个chu…

专业138+总分400+南航南京航空航天大学878考研经验电子信息与通信工程,真题,大纲,参考书

经过一年的复习&#xff0c;顺利被南京航空航天大学录取&#xff0c;初试专业课878数字电路和信号与系统138&#xff0c;总分400&#xff0c;回看这一年的复习&#xff0c;从择校到考研备考经历了很多&#xff0c;也有很多想和大家分享的复习经验&#xff0c;希望对大家复习有所…

EI级 | Matlab实现GCN基于图卷积神经网络的数据多特征分类预测

EI级 | Matlab实现GCN基于图卷积神经网络的数据多特征分类预测 目录 EI级 | Matlab实现GCN基于图卷积神经网络的数据多特征分类预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.GCN基于图卷积神经网络的数据分类预测 Matlab2023 2.多输入单输出的分类预测&#xf…

docker学习进阶篇

一、dockerfile解析 官方文档&#xff1a; Dockerfile reference | Docker Docs 1.1、dockfile是什么&#xff1f; dockerfile是用来构建docker镜像的文本文件&#xff0c;由一条条构建镜像所需的指令和参数构成的脚本。 之前我们介绍过通过具体容器反射构建镜像(docker comm…

leetcode 热题 100_螺旋矩阵

题解一&#xff1a; 模拟&#xff1a;定义四个边界&#xff0c;指针按右下左上的顺序遍历&#xff0c;每遍历一条边&#xff0c;边界就减一&#xff0c;并且在某个方向没有可以遍历的数时直接返回。 import java.util.ArrayList; import java.util.List;class Solution {publi…

[AIGC] Kafka解析:分区、消费者组与消费者的关系

Apache Kafka是一个分布式事件流平台&#xff0c;它是处理实时数据的强大工具。而理解Kafka的关键概念&#xff1a;分区&#xff08;Partition&#xff09;、消费者组&#xff08;Consumer Group&#xff09;和消费者&#xff08;Consumer&#xff09;的关系对于正确地使用Kafk…