用PlayCanvas打造一个令人惊叹的3D图在线展示

Alt

本文由ScriptEcho平台提供技术支持

项目地址:传送门

PlayCanvas实例化渲染:大规模渲染优化

应用场景

在游戏开发中,经常需要渲染大量相同或相似模型。传统方法需要为每个模型创建单独的渲染对象,这会消耗大量内存和GPU资源。实例化渲染技术通过为多个模型使用相同的渲染对象来解决这个问题,大大提高了渲染效率。

基本功能

本代码展示了如何在PlayCanvas中使用实例化渲染技术。它创建了一个场景,其中包含一个带有大量圆柱体的实体。这些圆柱体共享相同的材质和网格,但具有不同的变换。

功能实现步骤

  1. **初始化PlayCanvas:**首先,我们使用PlayCanvas库创建了一个画布和一个应用程序对象。

  2. **加载资产:**接下来,我们加载了一个纹理资产,它将用于创建天空盒。

  3. **创建场景:**我们创建一个场景,并设置其天空盒、曝光和色调映射。

  4. **创建相机:**我们创建一个带有相机组件的实体,并将其添加到场景中。

  5. **创建材质:**我们创建一个标准材质,启用光泽度和金属度。

  6. **创建圆柱体实体:**我们创建一个实体,并为其添加一个使用该材质的圆柱体渲染组件。

  7. **启用实例化:**如果图形设备支持实例化,我们将创建包含多个模型变换的顶点缓冲区。

  8. **设置更新函数:**我们设置一个更新函数,不断旋转相机,以展示实例化渲染效果。

关键代码分析

if (app.graphicsDevice.supportsInstancing) {
  // number of instances to render
  const instanceCount = 1000

  // store matrices for individual instances into array
  const matrices = new Float32Array(instanceCount * 16)
  let matrixIndex = 0

  const radius = 5
  const pos = new pc.Vec3()
  const rot = new pc.Quat()
  const scl = new pc.Vec3()
  const matrix = new pc.Mat4()

  for (let i = 0; i < instanceCount; i++) {
    // generate random positions / scales and rotations
    pos.set(
      Math.random() * radius - radius * 0.5,
      Math.random() * radius - radius * 0.5,
      Math.random() * radius - radius * 0.5,
    )
    scl.set(
      0.1 + Math.random() * 0.1,
      0.1 + Math.random() * 0.3,
      0.1 + Math.random() * 0.1,
    )
    rot.setFromEulerAngles(i * 30, i * 50, i * 70)
    matrix.setTRS(pos, rot, scl)

    // copy matrix elements into array of floats
    for (let m = 0; m < 16; m++) matrices[matrixIndex++] = matrix.data[m]
  }

  // create static vertex buffer containing the matrices
  const vbFormat = pc.VertexFormat.getDefaultInstancingFormat(
    app.graphicsDevice,
  )
  const vertexBuffer = new pc.VertexBuffer(
    app.graphicsDevice,
    vbFormat,
    instanceCount,
    {
      data: matrices,
    },
  )

  // initialize instancing using the vertex buffer on meshInstance of the created box
  const cylinderMeshInst = cylinder.render.meshInstances[0]
  cylinderMeshInst.setInstancing(vertexBuffer)
}

这段代码实现了实例化渲染。它首先生成一系列随机变换矩阵,然后将这些矩阵存储在一个顶点缓冲区中。最后,将顶点缓冲区分配给圆柱体实体的渲染组件,启用实例化。

总结与展望

开发这段代码使我们深入了解了PlayCanvas中实例化渲染技术的使用。它提高了渲染效率,使我们能够在场景中显示大量对象,而不会出现性能问题。

未来,我们可以通过探索以下方面来扩展和优化此功能:

  • **LOD(层次细节):**根据对象的距离或重要性使用不同的LOD级别,以进一步优化性能。

  • **批处理:**将类似的实例分组到一起,以减少绘制调用次数。

  • **GPU粒化:**使用GPU粒子系统来生成和渲染大量对象,从而获得更高的视觉保真度。

    更多组件:



    获取更多Echos

    本文由ScriptEcho平台提供技术支持

    项目地址:传送门

    扫码加入AI生成前端微信讨论群:

扫码加入群聊

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

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

