9个值得收藏的WebGL性能优化技巧

在这里,我们推荐一些经证明非常适合创建基于 Web 的交互体验的优化技术。 本章主要基于 Soft8Soft 在 Verge3Day Europe 2019 会议上的演讲。

在这里插入图片描述

推荐:用 NSDT编辑器 快速搭建可编程3D场景

1、几何/网格

几何是 3D 应用程序的基础,因为它构成了模型的主要形状。 为了获得更平滑的反射和更快的渲染,你应该尽可能保持网格规则。 一开始,你应该决定场景中想要的细节级别,并在建模时坚持这一点。

在这里插入图片描述

对折痕建模时,最好使用平滑组,而不是添加更多多边形:
在这里插入图片描述

在处理圆柱形模型时,请努力减少其中心的多边形数量。

在这里插入图片描述

不要让模型有用户无论如何也看不到的额外细节。 如下图所示,橙色突出显示的边缘定义了整个模型的细节程度,因此可以使用它作为参考。
在这里插入图片描述

2、法线贴图

优化 WebGL 性能的常见方法是通过将法线贴图从高多边形模型烘焙为低多边形模型来减少多边形数量。
在这里插入图片描述

然而,由于 8 位图像的精度有限,法线贴图可能会产生可见的伪影。 一些可能的解决方案如下图所示:使用更高精度(16位)的图像会产生更大的文件,而第二种方法使用带法线贴图的平滑组相当耗时,并且不能保证干净的结果。 第三种方法在某些情况下可能有效:如果你的表面相当粗糙,可以考虑向材质添加一些噪声以减少这些伪影。
在这里插入图片描述

根据我们的经验,我们发现光泽物体的最佳解决方案是使用带有平滑组的中间多边形几何体,并且没有任何法线贴图。
在这里插入图片描述

最后,在某些情况下你可能想要使用法线贴图而不是高度详细的网格:

  • 物体由许多不同的表面组成。
  • 表面粗糙,不会产生精密工件。
  • 对象距离较远或较小,因此用户不会注意到任何伪影。
    在这里插入图片描述

3、纹理化

这是 PBR 管道(以及一般情况)中使用的一组典型纹理。
在这里插入图片描述

正如你所看到的,大多数都是黑白的。 因此,可以将黑白纹理组合到单个图像的 RGBA 通道中,每个图像最多 4 个贴图。

在这里插入图片描述

如果你只有一个黑白纹理,可以通过将其打包到 Alpha 通道中将其与任何现有的 RGB 纹理组合起来。 最后,如果没有要合并的图像,可以将黑白图像转换为 jpeg 格式,压缩率为 95%,并启用灰度模式。
在这里插入图片描述

减小纹理大小的另一种方法是优化 UV 空间。 UV 展开越紧凑,图像使用纹理空间的效率就越高。 因此,可以获得较小的图像,而不会损失任何质量。

在这里插入图片描述

4、顶点颜色

使用顶点颜色而不是图像是加快加载速度并提高 WebGL 应用程序整体性能的有效方法。 尽管它是以额外的边为代价的,你必须将这些边添加到模型中才能分离不同的顶点颜色。
在这里插入图片描述

你还可以使用顶点颜色来定义粗糙度、金属度或镜面表面或任何其他参数。 下面可以看到此类材质的示例,其中仅使用顶点颜色。
在这里插入图片描述

5、着色器数量

这对于场景中减少不同的材质/着色器非常有益。 WebGL 中的着色器处理会导致加载时间延长,这在 Windows 上尤其明显。 此外,如果着色器较少,引擎在渲染时在它们之间切换的时间就会减少,从而提高性能。

如果有类似的材质,仅纹理不同,则可以仅使用一种材质并在运行时加载/交换其纹理。 为此,你可以使用替换纹理拼图或使用 JavaScript 来完成。 这不仅会优化着色器的数量,还会减少应用程序启动时加载的图像数量。
在这里插入图片描述

这是此类优化的一个示例。 所有这些轮胎仅由一种材料表示,并通过交换其纹理进行配置。
在这里插入图片描述

为了减少着色器的数量,可以将 2 种或多种简单材质组合成一种更大的材质。 如果你计划在这些材质之间切换(例如正在制作配置器应用程序),则此技术特别有效,因为这种方式运行速度更快,并且还允许动画过渡。
在这里插入图片描述

6、绘制调用

此外,还有一个重要的方面——绘制调用的数量。 该数字可以从打印性能信息拼图输出的几何缓冲区部分获得。 如果每个对象只分配一种材质,这大致相当于单独对象的数量,而多材质对象需要更多的绘制调用来渲染它们。

