根据我收集到的信息,他使用了稀疏体素八叉树和光线投射。他似乎没有使用 opengl 或 direct3d,当我查看游戏 Voxelstein 时,似乎实际上正在绘制微型立方体,而不仅仅是一堆 2d 正方形。这让我措手不及,我不确定他是如何在没有 opengl 或 direct3d 的情况下做到这一点的。
我试图通读源代码,但我很难理解发生了什么。我想实现类似的东西,并希望算法这样做。
我对他如何执行渲染、剔除、遮挡和照明很感兴趣。任何帮助表示赞赏。
根据我收集到的信息,他使用了稀疏体素八叉树和光线投射。他似乎没有使用 opengl 或 direct3d,当我查看游戏 Voxelstein 时,似乎实际上正在绘制微型立方体,而不仅仅是一堆 2d 正方形。这让我措手不及,我不确定他是如何在没有 opengl 或 direct3d 的情况下做到这一点的。
我试图通读源代码,但我很难理解发生了什么。我想实现类似的东西,并希望算法这样做。
我对他如何执行渲染、剔除、遮挡和照明很感兴趣。任何帮助表示赞赏。
该算法比光线追踪更接近光线投射。你可以在这里得到 Ken Silverman 本人的解释:
https://web.archive.org/web/20120321063223/http://www.jonof.id.au/forum/index.php?topic=30.0
简而言之:在网格上,为每个 x,y 体素堆栈存储一个表面体素列表(如果 z 表示“向上”)。假设有 4 个自由度,对屏幕上的每条垂直线进行射线投射,并维护一个可见跨度列表,该列表在绘制每个立方体时被剪裁。对于 6 个自由度,执行类似的操作,但扫描线在屏幕空间中倾斜。
我没有看算法本身,但我可以根据截图告诉以下内容:
看起来实际上是在绘制微型立方体,而不仅仅是一堆二维正方形
是的,这就是光线追踪的工作原理。它不绘制二维正方形,它跟踪光线。如果您将光线追踪到许多微型立方体上,您会看到许多微型立方体。该场景由许多微型立方体(体素)表示,因此当您近距离观察时会看到它们。以某种方式实际平滑数据(跟踪平滑的能量函数)以使它们看起来更平滑会很好。
我对他如何进行渲染很感兴趣
通过光线追踪
剔除
光线追踪时无需剔除,尤其是在体素场景中。当您沿着射线移动时,您只检查射线相交的体素。
遮挡
体素-体素遮挡由光线追踪自然处理;它将返回最接近的第一个体素命中。如果您绘制精灵,您可以使用光线追踪器生成的 Z 缓冲区。
和照明
通过查看附近的单元格并查看哪些被占用,哪些未被占用,可以近似局部法线。然后进行光照计算。或者,每个体素可以存储法线及其颜色或其他材料属性。