体素引擎和优化

6

最近我开始开发体素引擎。我所需要的只是没有纹理但非常多彩的体素(比Minecraft小得多)- 问题是如何快速绘制场景?我正在使用C#/XNA,但在这种情况下,这不是很重要,让我们谈论一般情况。看看这两个游戏:

  1. http://www.youtube.com/watch?v=EKdRri5jSMs
  2. http://www.youtube.com/watch?v=in0bavLJ8KQ
特别是我认为视频2代表了很好的优化方法(我的图形卡在192 x 192 x 64时就开始崩溃),他们是如何实现的?
我希望引擎中有以下内容:
- 丰富多彩的像素块,没有纹理但有阴影 - 许多许多像素块,至少512 x 512 x 128,以达到类似于视频#2的效果 - 阴影(平滑阴影会很棒,但这不是必要的) - 可选项:动态照明(例如从飞行的火球中照亮靠近像素结构的地方) - 帧速率最低40 FPS - 相机有3种自由度(在x轴上移动,在y轴上移动,在z轴上移动),不需要相机旋转 - 最后一个可选功能可能是景深(这将非常棒^^)
我已经知道的优化方法有哪些:
  • 移除位于体素结构内部的不可见体素(被其他六个方向的体素覆盖)
    • 移除不可见的体素面 - 因为摄像机没有旋转,总是向前斜视,就像TPP游戏中一样,所以如果我们将屏幕分成垂直切割,左侧体素和右侧体素只会显示3个面
    • 将体素保留在字典中而不是三维数组中 - 跳跃到大小为512 x 512 x 128的数组需要毫秒级的时间,这是不可接受的 - 但是使用int:color的字典,其中int描述了打包的3D位置,速度要快得多
    • 在适用的情况下使用实例化
    • 遮挡?(如何做到这一点?)
    • 空间划分/八叉树(这是一个好主意吗?)

如果有人能给我一些改进现有优化措施的提示或分享新的改进想法,我将非常感激。谢谢


2
请注意,这两个视频显示的引擎似乎不支持旋转。此外,第二个视频可能使用广告牌来呈现失焦对象,而不是体素对象。 - Skizz
2个回答

8

1) Voxatron使用的是软件渲染器而不是GPU。如果您阅读此博客文章中的评论,可以了解一些详细信息:

http://www.lexaloffle.com/bbs/?tid=201

我自己没有仔细查看,所以无法告诉您更多。

2) 我从未玩过3D Dot Game Heroes,但我没有任何理由相信它使用了体素。我的意思是,我没有看到任何立方体被添加或删除。最有可能的是,它只是一个静态的多边形网格,上面应用了漂亮的纹理。

至于自己实现,不要尝试通过渲染立方体来绘制世界,因为这样非常慢。相反,您应该处理体积并生成位于实心体素和空体素交集处的网格。将体积分成适当大小的区域(例如32x32x32),并为每个区域生成网格。

我写了一篇关于此的书籍文章,您可能会发现有用。实际上,它是关于平滑体素地形,但许多原则仍然适用。

您可以在Google图书中阅读它:http://books.google.com/books?id=WNfD2u8nIlIC&lpg=PR1&dq=game%20engine%20gems&pg=PA39#v=onepage&q&f=false

您可以在此处找到相关源代码:http://www.thermite3d.org


2
由于您正在使用XNA,您可以使用实例化来获得所需的效果:http://www.float4x4.net/index.php/2010/06/hardware-instancing-in-xna/ 和 http://roecode.wordpress.com/2008/03/17/xna-framework-gameengine-development-part-19-hardware-instancing-pc-only/
底层概念是实例化:此功能允许您在单个DrawIndexedPrimitive调用中指定某些重复数据和某些变化数据。在您的情况下,实例流将是单个实心盒子,而另一个流将是变换和颜色信息。

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