远程三维物体渲染 [游戏]

8
在类似于《奥布里翁》(和其他游戏,我确定有很多;我没有玩够,不知道)中发现的技术背后的基本前提是什么?例如,一座大塔在一英里之外,你从远处看到它模糊的矩形从地平线上冒出来...显然,一个巨大的3D场景无法全部呈现,我知道在高度图的情况下,只有近视区域渲染,而距离越远,高度图质量就越低,但是对于特定对象,最好的显示方式是什么?
我认为也许可以使用预渲染技术,在景观周围选择特定位置,然后制作一个程序,绘制该位置周围的所有高度图和3D模型并拍照。会拍摄几张照片,当玩家接近该位置时,将使用这些照片作为天空盒。
另一种更明显的技术是存储粗略的3D模型,但是3D渲染系统如何具体选择渲染建筑物的粗略模型而不是其他不太重要(可能无法从那个距离看到)的对象的粗略模型?如何与您的高度图一起存储类似的东西?也许是通过设计,只有几个这样的重要地标,然后只需在一个小文件中存储它们的清单,并在每一帧中呈现不到x非常远的距离的那些。
我知道《光环》系列选择将游戏分成级别,然后每个级别都有一个不同的手工天空盒。这就是我在第一个建议中所追求的,但我不确定。我想我真的只是在尝试收集其他想法或改进或我的想法中的问题,以便我可以选择哪些想法用我的有限时间和知识进行原型制作。
另一个相关的主题是如何显示远处的山,因为它们将成为高度图的一部分,而不是其上的3D模型,因此它们实际上无法具有粗略版本,而高度图近似算法可能会使山从这么远的距离出现问题(假设您甚至会尝试近似和渲染这样遥远的几何体,您可能不会)。如果您在答案中涵盖了这一点,那就更好了。:)
谢谢!
附:我正在使用OpenGL。 我只是寻找基本概念,但是如果您选择发布示例代码,请使用OpenGL函数和术语! :)

编辑:感谢回答!为了文档记录,这里有另一个资源: 《游戏编程宝典2》第4.9章介绍了将远景渲染到天空盒的概念: http://books.google.com/books?id=1-NfBElV97IC&lpg=PA416&ots=SOpnfijZly&dq=render%20distant%20to%20skybox&pg=PA416 (不幸的是,预览只显示了该章节的第一页...我得在8月回到大学图书馆取那本书)

此外,在阅读了这些内容之后,我仍然认为LOD适用于距离相对较近的对象。如果对象甚至不到一个像素大小,但你仍然将它们传送到显卡,那么无论是否使用LOD,你都在浪费功率。这种情况适用于除了最大的远景对象以外的所有对象;在大多数情况下,只有一些高楼大厦和一些山脉,而小细节模型(灌木丛、树木、岩石等其他景观...)在这样的距离下是看不见的。因此,我喜欢将远景渲染到天空盒的技术,当我遇到这个问题时,我会采用这种方法;而且我会确保对所有模型使用LOD,只是不会渲染如此远的距离。

顺便说一下,我想更多地思考一个《上古卷轴4:奥布里翁》类型的游戏,所以答案可能取决于游戏类型。

8个回答

7

我认为这是你正在寻找的内容:细节层次(LOD)

该页面介绍了在IT技术中使用的细节层次(LOD)的概念。

我认为这规模有点小了...我说的是真正的大规模,而且LOD不起作用,因为这意味着所有几英里之外的模型仍在被绘制,但事实并非如此。 - Ricket
2
在某个特定的点上,您可以剔除所有距离太远而无关紧要的对象。这有时被称为 3D 程序的绘制距离,在超过该距离时,只需停止渲染即可。 - AvatarOfChronos
Oblivion确实使用LoD来进行远处地形渲染。在elderscrolls.com上有一些相关信息,例如http://cs.elderscrolls.com/constwiki/index.php/Landscape_LOD_Tutorial。 - Kylotan

7

