有人可以描述Ken Silverman的Voxlap引擎使用的算法吗?

Xav*_*ier 5 opengl graphics rendering raytracing real-time

从我收集到的,他使用稀疏的体素八叉树和光线投射.似乎他没有使用opengl或direct3d,当我看到游戏Voxelstein时,看起来微型立方体实际上是被绘制而不是仅仅是一堆2d方形.这让我措手不及我不知道他如何在没有opengl或direct3d的情况下做到这一点.

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

我对他如何进行渲染,剔除,遮挡和照明感兴趣.任何帮助表示赞赏.

小智 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个自由度,执行类似的操作,但扫描线在屏幕空间中倾斜.


ybu*_*ill 5

我没有看过算法本身,只是截图:

看起来微型立方体实际上是绘制而不是只是一堆2d方形

是的,这就是光线跟踪的工作原理.它不绘制2d方格,它跟踪光线.如果你用许多微型立方体追踪你的光线,你会看到许多微型立方体.场景由许多微型立方体(体素)代表,因此当您仔细观察时,您会看到它们.实际上以某种方式平滑数据(跟踪平滑的能量函数)以使它们看起来更平滑将是很好的.

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

通过射线追踪

剔除

光线追踪时无需剔除

闭塞

通过光线追踪自然地处理体素 - 体素遮挡.如果他绘制精灵,他可以使用由射线追踪器生成的Z缓冲区.

和照明

通过查看附近的细胞并查看哪些被占用而哪些不被占用,可以近似局部法线.然后执行照明计算.

任何帮助表示赞赏.

谢谢.