相关文章

问你为什么选择Kafka,你会怎么回答?

可靠的含义在百度百科的解释是&#xff1a;可以信赖、可以相信、可靠的朋友。那Kafka究竟是不是一个可靠的朋友呢&#xff1f;既然全世界绝大部分高可用系统都有Kafka的支持&#xff0c;Kafka必定有其过人之处&#xff0c;跟着我来分析分析。 另外多提一嘴Kafka在GitHub目前已…

【AIGC X UML 落地】通过多智能体实现自然语言绘制UML图

前天写了篇博文讲到用PlantUML来绘制C类图和流程图。后台有读者留言&#xff0c;问这步能否自动化生成&#xff0c;不想学习 PlantUML 语法。 我想了下&#xff0c;发现这事可行&#xff0c;确实可以做到通过自然语言的描述就能实现 UML图的绘制&#xff0c;昨天晚上加了个班到…

安装TPMmanager

sudo apt-get install qt4-qmake sudo apt-get install libqt4-dev下载TPMManager&#xff0c;解压之后拖入Ubuntu&#xff0c;进入目录 https://gitcode.com/Rohde-Schwarz/TPMManager/overview?utm_sourcecsdn_github_accelerator&isLogin1 cd tpmmanager-master qmake…

快速排序(Quick Sort)(C语言) 超详细解析!!!

生活的本质是什么呢? 无非就是你要什么就不给你什么. 而生活的智慧是什么呢? 是给你什么就用好什么. ---马斯克 索引 一. 前言二. 快速排序的概念三. 快速排序的实现1. hoare2. 挖坑法3. 前后指针法 总结 正文开始 一. 前言 接上文, 前面我们了解了插入排序, 与优化版本希尔…

Vulnhub-DC-2

靶机IP:192.168.20.135 网络有问题的可以看下搭建Vulnhub靶机网络问题(获取不到IP) kaliIP:192.168.20.128 扫描靶机端口及服务版本 发现开放了80和7744端口 并且是wordpress建站 dirsearch扫描目录 访问前端界面&#xff0c;发现存在重定向 在hosts文件中增加192.168.2…

【UML用户指南】-09-对基本结构建模-类图

目录 1、概述 2、引入 3、过程 4、常用建模技术 4.1、对简单协作建模 4.2、对逻辑数据库模式建模 4.3、正向工程 1、概述 类图是面向对象系统建模中最常见的图。 类图显示一组类、接口、协作以及它们之间的关系 类图用于对系统静态设计视图建模。其大多数涉及到对系统的…

这个世界,对于心态好的人,就是个大游乐场,越刺激越好玩。对于胆小鬼,那就是地狱,随时随地都会受伤

心态决定你的世界&#xff1a;游乐场还是地狱 在这个充满变数的世界里&#xff0c;我们的心态决定了我们看待世界的方式。对于心态积极的人来说&#xff0c;世界就像一个巨大的游乐场&#xff0c;每一个挑战都是一个新的游戏&#xff0c;每一个刺激都是乐趣的一部分。而对于那…

纷享销客安全体系: 组织及人员安全

组织及人员安全是纷享销客安全战略中的重要组成部分。 我们致力于确保组织内部和员工的安全&#xff0c;并采取一系列措施来预防和应对安全威胁。我们将持续改进和更新安全措施&#xff0c;以适应不断变化的威胁环境&#xff0c;并确保组织和员工的安全意识和培训得到充分关注…

鹧鸪云设计系统:太阳能光伏发电设计图纸绘制全攻略

随着全球对可持续能源的需求不断增加&#xff0c;越来越多的人开始关注太阳能发电技术。对于初学者来说&#xff0c;掌握一套有效的太阳能光伏发电设计图纸至关重要。本为了实现这一目标&#xff0c;鹧鸪云设计系统的出现为初学者的电站图纸绘制降低了难度。 接下来&#xff0c…

微信小程序uniapp的父子之间的通信传递

1.父传递给子信息 my-test是子组件 demo是父组件 这是定义在父组件中的的info信息 要将这个传递给子组件 子组件在properties 中接收父组件传递来的数据 msg type 是类型 value是默认值&#xff0c;当父组件没有传递数据时&#xff0c;就会默认使用value的数据 子组件…

