处理Minecraft风格地形中的块(d3d / c ++)

时间:2012-03-21 04:27:30

标签: directx minecraft terrain voxel

在由数千个立方体(即Minecraft)组成的三维地形中,在位置和渲染方面处理每个块的方法是什么?更具体地说,我知道在directX 9中绘制一个多维数据集的原语和世界变换它可能是一种荒谬的方式来实现这一点,因为有很多性能问题,所以我想知道什么是更合理的方法。

每个立方体应该是多次复制的网格,还是从顶点缓冲区中的数据创建适当网格的方法?

我发现this article介绍了实现我想要实现的内容背后的一些理论,但我之前从未使用过八叉树,所以我无法从源代码中获取太多内容。如果八叶树确实是要走的路,那么从哪里学习它们是一个很好的起点?我的大多数谷歌搜索只发现了关于理论的博客文章,很少或没有实施例子。

似乎使用体素会对此有用,但就像八叉树一样,我来自没有经验,所以我真的不知道该先学习什么。

无论如何,感谢您提供的任何建议\资源\书名。我确信这很明显,但我对3d编程还很陌生,所以感谢你的帮助。

3 个答案:

答案 0 :(得分:2)

首先,如果您使用Minecraft作为参考,请考虑使用块并将其与Oct-trees相关联。 Minecraft将他们的世界划分为更小的块来处理需要存储的大量信息,因此使用Oct-tree来组织将要存储的数据。 Goz非常准确地描述了Oct-trees和Quad-trees的工作原理,因此请将他的信息用作参考。

另一件需要考虑的事情是,您实际上并不想将每个立方体绘制到屏幕上,因为这会占用您的帧率。使用对象剔除仅将可见立方体绘制到屏幕上。再次,如果你认为我的世界;你有没有遇到过一个小故障,你可以看到整个街区和世界?这是因为Minecraft只绘制了顶层的块。有了屏幕上的这么多对象,使用相机视锥和遮挡查询来查看对象剔除是值得的投资。

有关使用DirectX的信息,我会推荐Frank Luna的任何一本书。我自己拥有这本书,在DirectX编程时它永远不会离开我的一边。 http://www.amazon.com/Introduction-Game-Programming-Direct-9-0c/dp/1598220160/ref=sr_1_3?ie=UTF8&qid=1332478780&sr=8-3 我强烈推荐这本书,因为我从中学到了几乎所有关于DirectX的知识。

在谷歌搜索时,我发现此链接讨论了遮挡剔除,因为Luna不包括遮挡剔除,只有截头剔除。我听到编程宝石系列提到了很多,但我不能亲自证明它的名字。 http://http.developer.nvidia.com/GPUGems/gpugems_ch29.html

希望这有帮助。

答案 1 :(得分:1)

十月树相当简单,尤其是轴对齐的那些,就像我的工艺中那样。

它基本上只是四叉树的3D扩展。您可能会发现首先了解Quad-tree更容易。

为您提供四叉树的快速概述;基本上你从一个正方形开始。现在想象在那个方格中放置一个小得多的正方形。如果你想构建一个表示它的四叉树,你首先将原始方块划分为4个相等大小的方块。

接下来检查每个象限,如果较小的方块在该象限中,则将该象限分成4个较小的方块。然后你检查那4个象限选择象限和细分。最终,您的小方块将完全包含在象限(等)内的象限内的一个或多个象限中。您现在已经构建了四叉树。

现在,如果你想象你正在寻找更大的广场内的特定广场,你可以很快看到四叉树的奖金。您可以检查前4个象限以查看它们是否包含它,而不是搜索四叉树中的每个可能的方块(相当于搜索纹理中的每个像素)。如果有人可以检查其4个子象限,依此类推,直到找到完全包含方形(或像素)的最小象限。这样,您最终可以执行更少的测试来查找对象。

现在oct-tree基本上是相同的东西,但不是在正方形中编码正方形,而是现在在立方体中编码立方体。每个立方体可以分成8个较小的八分圆(因此名称为oct-tree)。

Oct-trees的优势在于,通过了解您正在开始的八分圆,您可以轻松地通过oct-tree投射光线以发现碰撞(因为八分圆是满的,部分满的或是空的)。如果八分圆是空的,那么你直接穿过它然后检查另一边的八分圆。如果部分已满,则检查其子八分位等,直到找到一个完整的八分圆(即你已经击中一个立方体并进行渲染)或者你完全通过八分圆,因此没有立方体来渲染。这就是我的世界如何工作(无论如何我猜);)。这也是一种快速渲染体素数据的好方法,现在更多人正在研究这些数据作为未来可能的渲染机制。

希望有所帮助! :)

答案 2 :(得分:0)

十字树和四叉树可用于剔除要渲染的几何体部分。 Minecraft使用16x16x16渲染块将地形分解成可管理的部分。

要考虑的另一种技术是实例化。实例化是指告GPU在不同位置多次渲染对象的地方。它用于人群渲染,树木,几何形状相同的任何东西,但你有很多。

http://msdn.microsoft.com/en-us/library/windows/desktop/bb173349(v=vs.85).aspx

http://http.developer.nvidia.com/GPUGems2/gpugems2_chapter03.html

这是一篇文章,其中作者在OpenGL 4中复制了Minecraft渲染器。虽然代码不适用于您的情况,但是技术(剔除周围的立方体等)可以应用于directx渲染器。

http://codeflow.org/entries/2010/dec/09/minecraft-like-rendering-experiments-in-opengl-4/

不要被块状图形和低质量纹理所迷惑。 Minecraft是一个非常复杂的渲染器,你需要想办法处理所涉及的物品数量。例如,即使是世界上“小”的部分,例如100x100x100块也是100万块。将每个块作为单独的网格推送到GPU会杀死您的GPU。当你接触到这项技术时,Minecraft渲染器比大多数第一人称射击游戏复杂得多。