XNA中渲染大量地形的有效方法


10

我正在创建一个XNA游戏,该游戏需要巨大的玩家空间。当前,我正在使用的测试高度图是4096x4096,并保存为4位BMP。

我要尝试的是获取巨大的高度图文件,然后在游戏中进行渲染。我遇到的问题是,将整个地形立即加载到内存中效率很低,因为它将占用大部分可用内存。

我遇到的另一个问题是,由于XNA中设置了硬限制,因此无法在一个图元中全部渲染地形。

话虽如此,我遇到了许多解决方案,下面列出了所有这些解决方案:

  • 基于当前用户的位置进行渲染-基本上不管用户在世界上的方向如何,都围绕用户绘制一个正方形。这也不是我想要的,因为您仍在渲染用户看不到的空间。
  • 根据用户的方向和位置进行渲染-我找到了一个公式来检索一个三角形,该三角形应该具有应该绘制的高度图像素,但是事实证明这非常困难。
  • 将地形分为多个块并渲染最接近用户的块-效率仍然不高,因为您仍在渲染人们看不到的块。而且它很费力,因为那时我必须将高度图分成几部分,而可伸缩性成为一个大问题。

在尝试了这些解决方案之后,我对如何做的想法一无所知。在人们告诉我执行这些复杂算法的地方,我已经收到了一些答案,但是我什至不知道该如何执行这些算法。

因此,基本上,我要求一种简单,直接的方法来以最高效率在XNA中渲染巨大的地形。

总的来说,我对游戏开发比较陌生,但是如果它看起来很有希望,我愿意研究。

更新1:研究了geoclipmapping方法后,我开始使用它进行编码。我完成了所有的数学运算,然后游戏开始运行。但是,它效率极低-对我而言,这可能是不好的编码。它以2FPS的速度运行,并使用了我CPU的整个核心。我将尝试改进代码,但我想需要更多帮助,因此这里是 Terrain manager类的代码的Pastebin。如果可以提高效率,我将在稍后发布更多结果。


1
有趣的是,您所谈论的技术似乎类似于ID Software在即将推出的游戏Rage中使用的技术。他们使用“超级纹理”,然后将所需的部分流式传输到GPU中。他已经对此进行了讨论,但这是一篇Wikipedia文章,可能是鼓舞人心的: en.wikipedia.org/wiki/MegaTexture

Answers:


5

通常使用块方法。测试成千上万个三角形中的每个三角形以查看是否应该渲染它是非常有效的。相反,大多数地形渲染算法采用空间数据结构来动态渲染地形的可见部分。

一种易于实现的数据结构称为四叉树。简而言之,要使用四叉树,您将找到玩家的视锥,将其与四叉树的顶层相交,对于部分可见的块(即,视锥平面与块相交),您可以细分并测试所有子代块,省略了平截头体之外的部分。仅需少量递归,就可以非常接近实际的可见几何图形。

更高级的地形渲染器使用算法不仅调整可见的几何图形,而且还调整该几何图形的细节。目前,Geomipmapping(及其相对的geoclipmapping)相对比较流行,但是实现起来并非易事。

编辑: 是对地理截留和视锥剔除的一个体面的描述。

我还对高度图的4位是否实际上足以产生漂亮的地形感到怀疑,除非您对结果进行了大量的平滑处理。


我看了这篇文章,并且决定先使用geoclipmapping方法,因为它看起来是显示大量地形的最有效方法。我将回传我的结果。

3

任何需要您按帧进行工作以将数据加载到GPU的方法都会存在缺陷。

这是一种应能很好执行的方法的粗略概述:

您应该将地形分成(相当大的)块,然后将这些块加载到固定的顶点缓冲区中(高度图的位深度无关紧要!)。这些顶点缓冲区将仅位于GPU内存中,等待渲染。您必须尝试使用​​合适的块大小,但是128x128也许是一个不错的起点。

对于4096x4096的地形,您超出了我一次可以轻松加载到GPU的限制的范围-可能有数百MB的顶点数据(尽管如果您将其降低到〜64MB,聪明)。因此,您可能必须在后台从GPU加载和卸载顶点缓冲区。

(如果您实现了块的后台加载,那么这应该具有极大的可扩展性!)

GPU上获得顶点数据之后,就该对每个块进行可见性剔除了。如果您知道它在相机后面,则无需发送命令来渲染块。

你几乎应该永远不会做 在CPU上每个三角形的剔除!

GPU将剔除屏幕外的三角形 速度比您能做到的快得多。

有关性能的更多信息,请在Game Dev网站上查看此答案


0

我无论如何都不是XNA的专家,所以如果我错了,请纠正我,但我的印象是实际上针对此类情况进行了内置优化。我知道您可以设置渲染距离,并且此后它不会渲染任何内容,在您的情况下,它将是剩余的地形。但是,这给渲染世界留下了相当不吸引人的优势,因此您将必须实现大多数开放世界游戏所具有的类似雾化的功能。


有内置的解决方案,但是我遇到的问题是我试图渲染一个大的图元,该图超出了图元多边形的限制。因此,它不会绘制,仅引发异常。
sammarks 2011年
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.