遥远的三维物体渲染[游戏]

问题描述:

在遗忘(和其他游戏,我敢肯定;还没玩过足够的知识)中发现的技术背后的基本前提是什么?其中来自远方的物体隐约显示时你从远处看他们?例如,一座大塔距离一英里远,你会看到它从地平线上模糊的矩形......显然,一个巨大的3D场景不能全部渲染,而且我知道在heightmaps的情况下,只有近似算法用于降低距相机更远的高度贴图质量,但对于特定的物体,展示这些物体的最佳方式是什么?遥远的三维物体渲染[游戏]

我在想也许是一种预渲染技术,您可以在景观周围挑选特定的地方,然后制作一个程序,绘制该地点周围的所有高度图和3D模型并拍摄照片。这将需要几张照片,然后当玩家接近该点时,这些图片将被用作天空盒。

另一个更明显的技术是存储真正粗糙的3D模型,但那么3D渲染系统如何专门选择渲染建筑物的粗糙模型而不是其他较不重要的粗糙模型(并且可能不可见)从那个距离)对象?你会如何在高度图中存储这样的内容?也许通过设计,只有少数这样的重要地标,然后将它们的列表存储在一个小文件中,并且在每个帧中渲染的距离远小于x的距离?

我知道Halo系列选择将游戏分为多个等级,然后每个等级都有不同的手工制作的天空盒。这是我在第一个建议中要做的,但我不确定。我想我实际上只是试图在我的想法中收集其他想法或改进或问题,以便在有限的时间和知识的情况下选择哪些原型进行原型设计。

另一个相关的主题是如何在远处显示山脉,因为它们将成为高度图的一部分,而不是其顶部的3D模型,所以它们实际上不能具有粗糙的版本,并且高度图近似算法可能会把山从这么远的距离拧下来(假设你甚至会尝试近似并渲染这样的远距离几何体,你可能不会这么做)。奖励积分,如果你在你的回答中也覆盖了这一点。 :)

谢谢!

P.S.我正在使用OpenGL。我只是在寻找基本概念,但如果您选择发布示例代码,请使用OpenGL函数和条款! :)

编辑:谢谢你的答案!出于文档目的,这里是我发现的另一个资源: 游戏编程中的第4.9章Gems 2介绍了将远景渲染为天空盒的概念: http://books.google.com/books?id=1-NfBElV97IC&lpg=PA416&ots=SOpnfijZly&dq=render%20distant%20to%20skybox&pg=PA416 (不幸的是,预览只是本章的第一页......我会我一回到八月,就必须从我大学的图书馆那里拿到那本书)

在阅读了这些东西之后,我仍然认为LOD适用于距离相当近的物体。如果物体的大小不是一个像素,但是仍然将它们馈送给显卡,则无论是否使用LOD,您都会浪费能量。对于除绝对最大的远距离物体以外的所有物体都是如此;在大多数情况下,一些高大的建筑物和一些山脉,但从这样的距离不能看到小细节模型(灌木丛,甚至树木,岩石,无论其他景观......)。所以我喜欢渲染天空盒技术,当我到达这座桥时,我就是这样穿过它的;我会确保为所有模型使用LOD,我只是不会渲染这样的距离。

顺便说一下,我正在考虑更多地沿着遗忘游戏的路线,所以答案可能取决于游戏类型。

一些技术,包括你提到的那些:详细的

  • 水平。上面概述。
  • Mipmapping。纹理。
  • 视野。通过选择适当的缩放级别,限制相机可以“看到”的事物数量。另请参阅查看frustrum剔除。
  • 远的剪辑平面。遥远的地方被遮挡:大多数游戏使用雾,山脉或其他借口在你可以看到多远的地方有一个硬切断。这可以使用八进制或其他一些技术来实现。这可能基于整个对象,或多边形或其他任何东西,并且通常设置为发生在上述山脉后面。
  • 竞技场/关卡/区域/无论如何 - 大多数游戏还是人为地限制您一次只能在一个赛场上比赛;好处是显而易见的(你可以忽略所有其他领域的物体)
  • 预渲染 - 这是你在上面建议的。对于离得很远的静态场景,在“典型”视图中渲染场景并使其成为背景中的纹理,或将其用于天空盒/反射图/等。

