游戏中几何LOD的最新状态是什么?


15

现代游戏如何对对象网格(例如角色,地形和树叶)的几何细节层次?我的问题分为两部分:

  1. 资产管道是什么样的?艺术家是否制作了后来被淘汰的高聚模型?如果是这样,哪种抽取算法最流行?LOD网格有时是手工完成的吗?
  2. 引擎在运行时如何在不同的对象LOD之间转换?是否有平稳或渐进的过渡?

答案可能是“不同的工作室使用不同的技术”。如果是这样,请确定一些最常见的做法。如果您能指出涵盖特定示例的白皮书/幻灯片,那也很好。


1
SIGGRAPH 2014实时渲染方面的进展在“值班”细分表面的召唤中非常有趣。你应该检查一下。他们没有用较高的多边形制作较低的多边形,而是通过分析定义了形状并根据需要添加了更多的三角形
Alan Wolfe 2015年

我们可以在这里讨论LOD算法和数据结构中的最新技术,但是如果问题是关于现代游戏是如何做到的,那么您可能会在gamedev.se中遇到更多的运气:gamedev.stackexchange.com
别名

3
我不信。游戏开发人员非常具有图形感。它主要是统一的和Java的问题,以及一些路径查找和固定帧速率的问题::p
Alan Wolfe

1
@ Alan,Activision使用了许多先进的算法来创建真正的3D战略游戏,而不是等距Sprite基本游戏,我对此表示满意,但是他们在COD方面做得很好,但是仍然有些迟钝和懒惰即使在资产很少的早期阶段(我正在谈论他们在Iphone 5s上的手机游戏)。我认为您需要学习OpenGLES专家功能和基础层才能成功编写此类游戏。
伊曼2015年

我说的是他们的值班控制台版本,以防万一。
艾伦·沃尔夫

Answers:


22

对于几何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-静态LODUnity-LOD


1
游戏引擎通常具有一组预定义的方法,您无法进入真正更改LOD算法的核心。我对吗?我说的是您自己使用OpenGL或SpriteKit框架编写游戏的情况,我不知道是否可以在Unity或Unreal中自定义LOD的算法,这可能吗?
伊曼2015年

3

LOD(详细程度)表示以不同的显示比例管理对象,这可以由两个部分划分。但是,您可以使用其中之一,在大多数情况下就足够了。

  1. 根据大小(显示比例)显示/隐藏图层(同一类型的对象组)。

  2. 基于代数Geomery的方法,称为通用化(Generalization)(这是一种简化多边形的算法)。看下图

    概括

推广(简化)多边形网格的最著名,最有效的方法称为笛卡尔多面体定理(方程式4.5,抱歉,如果我指的是书,那是我所能做到的最好),并且大多数空间数据库都在使用该方法。例如PostgreSQL中的PostGIS模块。它只是删除了多边形的较小边,并使其非常圆润。(上图)

要在游戏中实现LOD,您需要在缩放操作期间保存和管理地图(场景)的比例。比例从零变为无穷大,您必须将其划分为特定数量的范围,例如:

  1. 1 /零=无限到1/50
  2. 1/50至1/100
  3. 1/100至1/1000
  4. 1/1000至1 /无穷大= 0

然后,您需要定义在上述每个范围内,对象(图层)的哪种类型应可见或不可见。例如,当用户在第四个范围内时,诸如消防栓阀之类的小物体应该是不可见的,因为该物体在该比例尺上将非常小并且无法区分,因此,如果您跳过在消防车上绘制该物体就没有关系了。屏幕。

因此,当用户使用放大和缩小将放大倍率从一个范围移动到另一个范围时,您的游戏将使用这些显示比例通过显示或隐藏场景中的对象来管理细节级别。这提供了一种离散的解决方案,在缩小操作期间,对象会突然消失,但是,如果仔细定义了显示比例和放大倍率,用户将不会有任何感觉。

以上4个范围的组仅是一个示例,您需要通过反复试验为自己的情况找到最佳选择。没有规则。

有时游戏会使用自己的LOD方法(即Subway Surfer)即时显示一个很小的,没有纹理的矩形来显示远处的建筑物,而突然靠近就可以得到纹理,游戏者就会感觉到。您没有谈论过非常重要的投影系统,也没有谈论过要创建哪种游戏。

但是,假设您正在使用openGl实现一个完整的3D游戏,并且希望在将某些网格物体转移到图形硬件之前对其进行过滤,那么我相信这将有助于您减少使用缓冲区对象和顶点数组(VBO,VAO)进行的绑定/取消绑定操作处理OpenGl。

仅使用层管理或仅实现欧拉概括

在大多数情况下,没有必要实施泛化算法,并且过滤对象可以使您达到所需的效率(刷新率),但是这完全取决于具体情况。尽管这是一种简单的算法,它仅删除多边形的较小边,但是您需要定义一个阈值,该阈值是大小和常数的乘积,因此较大角度的边会在更远的角度被过滤掉。

无需进行层管理,仅实现Eulers泛化算法,即可提供一种非常整洁且连续的方法,在该方法中,您仅需按照预定义的阈值检查每一边和每条线,并在它们足够大以至于无法在屏幕上辨别的情况下显示它们。

PS:放大倍数是一个浮点数> 0,等于1 /标度,并且标度通常<1,因为1:1标度意味着您在游戏中拥有真实世界的长度。


唐纳德选民,请考虑再次投票,如果仍然是-1,请考虑为我留下评论。谢谢
Iman

我没有投票,但是我一部分人想知道这里的艺术状态是什么?所以我也不能投票。
joojaa 2015年

1
我之所以投票,是因为它很难阅读,恕我直言,它与游戏中的LOD无关。经过重新考虑后,我决定通过投票取消我的投票,并简单地添加我自己的答案。
Krzysztof Narkowicz 2015年

最先进的技术意味着非常出色的工作,但是在各种情况下使用不同的方法会产生不同的结果,例如《使命召唤》具有图层管理和mipmaping,但是Dear haunting(DH 2014)使用了具有视差的背景和预先渲染的mipmaping纹理。地铁冲浪者完全是一个不同的故事,我对所有人都说出了最先进的观点,即使“地铁冲浪者”离散地绘制建筑物和其他城市物体,或者“使命召唤”在缩放或平移时有点呆滞。我认为他们都是最好的。
伊曼2015年

3

伊曼(Iman)已经准备了完整的答案,但我希望在其中添加一些内容

LOD可以通过两种不同的方式完成

  1. 连续,称为CLOD,是多边形网格优化
  2. 除了多边形网格优化外,几乎所有其他算法都离散,认为属于该组。

例如,mipmaping是一个好,快速但很重的类,属于上面的secound组

在这里您可以找到有关使用OpenGl进行映射和实现代码的很好的解释。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.