6

最近我开始开发体素引擎。我需要的只是没有纹理的彩色体素,但数量非常大(比我的世界小得多)——问题是如何快速绘制场景?我使用的是 c#/xna,但我认为这在这种情况下不是很重要,让我们谈谈一般情况。看看这两个游戏:

  1. http://www.youtube.com/watch?v=EKdRri5jSMs
  2. http://www.youtube.com/watch?v=in0bavLJ8KQ

特别是我认为 2 号视频代表了很好的优化方法(我的 gfx 卡在 192 x 192 x 64 时开始窒息)他们是如何实现这一点的?

我会在引擎中拥有什么:

  • 没有纹理但有阴影的彩色体素
    • 很多很多体素,比如至少 512 x 512 x 128 来实现类似视频 #2 的效果
    • 阴影(平滑的阴影会很棒,但这不是必需的)
    • 可选:动态照明(例如来自飞行的火球,在体素结构附近点亮)
    • 帧率最低 40 FPS
    • 相机有 3 种自由方式(x 轴移动、y 轴移动、z 轴移动),无需旋转相机
    • 最后可选功能可能是景深(它会很甜^^)

我已经知道什么优化:

  • 删除位于体素结构内的看不见的体素(其他体素从六个方向覆盖)
    • 删除看不见的体素面 - 因为相机没有旋转并且总是像 TPP 游戏一样向前倾斜,所以如果我们通过垂直切割划分屏幕,左体素和右体素将只显示 3 个面
    • 将体素保留在字典中而不是 3 维数组中 - 跳过大小为 512 x 512 x 128 的数组需要几毫秒,这是不可接受的 - 但字典 int:color 其中 int 描述打包的 3D 位置要快得多
    • 在适用的情况下使用实例化
    • 遮挡?(这个怎么做?)
    • 空间划分/八叉树(这是个好主意吗?)

如果有人给我提示如何改进上面列出的现有优化或者可以分享新改进的想法,我将非常感激。谢谢

4

2 回答 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

于 2011-10-12T20:09:14.037 回答
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-instance-pc-only/

DrawIndexedPrimitive基本概念是实例化:此功能允许您在单个调用中指定一定数量的重复数据和一定数量的变化数据。在您的情况下,实例流将是单个实心框,另一个流将是变换和颜色信息。

于 2011-10-12T20:39:55.430 回答