5

根据我收集到的信息,他使用了稀疏体素八叉树和光线投射。他似乎没有使用 opengl 或 direct3d,当我查看游戏 Voxelstein 时,似乎实际上正在绘制微型立方体,而不仅仅是一堆 2d 正方形。这让我措手不及,我不确定他是如何在没有 opengl 或 direct3d 的情况下做到这一点的。

我试图通读源代码,但我很难理解发生了什么。我想实现类似的东西,并希望算法这样做。

我对他如何执行渲染、剔除、遮挡和照明很感兴趣。任何帮助表示赞赏。

4

2 回答 2

7

该算法比光线追踪更接近光线投射。你可以在这里得到 Ken Silverman 本人的解释:

https://web.archive.org/web/20120321063223/http://www.jonof.id.au/forum/index.php?topic=30.0

简而言之:在网格上,为每个 x,y 体素堆栈存储一个表面体素列表(如果 z 表示“向上”)。假设有 4 个自由度,对屏幕上的每条垂直线进行射线投射,并维护一个可见跨度列表,该列表在绘制每个立方体时被剪裁。对于 6 个自由度,执行类似的操作,但扫描线在屏幕空间中倾斜。

于 2010-10-27T12:25:38.173 回答
5

我没有看算法本身,但我可以根据截图告诉以下内容:

看起来实际上是在绘制微型立方体,而不仅仅是一堆二维正方形

是的,这就是光线追踪的工作原理。它不绘制二维正方形,它跟踪光线。如果您将光线追踪到许多微型立方体上,您会看到许多微型立方体。该场景由许多微型立方体(体素)表示,因此当您近距离观察时会看到它们。以某种方式实际平滑数据(跟踪平滑的能量函数)以使它们看起来更平滑会很好。

我对他如何进行渲染很感兴趣

通过光线追踪

剔除

光线追踪时无需剔除,尤其是在体素场景中。当您沿着射线移动时,您只检查射线相交的体素。

遮挡

体素-体素遮挡由光线追踪自然处理;它将返回最接近的第一个体素命中。如果您绘制精灵,您可以使用光线追踪器生成的 Z 缓冲区。

和照明

通过查看附近的单元格并查看哪些被占用,哪些未被占用,可以近似局部法线。然后进行光照计算。或者,每个体素可以存储法线及其颜色或其他材料属性。

于 2010-09-25T15:42:16.167 回答