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


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

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

评论

SIGGRAPH 2014实时渲染方面的进展在“值班”细分表面的调用上确实有趣。你应该检查一下。他们没有通过将较高的多边形网格制成较低的多边形,而是通过分析定义形状并根据需要添加了更多的三角形

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

我不信。游戏开发人员非常具有图形感。 :p
主要是关于unity和java的问题,其中包含一些路径查找和固定帧速率问题
@ Alan,Activision使用了很多先进的算法来创建真正的3D战略游戏,而不是等距Sprite基本游戏,我对此表示满意,但是他们在COD方面做得很好,但是仍然有点迟钝和懒惰即使在资产很少的早期阶段(我正在谈论他们在Iphone 5s上的手机游戏)。我认为您需要学习OpenGLES专家功能和基础层才能成功编写此类游戏。

我说的是他们的值班控制台版本,以防万一。

#1 楼

对于几何LOD,大多数游戏都只是在许多预定义的LOD网格之间切换。例如,“臭名昭著:第二个儿子”使用3个LOD网格(Adrian Bentley-“臭名昭著:第二个儿子的发动机验尸”,GDC 2014)和“杀戮地带:暗影坠落”每个角色使用7个LOD网格(米哈尔·瓦伦特-“杀戮地带:暗影坠落”演示验尸”,Devstation2013)。它们大多数是生成的,但是更重要的(例如主角)可以手工制作。网格通常是使用流行的Simplygon中间件生成的,但有时它们是由图形艺术家简单地在他们最喜欢的3D程序包中生成的。

绘制距离较大的游戏还使用冒名顶替工具来装饰叶子,树木和高层建筑物(阿德里安·本特利(Adrian Bentley)-《臭名昭著:次子引擎死尸》,GDC,2014年)。他们还使用分层LOD,用一组LOD替换一组对象。例如,在“正当防卫2(Just Cause 2)”中,首先分别将树渲染为普通的LOD网格,然后将其分别作为冒名顶替者,最后作为单个合并的森林网格进行渲染(Emil Persson,Joel de Vahl-“人口庞大的游戏世界”,Siggraph2013)以及遥远的“日落过载”被单个自动脱机生成的网格所取代(Elan Ruskin-“日落过载的流媒体开放世界”,GDC2015)。和着色器。例如,“ 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-“在孤岛惊魂4中进行自适应虚拟纹理渲染”。然后只需浏览任何现代游戏引擎的文档:虚幻引擎4-“创建和使用LOD”,CryEgnine-静态LOD和Unity-LOD。

评论


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

#2 楼

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


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


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



最流行和最有效的方法来概括(简化)多边形网格的方法是笛卡尔-欧拉多面体定理(方程式4.5对不起,如果我我指的是一本书,这是我所能做的最好的事情),并且被大多数空间数据库使用,例如PostgreSQL中的PostGIS模块。它只是删除多边形的较小边并制成一个非常圆的边。(上图)
要在游戏中实现LOD,您需要在缩放操作期间保存和管理地图(场景)的比例。比例从零变为无穷大,您必须将其分成特定数量的范围,例如:

1 / zero =无穷大至1/50
1/50至1/100
1/100到1/1000
1/1000到1 /无穷大= 0

然后您需要定义应将对象(图层)的类型设置为在上述每个范围内可见或不可见。例如,当用户在第四个范围内时,诸如消防栓阀之类的小物体应该是不可见的,因为在该比例尺下它会很小,并且无法区分,因此,如果您跳过在消防车上绘制该物体就没有关系了。屏幕。
因此,当用户使用放大和缩小将放大倍数从一个范围移动到另一个范围时,您的游戏将使用这些显示比例通过显示或隐藏场景中的对象来管理细节级别。这提供了一个离散的解决方案,即在缩小操作期间物体突然消失,但是仔细定义了显示比例和放大倍率,用户不会有任何感觉。
以上4个范围的组仅是示例,您需要通过反复试验找到最适合自己的案例。
有时候游戏会使用自己的LOD方法(Subway Surfer即时显示),显示一个很小的,没有纹理的矩形来显示远处的建筑物,而突然靠近就可以得到纹理,游戏者会感到它。您没有谈论过非常重要的投影系统,也没有谈论过要创建什么样的游戏。
但是,假设您正在使用openGl实现完整的3D游戏,并且希望在转移网格之前对其进行过滤对于图形硬件,我确信这将帮助您在处理OpenGl时减少对缓冲区对象和顶点数组(VBO,VAO)的绑定/取消绑定操作。

仅使用层管理或仅实现Euler的通用化

在大多数情况下,无需实施通用化算法,过滤对象就可以使您达到所需的效率(刷新率),但是这完全取决于具体情况。尽管这是一种简单的算法,它只删除多边形的较小边,但是您需要定义一个阈值,该阈值是大小和常数的乘积,因此较大的边会在更远的角度被过滤。
无需进行层管理,仅执行Eulers泛化算法,即可提供一种非常整洁且连续的方法,在该方法中,您仅需按照预定义的阈值检查每一边和每条线,并在它们足够大以至于无法在屏幕上辨别的情况下显示它们。
PS:放大倍数是一个浮点数> 0,等于1 /标度,并且标度通常<1,因为1:1标度意味着您在游戏中拥有真实世界的长度。

评论


$ \ begingroup $
下选民,请考虑再次投票,如果仍然是-1,请考虑为我发表评论。谢谢
$ \ endgroup $
–伊曼
2015年9月6日下午13:00

$ \ begingroup $
我没有投票,但是我一部分人想知道这里的艺术状态是什么?所以我也不能投票。
$ \ endgroup $
– joojaa
2015年9月6日15:59

$ \ begingroup $
我之所以投票,是因为它很难阅读,恕我直言,它与游戏中的LOD无关。重新考虑后,我决定通过投票取消我的投票,并简单地添加我自己的答案。
$ \ endgroup $
– Krzysztof Narkowicz
2015年9月6日在18:02

$ \ begingroup $
最先进的技术意味着很出色的工作,但是不同情况下使用不同的方法会产生不同的结果,例如《使命召唤》具有图层管理和mipmaping,而Dear haunting(DH 2014)使用具有视差和mipmaping的背景预渲染了通用纹理。地铁冲浪者完全是一个不同的故事,尽管地铁冲浪者会离散绘制建筑物和其他城市物体,或者召唤任务在缩放或平移时有点呆滞,但我对所有人都说出了最先进的水平。我认为他们都是最好的。
$ \ endgroup $
–伊曼
2015年9月6日于18:04

#3 楼

Iman已经准备了完整的答案,但我想在其中添加一些内容

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


Continuous连续,称为CLOD,它是一个多边形网格优化
除了多边形网格优化以外,几乎所有其他算法都被认为属于该算法组。上面的

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


多个细节级别