因此,你应该尽可能地加入网格,并减少使用独特的材质,以减少绘制调用的次数并提高性能。

在这里插入图片描述

你可以使用这个 在线工具进行材质的合批优化:
在这里插入图片描述

https://gltf.nsdt.cloud
如果你有一个动画对象,仍然可以将其各个部分连接在一起并使用骨骼进行动画,有时在为单独的对象制作动画时这样更方便。
在这里插入图片描述

7、高动态范围照明

如果仅通过 HDR 图像而不使用任何光源来照亮场景,将有助于大大提高性能。 HDR 文件的大小可能小于 1 Mb。
在这里插入图片描述

8、阴影

仅当动态阴影有助于很好地呈现对象时才使用动态阴影。 在下图中,工业机器人演示中使用的动态阴影强调了机器人模型的形状。 模型本身可以旋转,因此阴影无法向用户隐藏对象的任何部分。 另一方面,滑板车演示中的阴影会使许多细节变得模糊。
在这里插入图片描述

如果你的对象在应用程序中不移动,可以烘焙阴影和环境光遮挡贴图并将它们应用到对象下方的平面。

在这里插入图片描述

9、模型格式

最适合WebGL应用的3D模型格式是GLTF,因此别忘了将你的3D模型保存为GLTF或二进制的GLB,或者使用NSDT 3DConvert将其他格式的模型 转换为GLTF 或 转换为GLB:

在这里插入图片描述


原文链接:9个WebGL性能优化技巧 — BimAnt

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

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

相关文章

靠差异化上了短剧“牌桌”后,百度准备怎么做生态?

从最初的野蛮生长到如今的百花齐放,短剧市场已然进入了质量与创意的竞争。 据《中国网络视听发展研究报告》数据显示,行业内重点网络微短剧上线数量从2021年的58部,飙升到2022年的172部。相比起前几年处于风口时的爆发式增长,“分…

帧结构的串行数据接收器——Verilog实现

用Verilog 实现一个帧结构的串行数据接收器; 串行数据输入为:NRZ数据加位时钟(BCL)格式,高位在前 帧结构为:8位构成一个字,64字构成一个帧。每帧的第一个字为同步字。同步字图案存储在可由CPU读…

Linux——进程间通信(管道及共享内存)

目录 0. 前言 1. 进程通信的目的 2. 进程通信发展及分类 3. 进程通信匿名管道 3.1 什么是管道? 3.2 匿名管道系统调用 3.3 fork后子进程继承(基于内存级) 3.4 站在文件描述符角度-深度理解管道 3.5 站在内核角度-管道本质 3.6 父子…

C++之map迭代器函数begin、end、rbegin、rend、cbegin、cend、crbegin、crend总结(二百零五)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 人生格言: 人生…

MES管理系统和ERP系统在生产制造管理中的应用

MES生产管理系统通过过程管理、质量管理、设备管理、产品跟踪和溯源、性能分析和物料管理等方面来管理生产制造,旨在建立规范的生产管理信息平台,提高企业核心竞争力。ERP系统则通过制定生产计划、细分物料需求计划、车间订单下达和生产回报等步骤进行生…

耐蚀合金连续油管最新版 学习记录

声明 本文是学习GB-T 42858-2023 耐蚀合金连续油管. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 1 范围 本文件规定了耐蚀合金连续油管的订货、材料、制造、检验试验、标记等。 本文件适用于油气井用耐蚀合金连续油管(以下简称"油管")…

核心实验18_ospf高级_ENSP