想法是扔掉在用户开始注意之前尽可能详细。

有一些预先存在的工具包,它会自动做这些事情,但他们往往花钱。如果你在看一个认真的应用程序,我会建议至少研究它们包含的解决方案。

一种技术是LOD(详细程度)。物体距离相机越远,画出的三角形就越少。这里有一个链接:http://www.stefan-krause.com/

我觉得这是你找什么Level of Detail (LOD)

+0

嗯,我认为这是一个有点小规模的......我说的是真正大的规模,LOD是行不通的,因为这将意味着所有机型英里远仍然被绘制,这将不会是这样。 – Ricket 2009-06-18 17:17:42

+2

是的,你在某个时刻剔除了所有距离太远的物体。这有时会在3D程序的设置中作为绘图距离发现。当某些东西超过时,你就停止渲染它。 – AvatarOfChronos 2009-06-18 17:28:10

3D模型,该技术被称为level of detail。从本质上讲,多个版本模型基于上下文保持正确的一种使用。它并不总是仅用于距离,它也可以用于在其他情况下维持帧速率。

要小心,你应该启用mipmapping,否则你会在较低res模型的较大纹理上闪闪发光,并小心动画。在动画骨架下切换模型非常棘手,所以一种技术就是在模型的LOD中保持相同的骨架。

地形和物体模型都有动态的LOD系统,但这些系统可能会占用CPU资源。

可以渲染到远处物体的纹理,但是每次透视变化超过某个阈值时都必须重新渲染纹理。它适用于远距离物体,视角不会像你在远处的山峰一样变化,但是如果视角源移动得太快或者太近,那么你会得到一种类似于鱼眼的效果在地震的早期天空渲染。这种类型的系统可以让它像自己一样拥有遥远的世界。

这当然只是你的武器库中的另一个技巧,你在某种程度上仍然需要LOD。

模型的低细节版本特别适用于车辆和物体对于地形来说这非常棘手。我曾参与战地型游戏和PC飞行模拟器。有一点雾有助于掩盖细节之间的“爆裂”。

在较低的细节处,纹理映射常常被几个单色多边形替代。


“另一个更明显的技术是存储真正粗糙的3D模型,但随后如何将3D渲染系统,专门选择渲染建筑的粗糙模型,而不是其他不太显著的粗糙模型(也可能不可见的距离)对象?你将如何存储类似的东西以及你的高度图?“

您可以对您的地形进行网格划分,并保留每个网格单元中可见对象的列表。

处理地形的一种方法是使用多分辨率图块。就像虚拟地球和谷歌地图一样,它们以递归的方式将世界划分为瓦片。因此,0级有4个瓦片,1级有16个瓦片等等。然后,使用一些LoD算法来确定缩放比例,您可以为给定区域加载适当的地形瓦片。

的动态缓存远处物体的预呈现的视图的技术通常被称为“冒名顶替”。 Here's来自旧版游戏编程宝石的一篇文章。

有处理细节的水平高度图地形的许多技术。查看vterrain.org以了解一些常用技术的概述。一般原则在大多数变体中都是相同的 - 将地形分割为几个部分,并在距离中使用较低分辨率的几何体和纹理 - 但细节会有所不同。

为了减少获得提交给显卡某种知名度扑杀通常会实现的对象的数量。在最简单的情况下,这可能只是完全放弃边界球覆盖的像素数小于某个特定阈值的模型(如果您有LOD系统,则在选择使用哪个LOD时,您将计算此值)。为了提高效率,可以使用某种用于剔除的分层空间数据结构 - 四叉树或八叉树,球树,门户系统(通常不太常用于户外环境),简单的基于网格的方案等。基本想法是节省工作量通过剔除层次结构中更高级别的节点,从而避免查看许多叶节点。一个简单的例子就是剔除建筑物,并且有效地剔除其所有的子节点(建筑物内部或建筑物顶部的物体),而无需单独查看它们。

对于像遗忘游戏他们可能也做某种类型的遮挡剔除的 - 他们提交给基于确定它们隐藏在其它对象后面的图形硬件之前剔除的对象。有许多技术可以做到这一点,其中一些可能相当复杂。