- Java锁的逻辑(结合对象头和ObjectMonitor)
- 还在用饼状图?来瞧瞧这些炫酷的百分比可视化新图形(附代码实现)⛵
- 自动注册实体类到EntityFrameworkCore上下文,并适配ABP及ABPVNext
- 基于Sklearn机器学习代码实战
在先前举办的华为开发者大会2022(HDC)上,华为通过3D数字溪村展示了自有3D引擎“HMS Core 3D Engine”(以下简称3D Engine)的强大能力。作为一款高性能、高画质、高扩展性的3D引擎, 3D Engine 不仅能通过实时光追、水体渲染、体积云雾、多维GPU粒子系统等技术还原真实世界的物理表现,对于大规模数字世界的实时渲染,3D Engine同样也能为开发者提供有力的技术支持.
今天,如何更好地实现大场景下的实时渲染,已经成为行业的热门话题,相关技术在众多领域都有着广阔的应用前景。我们可以明显感受到,从3D游戏到虚拟现实,从三维GIS到数字城市,涉及场景的规模都在呈指数级增长,部分游戏中的世界地图甚至没有边界。可以说, 大规模场景的实时交互渲染能力正在成为构筑数字世界的基础设施 .
然而,这并非易事.
场景规模的扩大带来的结果就是海量的内容和数据。一个城市涉及的物件数差不多是百万级,面片数更是可能达到亿级,而硬件配置却始终是相对有限的,即使再高级的硬件配置也有力不从心的时候.
• 由于物件、网格、材质等内容数量太多,受限于显存容量,传统的全场景预先加载方式无法实现; 。
• 在传统3D绘制模式下,GPU的算力不足以支撑万级规模物件数和亿级规模面片的实时渲染; 。
• 如果使用流式加载场景的方式,可以实现一边渲染一边加载数据,但需要预处理场景数据,诸如分区分层、模型合并、材质合并、纹理烘焙等预处理往往极为耗时,几万个物件就需要小时级的等待,且仅支持场景中静止不动的物件.
譬如上图这个服务器大楼,三角面片数达到了千万级,并且有将近万件的模型。为了实现实时渲染,通常需要通过HLOD的方式将整个场景进行Spatial-Coherent的层次重组.
类似于右图红圈所示,以不同半径为一个空间节点,将圈圈内的模型进行合并处理,从而降低场景物件的遍历数量,提高绘制性能。而这个预处理操作本身就需要耗费近一个小时,大大增加了调试和开发成本.
那么,HMS Core 3D Engine将如何应对挑战,构建大规模场景的实时渲染能力?
为了解决这三个“放不下”、“算不了”、“等不起”的问题,华为2012菲尔兹实验室基于HMS Core 3D Engine 自研了“Hi-Mesh”层级网格渲染加速技术,针对场景中的资产进行多维度、多层级的结构优化,确保场景结构在生成、遍历、处理过程中的高效。譬如针对一个大规模场景,可将其数字内容进行多维分区:
3D场景中利用物件原生隐含的空间属性,进行快速位置编码和索引,大幅降低传统树形结构的线性遍历耗时; 。
利用视角的局限性,对场景中的物件进行不同细节层次的区分或合并处理,从而降低场景的数据量; 。
利用场景物件的特征,如按网格、材质的同源性进行分组,从而使用特定优化的绘制指令来强化它们的绘制效率; 。
将模型网格进行更精细粒度的分片,实现高效率的剔除和遮挡操作,优化实时渲染的性能.
Hi-Mesh架构图 。
基于将场景化整为散的原则,以高效率的空间/视角结构来实现多层级的数据优化,并以GPU驱动的方式,最终实现百万级物件、亿级片面的数字世界的实时渲染.
一千个物件实时动态更新 。
为了实现上述的操作, 3D Engine 使用了一种隐式编码树的空间层次结构——“ Hi-Mesh Tree ”。不同于传统基于链表形式的空间结点树的方式,3D Engine通过一种常量级性能的构造和遍历方法,相较现有的商业引擎,大规模场景的实时渲染性能可提升15%~120%。此外,还可以大幅提升三维空间场景组织结构的生成效率,甚至达到毫秒级,大大降低了工作流的时间成本.
数据来源: 华为内部实验室测试结果 。
同时, 3D Engine 还使用了 基于GPU驱动的Cluster Rendering (GDCR)绘制技术 .
GPU驱动在业界已有一些探索和应用,其理想目标是用一个Draw Call(DC)来绘制整个场景,以充分发挥GPU的并行流水线能力,实现渲染性能的提高。下图是Ubisoft 在Siggraph 15上提出的GPU驱动管线的架构图,其核心思想就是将原本基于CPU的可视性检测处理迁徙到GPU上,利用GPU的并行和可编程能力,提供高并发、不同粒度的可视性检测能力,从而大幅提高渲染性能.
3D Engine 为了更充分的实现GPU驱动的效率,对GPU驱动的管线节点、数据传输、图形资产进行深度优化和耦合,将场景下的所有3D物件在GPU上进行各个维度(包围盒、实例、片区、三角面)的可视性剔除,配合多层的重组(材质、顶点),从而实现以最少量的绘制指令来实现场景的光栅化和着色,同等规模场景下相比传统模式的渲染性能实现了翻倍.
同等规模场景下渲染性能对比 。
可以预见,未来的数字世界无论是元宇宙、数字孪生、还是开放大世界,趋于庞大的丰富多彩场景都将会是不可或缺的组成部分。在Hi-Mesh技术的加持下, 3D Engine 得以通过高效的空间层级结构和GPU友好的绘制管线,大幅提高大规模数字场景下的实时渲染能力,使场景中的3D内容“尽情放”、“更快看”、“少等待”,帮助开发者大大提升生产力.
3D Engine 是HMS Core面向行业伙伴推出的重要图形能力,不仅提供高性能、高画质、高扩展性的实时3D引擎,配合低代码的可视化开发,能够帮助开发者便捷高效地创造出高品质的3D内容和体验。如需进一步了解更多信息,请访问: developer.huawei.com/consumer/cn/hms/3d-engine/?ha_source=hms1 。
了解更多详情>> 。
访问 华为开发者联盟官网 获取 开发指导文档 华为移动服务开源仓库地址: GitHub 、 Gitee 。
关注我们,第一时间了解 HMS Core 最新技术资讯~ 。
最后此篇关于如何优化大场景实时渲染?HMSCore3DEngine这么做的文章就讲到这里了,如果你想了解更多关于如何优化大场景实时渲染?HMSCore3DEngine这么做的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我有一个关于 JavaScript 语法的问题。实际上,我在自学 MEAN 堆栈教程时想出了编码(https://thinkster.io/mean-stack-tutorial#adding-aut
在我的书中它使用了这样的东西: for($ARGV[0]) { Expression && do { print "..."; last; }; ... } for 循环不完整吗?另外,do 的意义何
我已经编写了读取开关状态的代码,如果按 3 次 # 则退出。 void allkeypadTest(void) { static uint8_t modeKeyCount=0; do
因此,对于上周我必须做的作业,我必须使用 4 个 do-while 循环和 if 语句在 Java 中制作一个猜谜游戏。我无法成功完成它,类(class)已经继续,没有为我提供任何帮助。如果有人可以查
int i=1,j=0,n=10,k; do{ j+=i; i<<1; printf("%d\n",i); // printf("%d\n",12<<1); }while
此代码用于基本杂货计算器的按钮。当我按下按钮时,一个输入对话框会显示您输入商品价格的位置。我遇到的问题是我无法弄清楚如何获得 do ... while 循环以使输入对话框在输入后弹出。 我希望它始终恢
当我在循环中修改字符串或另一个变量时,它的条件是否每次都重新计算?或者在循环开始前一次 std::string a("aa"); do { a = "aaaa"; } while(a.size<10)
我刚刚写了这个,但我找不到问题。我使用代码块并编写了这个问题 error: expected 'while' before '{' token === Build finished: 1 errors
do { printf("Enter number (0-6): ", ""); scanf("%d", &Num); }while(Num >= 0 && Num 表示“超过”,<表
我有一个包含 10 个项目的 vector (为简单起见,所有项目都属于同一类,称其为“a”)。我想要做的是检查“A”不是 a) 隐藏墙壁或 b) 隐藏另一个“A”。我有一个碰撞函数可以做到这一点。
嗨,这是我的第二个问题。我有下表 |-----|-------|------|------| |._id.|..INFO.|.DONE.|.LAST.| |..1..|...A...|...N..|.
这个问题在这里已经有了答案: 关闭 12 年前。 Possible Duplicates: Why are there sometimes meaningless do/while and if/e
来自 wikibook在 F# 上有一小部分它说: What does let! do?# let! runs an async object on its own thread, then it i
我在 Real World Haskell 书中遇到了以下函数: namesMatching pat | not (isPattern pat) = do exists do
我有一个类似于下面的用例,我创建了多个图并使用 gridExtra 将它们排列到一些页面布局中,最后使用 ggsave 将其保存为 PDF : p1 % mutate(label2
当我使用具有 for 循环的嵌套 let 语句时,如果没有 (do (html5 ..)),我将无法运行内部 [:tr]。 (defpartial column-settings-layout [&
执行 vagrant up 时出现此错误: anr@anr-Lenovo-G505s ~ $ vagrant up Bringing machine 'default' up with 'virtua
# ################################################# # Subroutine to add data to the table Blas
我想创建一个检查特定日期格式的读取主机。此外,目标是检查用户输入是否正确,如果不正确,则提示应再次弹出。 当我刚接触编程时,发现了这段代码,这似乎很合适。我仍然在努力“直到” do {
我关注这个tutorial在谷歌云机器学习引擎上进行培训。我一步一步地跟着它,但是在将 ml 作业提交到云时我遇到了错误。我运行了这个命令。 sam@sam-VirtualBox:~/models/r
我是一名优秀的程序员,十分优秀!