以下是一些技术,包括你提到的:

  • 细节级别。如上所述。
  • Mipmapping。用于纹理。
  • 视野。通过选择适当的缩放级别来限制相机“看到”的物体数量。还可以参见视锥剔除。
  • 远裁剪平面。遮挡远处的地方:大多数游戏使用雾、山脉或其他借口来有一个硬性切断,限制您能看到多远。这可以使用八叉树或其他类似的技术实现。这可能基于整个对象、多边形或其他任何东西,并且通常设置在那些前述山脉的后面。
  • 竞技场/关卡/区域/等等——同样,大多数游戏人为地限制您一次只能在一个竞技场中玩;好处是显而易见的(您可以忽略所有其他竞技场中的对象)
  • 预渲染——这就是您上面建议的内容。对于远处的静态场景,在“典型”视图中渲染场景,并将其作为背景的纹理,或者用于天空盒/反射贴图/等等。

这个想法是在用户开始注意到之前尽可能丢弃尽可能多的细节。

有许多现成的工具包可以自动执行这些操作,但它们往往需要付费。如果您正在考虑一个严肃的应用程序,我建议至少研究它们所包含的解决方案。


1
我认为你的视野点略微不准确。FOV通常指的是你所看到的“相机”的角度。截断远处物体的点称为“远裁剪平面”。 - Neil N

4
对于3D模型,技术称为细节级别。基本上,多个版本的模型可根据上下文保持可用,以使用正确的模型版本。这不仅仅是针对距离的,还可以用于其他情况下维护帧率。
但要注意,应启用mipmapping,否则在低分辨率模型上的较大纹理上会出现闪烁,并且要小心动画。在动画骨架下切换模型很棘手,因此一种技术是即使LOD模型,也要保持相同的骨架。
有动态LOD系统可用于地形和对象模型,但这些可能会占用CPU资源。

0

动态缓存远程对象的预渲染视图技术通常称为“impostors”。这里是一篇关于该主题的旧游戏编程宝典文章。

处理高度图地形细节级别有许多技术。请查看vterrain.org,了解一些常见技术的概述。大多数变体的基本原则相同-将地形分成几个部分,在距离较远的地方使用低分辨率几何和纹理-但细节有所不同。

为了减少提交给图形卡的对象数量,通常会实现某种可见性剔除。最简单的方式可能是完全丢弃包围球覆盖屏幕像素阈值以下的模型(如果有LOD系统,则选择使用哪个LOD时,你无论如何都要计算这个阈值)。为了提高效率,可以使用一种分层空间数据结构进行剔除 - 四叉树或八叉树、球树、Portal系统(在户外环境中通常不常用的),简单的基于网格的方案等。基本思想是通过剔除层次结构中的更高级节点来节省工作量,从而避免查看许多叶子节点。一个简单的例子是剔除建筑物并有效地剔除所有其子节点(建筑物内部或顶部的对象)而无需逐个查看它们。
对于《黑暗之城》这样的游戏,他们可能还在做某种遮挡剔除 - 在将对象提交给图形硬件之前,根据确定它们被其他对象隐藏来剔除它们。有各种各样的技术可以实现这一点,其中一些可能相当复杂。

0
一种技术是LOD(细节水平)。物体离摄像机越远,绘制的三角形越少。这里有一个链接:http://www.stefan-krause.com/

0

你可以对远处的物体进行纹理渲染,但是每当透视变化超过一定阈值时,就必须重新渲染纹理。这对于视角不经常改变的远处物体非常有效,比如你所示例的远处山脉,但如果视点移动得太快或者太近,那么你就会得到一种鱼眼效果,类似于《昆虫总动员》中天空渲染的早期阶段。这种系统非常适合像《EVE Online》这样包含广阔距离的世界。

当然,这只是你工具箱中的另一个技巧,你仍然需要在某种程度上使用LOD。


0

在车辆和物体方面,低细节版本的模型特别有效。但地形方面确实很棘手。我曾经参与过战区类型的游戏和PC飞行模拟器的开发。一点雾气可以帮助掩盖细节之间的“跳跃”。

在较低的细节级别上,纹理映射通常会被几个单色多边形所取代。


"另一种更明显的技术是存储非常粗糙的3D模型,但是如何让3D渲染系统专门选择渲染建筑物的粗略模型而不是其他不太重要(可能从那个距离看不到)的对象的粗略模型?你如何将这样的东西与你的高度图一起存储?"
"您可以对地形进行网格化,并保持每个网格单元中可见对象的列表。"

0
处理地形的一种方法是使用多分辨率瓦片。就像Virtual Earth和Google Maps一样,它们以递归方式将世界划分为瓦片。因此,在第0级有4个瓦片,在第1级有16个瓦片等等...然后,使用某些LoD算法来确定缩放/比例,您将加载给定区域的适当地形瓦片。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接