大地图开发管理:《巫师3》Umbra遮挡剔除技术

本演讲介绍巫师3使用Umbra实现的遮挡剔除技术。

笔记略过了一些过于平凡的实现细节,包括流的加载,如何向Umbra提交数据;也略过了一半以上关于“游戏应当如何选择中间件”的讨论。

Umbra 3

Umbra是一个芬兰中间件公司,做出核心技术之后,于2007年成立,专注于解决3d可见性。可以看到国外的创业公司相当的小而美,公司2014年的时候只有14个雇员,居然还分到了两个国家:在西雅图有自己的销售分部,面向全球销售。最近搜了下已经有4个销售部了。另一篇文章中提到巫师3使用Simplygon做LOD,可以发现国外有不少中间件公司,这些公司可能很小,但是相当专业。

在和各公司密切合作的过程中,Umbra会根据对方的需求(例如Bungie公司),对技术做相应演进。使用Umbra技术的产品包括:
 

  • Call Of Duty-Ghost
  • Destiny
  • KillZone-Shadow Fall
  • The Witcher 3-Wild Hunt
  • Unity(按:Unity确实是使用Umbra作为中间件的。不过应该不支持动态拼合)



Wichter 3的引擎团队与中间件选择

Wichter2开始使用自研RED Engine,现在是第三代。巫师2加强版是2012,巫师3是2015,比前作大35倍,开发了一个复杂的流式加载系统,改造了很多美术工作流工具。引擎团队50人左右,其中有16名左右的程序员,其他是QA和本地化人员。

选择中间件,最主要的理由是人力限制:你永远没有足够的人力来做所有细节。选择要点:
 

  • 文档和支持
  • 最好有源代码
  • 最好能为项目做定制需求



选择和实施时的技术要点
 

  • 内存管理:最好能定制分配器,以便跟踪库的内存使用情况
  • 最好支持多线程。Umbra的烘焙和查询都支持多线程



巫师3使用的中间件
 

  • Umbra 3
  • PhysX,以及其扩展插件APEX
  • SpeedTree
  • Wwise
  • Scaleform



Umbra方:剔除数据的流式加载

Umbra是这么工作的:输入需渲染的所有多边形集合,称为多边形汤,离线预处理后生成遮挡数据卷(tome)。对数据卷进行查询返回可见物体。他的最大优点是自动化:
 

  • 不需要手工标记
  • 不需要美术进行简化,直接输入渲染用的多边形集合



所以对于美术和程序来说非常友好,你只需要提供直接的数据就可以了。
 


此时Witcher3的需求是:
 

  • 大型开放世界,所以无法用人工方式处理。这很适合Umbra全自动流程
  • 流式加载,并需要处理LOD,这个是需要解决的



流式加载

为了实现流式加载,Umbra将世界切成矩形地块,分开烘焙,每个地块一个数据卷。在运行期,根据摄像机的当前坐标和视距,加载局部地块的数据卷,然后通过计算合并为一个综合的遮挡数据卷集合,提交给渲染系统查询。出区域的地块可以被卸载。

对于Umbra来说,这个算法的实现难点在于:
 

  • 每个块必须独立。即使计算遮挡数据特别是在边界时,非常想利用其他块的数据,也是不行的
  • 边界的匹配。邻居块的设置参数可能不一样,有时候需要使用很巧妙的技巧
  • 计算必须非常快,必须在几毫秒内完成。基本上都是每帧或者隔帧查询。



不过,在演讲后有人提问的情况下,都没有解释任何具体算法。
 

左图:预处理的分块。右图:根据摄像机视野判断的需加载数据块


LOD

要实现LOD,必须防止同一个物体的不同LOD将自己遮挡了。Umbra使用一个很简单的方案,严格区分遮挡者与被遮挡者两个概念,只有LOD0(即最高精度的版本)有遮挡能力,其他LOD都只能被遮挡。

Umbra查询后直接返回LOD。每级LOD有一个激活距离,通过距离做裁剪,这样做极大提高了查询性能。此外,可以手工指定距离计算使用的参考点,得到更高清的LOD版本,以便处理放大镜头。

Umbra考虑过更复杂的策略,例如,按屏幕面积选择LOD等级;又如,使用所有LOD的交集,而不是直接使用最精细的LOD0来计算遮挡(按:这是理论上最准确的结果,可能也会小幅加速)。但是总的来说,目前的简化方法是足够管用的。

流式加载的过程和效果

为了调试,提供了一个自由摄像机系统,二手手机转让平台可以暂时离开主角,观察当前的流式加载状态。此外将流式加载的过程、内存占用、模型统计、Umbra的统计数据可视化。

