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