项目场景: 核心实验18_ospf高级_ENSP 多区域虚链路 实搭拓扑图: 具体操作: R1: [R1]ospf 1 router-id 1.1.1.1 [R1-ospf-1]area 0 [R1-ospf-1-area-0.0.0.0]net 1.1.1.0 0.0.0.255 [R1-ospf-1-area-0.0.0.0]net 10.1.12.0 0.0.0.255 [R1-os…

阿里云服务器配置选择指南(2023新版教程)

阿里云服务器配置选择_CPU内存/带宽/存储配置_小白指南,阿里云服务器配置选择方法包括云服务器类型、CPU内存、操作系统、公网带宽、系统盘存储、网络带宽选择、安全配置、监控等,阿小云分享阿里云服务器配置选择方法,选择适合自己的云服务器…

Ubuntu18.04遇到的nodejs的坑记录

Ubuntu18.04安装nodejs的正确姿势 问题回顾 给我的博客网站整上代码高亮插件,在本地运行一切完美,可在我的Ubuntu18.04 bionic版本服务器上运行却报了以下的错误 ERROR in ./node_modules/highlight.js/lib/languages/xml.js Module parse failed: Er…

ArmSom-W3开发板之PCIE的开发指南(一)

1. 简介 RK3588从入门到精通本⽂介绍RK平台配置pcie的方法开发板:ArmSoM-W3 2、PCIE接口概述 PCIe(Peripheral Component Interconnect Express)是一种用于连接计算机内部组件的高速接口标准。以下是关于PCIe接口的简要介绍: …

uniapp 轮播列表左右滑动,滑动到中间放大

html <!-- 轮播 --><view class"heade"><swiper class"swiper" display-multiple-items3 circulartrue previous-margin1rpxnext-margin1rpx current0 change"swiperChange" ><block v-for"(item,index) in list"…

1020. 飞地的数量

1020. 飞地的数量 原题链接&#xff1a;完成情况&#xff1a;解题思路&#xff1a;参考代码&#xff1a; 原题链接&#xff1a; 1020. 飞地的数量 https://leetcode.cn/problems/number-of-enclaves/description/ 完成情况&#xff1a; 解题思路&#xff1a; /**输入&…

uni-app直播从0到1实战

1.安装开发工具 2.创建项目 参考&#xff1a;uniapp从零到一的学习商城实战_云澜哥哥的博客-CSDN博客 3.编写公共样式&#xff1a;common.css & free.css App.vue引入公共文件&#xff1a; 图标库&#xff1a;iconfont-阿里巴巴矢量图标库

ARM Linux DIY(十二)NES 游戏

文章目录 前言交叉编译工具链使能 Cnes 游戏模拟器移植游戏手柄调试 前言 很多小伙伴为了不让自己的 V3s 吃灰&#xff0c;进而将其打造成游戏机。 我们 DIY 的板子具备屏幕、扬声器、USB Host&#xff08;可以接游戏手柄&#xff09;&#xff0c;当然也要凑一凑热闹。 交叉编…

CentOS 7删除virbr0虚拟网卡

在CentOS 7的安装过程中如果有选择相关虚拟化的的服务安装系统后&#xff0c;启动网卡时会发现有一个以网桥连接的私网地址的virbr0网卡&#xff0c;这个是因为在虚拟化中有使用到libvirtd服务生成的&#xff0c;如果不需要可以关闭后去掉&#xff1a; 一、查看IP及网桥设备 [r…

[源码系列:手写spring] IOC第十三节:Bean作用域,增加prototype的支持

为了帮助大家更深入的理解bean的作用域&#xff0c;特意将BeanDefinition的双例支持留到本章节中&#xff0c;创建Bean,相关Reader读取等逻辑都有所改动。 内容介绍 在Spring中&#xff0c;Bean的作用域&#xff08;Scope&#xff09;定义了Bean的生命周期和可见性。包括单例和…

短剧解说小程序搭建,短剧解说小程序源码

短剧解说小程序搭建&#xff0c;短剧解说小程序源码 可定制开发小程序&#xff0c;H5&#xff0c;APP等系统 有需要可定制可出源码&#xff0c;这个是啥你懂的(VVVVVVVVVVV)&#xff1a;二五四九七八九零五九 需要源码或搭建可看上面的数字信息 短剧解说小程序搭建 小程序使用…

【案例教学】华为云API图像搜索ImageSearch的快捷性—AI帮助您快速归类图片

云服务、API、SDK&#xff0c;调试&#xff0c;查看&#xff0c;我都行 阅读短文您可以学习到&#xff1a;人工智能AI同类型的相片合并归类 1 IntelliJ IDEA 之API插件介绍 API插件支持 VS Code IDE、IntelliJ IDEA等平台、以及华为云自研 CodeArts IDE&#xff0c;基于华为云…

R5F5210BBDFB#10-ASEMI代理瑞萨芯片R5F5210BBDFB#10

编辑&#xff1a;ll R5F5210BBDFB#10-ASEMI代理瑞萨芯片R5F5210BBDFB#10 型号&#xff1a;R5F5210BBDFB#10 品牌&#xff1a;瑞萨&#xff08;Renesas) 封装&#xff1a;LFQFP-144 R5F5210BBDFB#10描述&#xff1a; R5F5210BBDFB#10具有1.62V至5.5V的宽工作电压范围&…

Linux内核4.14版本——drm框架分析(11)——DRM_IOCTL_MODE_ADDFB2(drm_mode_addfb2)

目录 1. drm_mode_addfb2 2. drm_internal_framebuffer_create 3. drm_fb_cma_create->drm_gem_fb_create->drm_gem_fb_create_with_funcs 4. drm_gem_fb_alloc 4.1 drm_helper_mode_fill_fb_struct 4.2 drm_framebuffer_init 5. 调用流程图 书接上回&#xff0c;使…