现代游戏如何对对象网格(例如角色,地形和树叶)的几何细节层次?我的问题分为两部分:
- 资产管道是什么样的?艺术家是否制作了后来被淘汰的高聚模型?如果是这样,哪种抽取算法最流行?LOD网格有时是手工完成的吗?
- 引擎在运行时如何在不同的对象LOD之间转换?是否有平稳或渐进的过渡?
答案可能是“不同的工作室使用不同的技术”。如果是这样,请确定一些最常见的做法。如果您能指出涵盖特定示例的白皮书/幻灯片,那也很好。
现代游戏如何对对象网格(例如角色,地形和树叶)的几何细节层次?我的问题分为两部分:
答案可能是“不同的工作室使用不同的技术”。如果是这样,请确定一些最常见的做法。如果您能指出涵盖特定示例的白皮书/幻灯片,那也很好。
Answers:
对于几何LOD,大多数游戏都只是在许多预定义的LOD网格之间切换。例如,“臭名昭著:第二个儿子”使用3个LOD网格(Adrian Bentley-“臭名昭著:第二个儿子的发动机死尸”,GDC 2014)和“杀戮地带:暗影坠落”每个角色使用7个LOD网格(米哈尔·瓦伦特-“杀戮地带:暗影坠落”演示验尸”,Devstation2013)。它们大多数是生成的,但是更重要的(例如主角)可以手工制作。网格通常是使用流行的Simplygon中间件生成的,但有时它们只是由图形艺术家在其最喜欢的3D程序包中生成的。
抽奖距离较大的游戏还会在枝叶,树木和高层建筑物上使用冒名顶替者(Adrian Bentley-“臭名昭著:Second Son引擎尸体尸体”,GDC 2014)。他们还使用分层LOD,用一组LOD替换一组对象。例如,在“正当防卫2”中,首先将树分别渲染为普通的LOD网格,然后分别将其渲染为冒名顶替者,最后将其渲染为单个合并的森林网格(Emil Persson,Joel de Vahl-“人口庞大的游戏世界”,Siggraph2013)以及世界各地的“日落超速行驶”被单个自动脱机生成的网格所取代(Elan Ruskin-“流式日落超速行驶的开放世界”,GDC2015)。
LOD系统的另一个组件是简化材质和着色器。例如,“ Killzone:Shadow Fall”为远处的LOD禁用切线空间和法线贴图(Michal Valient-“ Killzone:Shadow fall demo postmortem”,Devstation2013)。这通常是通过在每个LOD上全局禁用一组着色器功能来实现的,但是对于具有着色器图的引擎,艺术家可以在其中创建自定义着色器,这需要手动完成。
对于LOD过渡,某些游戏仅切换网格,而某些游戏使用抖动进行平滑的LOD过渡-在LOD切换时,呈现两个网格:第一个逐渐淡出,然后第二个淡入(Simon schreibt博客-“刺客信条3 – LoD混合”)。没有使用经典的CPU渐进式网格技术,因为它们需要昂贵的网格更新并上传到GPU。在一些标题中使用了“硬件细分”,但仅用于细化最详细的LOD,因为它运行缓慢且通常无法替代预定义的几何LOD。
地形LOD进行单独处理以利用其特定属性。地形几何LOD通常使用剪贴图来实现(Marcin Gollent-“在REDengine 3中创建和渲染景观”)。地形材料LOD的处理方式与网格LOD相似,或使用某种虚拟纹理Ka Chen-“ Far Cry 4中的自适应虚拟纹理渲染”。
最后,如果您有兴趣查看真实的游戏LOD管道,则只需浏览任何现代游戏引擎的文档即可:Unreal Engine 4-“创建和使用LOD”,CryEgnine-静态LOD和Unity-LOD。
LOD(详细程度)表示以不同的显示比例管理对象,这可以由两个部分划分。但是,您可以使用其中之一,在大多数情况下就足够了。
根据大小(显示比例)显示/隐藏图层(同一类型的对象组)。
基于代数Geomery的方法,称为通用化(Generalization)(这是一种简化多边形的算法)。看下图
推广(简化)多边形网格的最著名,最有效的方法称为笛卡尔多面体定理(方程式4.5,抱歉,如果我指的是书,那是我所能做到的最好),并且大多数空间数据库都在使用该方法。例如PostgreSQL中的PostGIS模块。它只是删除了多边形的较小边,并使其非常圆润。(上图)
要在游戏中实现LOD,您需要在缩放操作期间保存和管理地图(场景)的比例。比例从零变为无穷大,您必须将其划分为特定数量的范围,例如:
然后,您需要定义在上述每个范围内,对象(图层)的哪种类型应可见或不可见。例如,当用户在第四个范围内时,诸如消防栓阀之类的小物体应该是不可见的,因为该物体在该比例尺上将非常小并且无法区分,因此,如果您跳过在消防车上绘制该物体就没有关系了。屏幕。
因此,当用户使用放大和缩小将放大倍率从一个范围移动到另一个范围时,您的游戏将使用这些显示比例通过显示或隐藏场景中的对象来管理细节级别。这提供了一种离散的解决方案,在缩小操作期间,对象会突然消失,但是,如果仔细定义了显示比例和放大倍率,用户将不会有任何感觉。
以上4个范围的组仅是一个示例,您需要通过反复试验为自己的情况找到最佳选择。没有规则。
有时游戏会使用自己的LOD方法(即Subway Surfer)即时显示一个很小的,没有纹理的矩形来显示远处的建筑物,而突然靠近就可以得到纹理,游戏者就会感觉到。您没有谈论过非常重要的投影系统,也没有谈论过要创建哪种游戏。
但是,假设您正在使用openGl实现一个完整的3D游戏,并且希望在将某些网格物体转移到图形硬件之前对其进行过滤,那么我相信这将有助于您减少使用缓冲区对象和顶点数组(VBO,VAO)进行的绑定/取消绑定操作处理OpenGl。
仅使用层管理或仅实现欧拉概括
在大多数情况下,没有必要实施泛化算法,并且过滤对象可以使您达到所需的效率(刷新率),但是这完全取决于具体情况。尽管这是一种简单的算法,它仅删除多边形的较小边,但是您需要定义一个阈值,该阈值是大小和常数的乘积,因此较大角度的边会在更远的角度被过滤掉。
无需进行层管理,仅实现Eulers泛化算法,即可提供一种非常整洁且连续的方法,在该方法中,您仅需按照预定义的阈值检查每一边和每条线,并在它们足够大以至于无法在屏幕上辨别的情况下显示它们。
PS:放大倍数是一个浮点数> 0,等于1 /标度,并且标度通常<1,因为1:1标度意味着您在游戏中拥有真实世界的长度。