32:00开始有一段移动过程视频。其中绿色表示已加载的块,黄色表示流式加载中的块(加载是异步的)。


同一个城市的三种情况。第一个是典型的情况:主角在城镇门口,第三人称相机。只有城市前面的物体被显示,其他被剔除。
 


最差的情况:从天空鸟瞰城市,整个城市基本都可见。
 


最好的情况,主角在小巷中,玩家只能看到非常少的建筑物。此时:
 

  • 加载了43个遮挡数据块
  • 遮挡数据块共61M,外加动态生成的数据块间数据15M
  • 62000个模型块(Mesh Chunk)
  • 500个模型块可见
  • 1.8ms查询时间



其中模型块是模型的子部件,如下图绿色部分为不同的模型块。剔除以模型块为单位,所以可以只看见一个塔的塔尖。
 


此外,该遮挡系统通过包围盒支持动态物体,可以剔除包括:
 

  • 粒子特效
  • 蒙皮mesh
  • 模拟mesh(按:不知道是啥)
  • 贴片,包括动态和烘焙的



数据生成

使用专门的服务器组,在每夜构建时生成全部数据。同时,可以在编辑器里面手工更新。每个地块256*256m。烘焙时间最少几秒,最复杂的地块需要15~20分钟。

实测性能

Skillige岛屿
 

  • 8*8km
  • 平均加载45000~50000个模型块
  • 平均可见1~5%
  • Umbra数据~300M(数据+ID表)
  • 40~80M内存占用



Novigard城(刚才图片中的城市)
 

  • 8.5*8.5km
  • 平均加载超过100k个模型块
  • 平均可见2~5%
  • Umbra数据~250M
  • 45~80M内存占用


 


43:40开始展示漫游过程,推荐看一下,可以看到模型块拆分得非常细:
 

  • 视频中房顶的两个侧面是两个块
  • 最近处左下角房顶的正面的绿色草,就有3~4个块,在视角移动时开关。



阴影图目前还没有使用剔除系统,但是理论上用起来很简单,只需要先提交投影方向的查询就行。物理部分也没有使用该系统。

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

《巫师3:狂猎》4.01版更新 PC端已上线

去年12月,《巫师3》免费升级次世代版,加入DLSS 3支持,RTX 40系显卡的用户能直接提升体验感,RTX 30系用户能通过DLSS 2获得更稳定的帧数。 目前。《巫师3:狂猎》4.01版已更新上线,在PC、PlayStation 和 Xbo…

哈利波特3 阿兹卡班的囚徒

《哈利波特3阿兹卡班的囚徒》DVD国语配音高清收藏版《哈利波特3:阿兹卡班的囚徒》 片名:Harry Potter and the Prisoner of Azkaban 译名:哈利波特3:阿兹卡班的囚徒 导演:阿方索卡隆Alfonso Cuaron 主演:丹…

昆特牌显示无法连接至服务器,巫师之昆特牌总是显示无法连接网络

巫师之昆特牌这款游戏相信大家都不陌生吧,最近小编经常收到巫师之昆特牌总是显示无法连接网络问题的反馈,接下来小编就为大家提供几种常见的处理方案。 巫师之昆特牌游戏简介 《巫师之昆特牌》是由CD PROJEKT RED开发的一款卡牌类游戏。 游戏的主角是北方…

c语言谭浩强百草园有卖吗,巫师3白果园有什么神器

巫师3这款游戏中,装备对玩家是有一定的影响的,在白果园中隐藏着两个前期神器,是两件毒蛇学派的装备,在哪里呢,下面游戏吧小编为大家带来介绍。 巫师3白果园有什么神器 白果园神器指的是白果园中毒蛇学派的毒蛇钢剑和毒…

讯飞星火认知大模型与ChatGPT的对比分析

引言: 人工智能是当今科技领域的热门话题,自然语言处理是人工智能的重要分支。自然语言处理的目标是让计算机能够理解和生成自然语言,实现人机交互和智能服务。近年来,随着深度学习的发展,自然语言处理领域出现了许多创…

【数据结构6】二叉树的基本操作

文章目录 ⭐️写在前面的话⭐️二叉树的一些基本操作1、结构定义2、先序创建这棵树3、按满二叉树方式创建4、三种递归遍历5、层次遍历6、求二叉树的深度7、求叶子结点数8、三种非递归遍历9、先序线索化二叉树10、先序线索化后遍历11、中序线索化二叉树12、中序线索化后遍历主函…

C语言——每日一题

1.倒置字符串 倒置字符串 要将每一个单词逆序输出,首先可以将整个字符串内容都逆序输出,然后再将字符串中的每一个单词再进行逆序。 例如:逆序 i like beijing. 先逆序成:.gnijieb ekil i 再将每个单词逆序: beij…

