技术背后的基本前提是什么,例如Oblivion(以及其他游戏,我敢肯定;还没有足够的知识),当你从远处观看它们时,模糊地显示远方的物体?例如,一个大塔距离一英里远,您会看到它从地平线上隐藏起来的模糊矩形......显然,一个巨大的3D场景无法全部渲染,我知道在高度图的情况下,只有近似算法用于降低远离相机的高度图质量,但对于特定物体,显示这些物体的最佳方式是什么?
我在考虑一种预渲染技术,在这种技术中,您可以选择景观周围的特定位置,然后制作一个程序,在该点附近绘制所有高度图和3D模型并拍照。这需要几张照片,然后当玩家靠近那个地方时,这些照片将被用作天空盒。
另一个更明显的技术是存储非常粗糙的3D模型,但是3D渲染系统如何专门选择渲染建筑物的粗糙模型而不是其他不太重要的粗略模型(并且可能不可见 - 来自 - 距离)对象?你会如何与高度图一起存储类似的东西?也许是按设计,只有一些如此重要的地标,然后只将它们的列表存储在一个小文件中,并在每个帧上渲染那些距离真正远距离的那些?
我知道Halo系列选择将游戏划分为等级,然后每个等级都有不同的手工天空盒。这是我在第一个建议中的目的,但我不确定。我想我真的只是想在我的想法中收集其他想法或改进或问题,这样我就可以选择用我有限的时间和知识来制作原型。
另一个相关主题是如何在远处显示山脉,因为它们将是高度图的一部分而不是顶部的3D模型,因此它们实际上不能具有粗略版本,并且高度图近似算法可能会从这样一个非常远的距离搞砸山(假设你甚至会尝试近似并渲染如此遥远的几何形状,你可能不会这样)。如果您在答案中也涵盖了这一点,那么奖励积分。 :)
谢谢!
P.S。我正在使用OpenGL。我只是在寻找基本概念,但如果您选择发布示例代码,请使用OpenGL函数和术语! :)
编辑:谢谢你的回答!出于文档目的,这里是我找到的另一个资源: 游戏编程中的第4.9章宝石2涵盖了将远景渲染到天空盒的概念: http://books.google.com/books?id=1-NfBElV97IC&lpg=PA416&ots=SOpnfijZly&dq=render%20distant%20to%20skybox&pg=PA416 (不幸的是,预览只是本章的第一页......我将在8月份回来后立即从我大学的图书馆拿到那本书)在阅读完这些内容后,我仍然认为LOD适用于距离相当近的物体。如果物体甚至不是一个像素大,但你仍然将它们送到显卡,你只是浪费电力,无论是否使用LOD。除了绝对最大的遥远物体之外,其他都是如此;在大多数情况下,一些高大的建筑物和一些山脉,但是从这样的距离看不到小的细节模型(灌木丛,甚至树木,岩石,其他任何风景......)。所以我喜欢渲染到天空盒技术,当我到达这座桥时,我就是这样穿过它的;我会确保为所有型号使用LOD,我只是不会渲染这样的距离。
顺便说一下,我更多地考虑一个遗忘游戏,所以答案可能取决于游戏类型。
答案 0 :(得分:7)
我认为这就是您所寻找的Level of Detail (LOD)
答案 1 :(得分:7)
一些技巧,包括你提到的那些技术:
我们的想法是在用户开始注意之前尽可能多地丢掉细节。
有许多预先存在的工具包会自动执行这些操作,但它们往往会花钱。如果你正在寻找一个认真的应用程序,我建议至少研究它们包含的解决方案。
答案 2 :(得分:4)
对于3d模型,该技术称为level of detail。基本上,基于上下文,正确使用多个版本模型。它并不总是仅用于距离,它还可以用于在其他情况下保持帧速率。
但是要小心,你应该启用mipmapping,否则你会在较低分辨率模型上的较大纹理上闪闪发光,并注意动画。在动画骨架下面切换模型很棘手,因此即使在模型化时,一种技术也是保持相同的骨架。
地形和对象模型都有动态LOD系统,但这些系统可能会占用大量CPU资源。
答案 3 :(得分:0)
一种技术是LOD(细节水平)。物体距离相机越远,绘制的三角形越少。这是一个链接:http://www.stefan-krause.com/
答案 4 :(得分:0)
您可以渲染到远处物体的纹理,但每次透视变化超过某个阈值时,您都必须重新渲染纹理。它适用于远处的物体,其中透视不会改变,通常像你在远处的山脉的例子,但如果观察源移动得太快或你太近,那么你会得到类似鱼眼的效果天地渲染的早期地震。这种系统将其自身借给了包含很远距离的在线前夕等世界。
这当然只是你的武器库中的另一个技巧,你在某种程度上仍然需要LOD。
答案 5 :(得分:0)
低细节版本的模型特别适用于车辆和物体这对地形来说非常棘手。我曾经在战区型游戏和PC飞行模拟器上工作过。一点雾有助于掩盖细节之间的“砰砰声”。
在较低的细节处,纹理映射通常被一些单色多边形替换。
“另一个更明显的技术是存储非常粗糙的3D模型,但是3D渲染系统如何专门选择渲染建筑物的粗略模型而不是其他不太重要的粗略模型(并且可能不可见 - 从那个距离)对象?你会如何与高度图一起存储类似的内容?“
您可以对地形进行网格化并保留每个网格单元格中可见的对象列表。
答案 6 :(得分:0)
处理地形的一种方法是使用多分辨率图块。就像Virtual Earth和Google Maps如何做到这一点一样,它们以递归的方式将世界划分为瓦片。因此,级别0有4个区块,级别1有16个等等......然后,使用一些LoD算法来确定缩放/比例,您将为给定区域加载适当的地形图块。
答案 7 :(得分:0)
动态缓存远程对象的预渲染视图的技术通常称为“冒名顶替者”。 Here's一篇关于这个主题的旧游戏编程宝石书中的一篇文章。
有许多技术可用于处理高度图地形的细节级别。请查看vterrain.org,了解一些常用技术的概述。大多数变体的一般原理是相同的 - 将地形分成几部分,并在远处使用较低分辨率的几何和纹理 - 但细节会有所不同。
为了减少提交到图形卡的对象数量,通常会实现某种可见性剔除。在最简单的情况下,这可能只是完全丢弃其边界球体覆盖小于屏幕像素阈值的模型(如果您有LOD系统,在选择使用哪个LOD时,无论如何都会计算这个)。为了提高效率,可以使用某种用于剔除的分层空间数据结构 - 四叉树或八叶树,球体树,门户系统(通常不常用于室外环境),简单的基于网格的方案等。基本思想是节省工作通过剔除层次结构中的更高级别节点,从而避免查看许多叶节点。一个简单的例子就是剔除建筑物并有效地剔除其所有子节点(建筑物内部或顶部的物体),而无需单独查看它们。
对于像遗忘这样的游戏,他们可能还会进行某种遮挡剔除 - 在将对象提交到图形硬件之前剔除对象,同时确定它们隐藏在其他对象后面。有很多种方法可以做到这一点,其中一些技术可能非常复杂。