STM32 音乐播放器之音频入门实验(pwm、dac、.wav、.mp3)

1.pwm实现简易电子琴实验 1.改变PWM频率&#xff0c;输出不同音调 2.改变占空比&#xff0c;调节音量大小 3.按键弹奏&#xff0c;支持按按键录取弹奏音 4.播放:中高低音&#xff1b;录取音&#xff1b;指定歌曲 5.支持按上一首&#xff0c;下一首&#xff0c;调弹奏速度&#…

To C道路越走越夯实,1688彻底变身了?

在偌大的电商市场&#xff0c;消费者都是专业的“掘宝者”&#xff0c;热衷于发现各种新奇商品和采购新通路。 拼多多、1688等平台也正是在这种情况下&#xff0c;成为消费市场的“宠儿”。其中&#xff0c;1688的发展路径较为独特&#xff0c;据天眼查&#xff0c;其为源头厂…

springboot大学生就业管理系统-计算机毕业设计源码89344

摘 要 信息化社会内需要与之针对性的信息获取途径&#xff0c;但是途径的扩展基本上为人们所努力的方向&#xff0c;由于站在的角度存在偏差&#xff0c;人们经常能够获得不同类型信息&#xff0c;这也是技术最为难以攻克的课题。针对大学生就业管理系统等问题&#xff0c;对大…

【Linux取经路】信号的发送与保存

文章目录 一、重新理解发送信号二、信号的保存、阻塞信号的概念三、信号集操作函数3.1 sigprocmask3.2 sigpending 四、阻塞信号代码验证五、结语 一、重新理解发送信号 进程通过位图来实现对普通信号&#xff08;1-31号信号&#xff09;的保存&#xff0c;该位图保存在进程的…

TikTok广告投放攻略——广告类型详解

TikTok广告是品牌或创作者付费向特定目标受众展示的推广内容&#xff08;通常是全屏视频&#xff09;。TikTok 上的广告是一种社交媒体营销形式&#xff0c;通常旨在提高广告商的知名度或销售特定产品或服务。 就 TikTok广告投放而言&#xff0c;其组织层级分为三个层级&#x…

数据库基本知识

感觉面试的时候面试官大多数都必问数据库&#xff0c;也可以理解&#xff0c;企业肯定会涉及到大规模数据存储&#xff0c;那么数据库存储就一定会用到数据库。做一些数据库相关的基本知识总结&#xff0c;持续更新~ 【死锁专题】 1.如何解决数据库并发造成的安全问题&#x…

【LeetCode 滑动窗口】LC_3_无重复字符的最长子串

文章目录 1. 无重复字符的最长子串 1. 无重复字符的最长子串 题目链接&#x1f517; &#x1f34e;题目思路&#xff1a;&#x1f427;① 滑动窗口的思想&#xff1b;&#x1f427;② 用什么来维护窗口呢 &#xff1f; 用 双指针 和 unordered_set来维护&#xff0c;为什么呢…

从 LangChain 中学习检索增强

前言 之前讲了一些关于 RAG 的使用技巧和经验&#xff0c;今天我们提供两个进阶版的文本切分和检索的方法&#xff0c;希望对你有所帮助。以下两种方法取自 LangChain 的官方示例&#xff0c;感兴趣也可以直接去阅读官方文档。 一、父文档检索 Parent Document Retriever 当…

瑞萨芯片简介和工具链使用

文章目录 前言一、RH850简介二、瑞萨开发工具链1.e2studio2.IAR For RH8503.CS+ for CC4.GHS前言 瑞萨RH850 MCU家族,专为高端汽车应用而设计。MCU家族中的不同成员,如RH850/F1x、RH850/P1x、RH850/D1x、RH850/E1x和RH850/C1x,每个成员针对特定的应用领域。 RH850 F系列的…

数据结构(3)栈、队列、数组

1 栈 1.1 栈的定义 后进先出【LIFO】 1.2 基本操作 元素进栈出栈 只能在栈顶进行&#xff01;&#xff01;&#xff01; 经常考的题&#xff1a; 穿插的进行进栈和出栈 可能有多个选项 1.3 顺序栈 1.3.1 初始化 下标是从0开始的 1.3.2 进栈 更简单的写法&#xff1a; 1.3…