Matlab实现曲线拟合的最小二乘法

实验条件 实验用例 x0102030405060708090y6867.166.465.664.661.861.060.860.460 实验要求 利用曲线拟合的线性最小二乘法求被逼近函数f(x)在点x55处的近似值,并画出实验数据和直线。 代码实现 X[0,10,20,30,40,50,60,70,80,90]; Y[68,67.1,66.4,65.6,64.6,61.…

达梦数据库8安装教程

第一步:双击驱动 注意:如果双击显示没有驱动,则安装WinCDEmu软件。 第二步:双击setup.exe安装包 第三步:选择时区 第四步:验证key文件 因为我们是免费试用,所以没有key文件,直接下一…

线性回归——最小二乘法

线性回归:自变量和因变量之间是线性关系,例如:h a0a1x1a2x2…anxn。线性回归预测的一般步骤:假设特征变量Xi满足线性关系,然后根据给定的训练数据训练出一个模型,最后通过此模型进行预测。线性回归的根本就…

最小二乘法多项式曲线拟合原理与实现(数学公式详细推导,代码方面详细注释)

最小二乘法概念: 最小二乘法(又称最小平方法)是一种数学优化技术。它通过最小化误差的平方和寻找数据的最佳函数匹配。利用最小二乘法可以简便地求得未知的数据,并使得这些求得的数据与实际数据之间误差的平方和为最小。最小二乘…

对「曲线拟合」和「最小二乘法」的个人理解

在工程实践中,经常遇到类似的问题: 我们做了n次实验,获得了一组数据 然后,我们希望知道x和y之间的函数关系。所以我们将其描绘在XOY直角坐标系下,得到下面这么一张点云图: 然后,我们发现,x和y…

最小二乘法实现曲线拟合

说明,本文章的源代码来着于网络,本人已在实际项目中反复使用过,证明没问题。 1.简介 已知曲线上的n个点,可以使用某条曲线去拟合,使得整体上所有的点都逼近曲线,可以使用不同的角度去判断整体逼近&#x…

最小二乘法直线拟合汇总

原文链接:https://www.jianshu.com/p/1c4f3edbaa47 首先最小二乘法是面对不连续的离散点。 它的本质是求某些参数,估计值在整体下可以使误差ε最小。 对于离散点的直线拟合、曲线拟合是在满足误差最小的基础上,得出可以用数学函数式表达的可…

线性回归----最小二乘法

目录 线性回归:就是把离散的数据拟合到一条直线上,获得一个直线方程来近似的描述这些离散的数据 最小二乘法:是用数学公式直接求解线性回归方程的参数的方法。 例: 使用美国汽车油耗数据中的排量disp作为X,油耗MPG作…

曲线拟合——最小二乘拟合(附代码)

曲线拟合——最小二乘拟合(附代码) 曲线拟合1 一元函数的最小二乘拟合1.1 线性回归(直线的最小二乘拟合)1.1.1 直线的最佳拟合方法1.1.2 如何计算1.1.3 误差量化分析 1.2 多项式回归(多项式的最小二乘拟合)…

插值与拟合 (二) : 曲线拟合的线性最小二乘法

目录 1 线性最小二乘法 最小二乘准则 系数 的确定 1.2 函数 的选取 常用的拟合曲线:直线、多项式曲线、双曲线、指数曲线 2 最小二乘法的 Matlab 实现 2.1 解方程组方法 2.2 多项式拟合方法 apolyfit(x0,y0,m) …

最小二乘法多项式曲线拟合及其python实现

最小二乘法多项式曲线拟合及其python实现 多项式曲线拟合问题描述最小二乘法针对overfitting,加入正则项python实现运行结果 多项式曲线拟合问题描述 问题描述:给定一些数据点,用一个多项式尽可能好的拟合出这些点排布的轨迹,并给…

数值分析——曲线拟合的最小二乘法

文章目录 一、曲线拟合的最小二乘原理1. 超定方程组的最小二乘解解题方法: 2. 直线拟合3. 多项式拟合 一、曲线拟合的最小二乘原理 拟合曲线定义:求近似函数 φ(x), 使之 “最好” 的逼近f(x) ,无需满足插值原则. 这就是曲线拟合问题。 (时间…

最小二乘法的曲线拟合方法在MATLAB中的实现

一、实验内容 已知一组实验数据如下表,求它的拟合曲线。 x(i)12345 f(i)44.5688.5 w(i)21311 二、程序清单与运行结果 M文件代码如下: function Smypolyfit(X,F,W,m,n) % mypolyfit输出通过最小二乘法求得的拟合曲线并绘图验证 % 例如: …