使用WebGL渲染体素动画的最佳方法?

时间:2012-08-22 15:52:42

标签: webgl three.js voxel

我想使用WebGL和Three.js渲染动画体素场景, 对于业余爱好项目(从服务器端流可视化实时点云数据)。

场景不是很大 - 应该是128 * 128 * 128个体素(2百万点)。

所以我想我可以加载一个包含所有体素数据的大型静态文件,然后逐步添加或删除单个体素,具体取决于来自服务器的流中的事件。

然而,在看到此演示(不是基于音量(具有“内部”细节)但是更简单的“XY坐标+高程+时间”模型)之后:

webgl kinect demo

我想知道:

我可以使用相同的东西(视频,纹理,着色器......)来渲染我的体素动画吗?你会如何实现这个?

我没有那么多的“爱好时间”所以我更愿意在此之前提出问题:)目前我正在考虑为体素模型的每一层加载许多视频。

但我不确定three.js会喜欢它。另一方面,体素总是很大的记忆消费者,所以也许我没有很多选择..

谢谢


更新1:

我确实不需要数据的实时可视化。  我可以偶尔轮询服务器(在GPU上加载之前下载新快照)!


更新2:

每个体素都附有一种材料(“颜色”)

1 个答案:

答案 0 :(得分:1)

有很多方法可以解决这个问题,但我会建议如下......

因为它几乎要写一个单一的着色器,我选择[GLOW] [1]来支持Three.js,但这完全取决于你 - 我认为两者都有效,但我认为GLOW会转向清洁。 (实际上,不确定Three.js是否支持drawArrays,这在我的建议中或多或少是必要的。请继续阅读。)

对于数据我会使用4张图像(PNG因为它是无损的),这是......

  • 128x128像素
  • 每个像素具有(RGBA)4x8 = 32位
  • 每个位代表一个体素
  • 您需要128/32 = 4个128x128图像来表示128x128x128

你只需制作一个着色器,在绘制调用之间,切换纹理并向上/向下移动一个位置(添加到顶点)。

有几种方法可以为体素盒创建顶点。有一种直接的方法:为每个体素框创建顶点/法线属性,使用UVs + bit(基本上是3D UV坐标,如果你愿意)创建一个parallell属性来采样正确的位。这将是巨大的,记忆明智,但可能非常快。

在不太直接的方法上:可能你只能使用3D UV坐标属性加上某种顶点索引(存储在vec4属性中的.w),并在顶点着色器中计算顶点/法线飞。我把它留在那里,因为它是如此多的解释,你可以自己解决它;)

着色器将需要顶点纹理,因为您需要在顶点着色器中对上述纹理进行采样。不幸的是,大多数计算机都支持这一点,但不是全部。

如果设置了该位,则只需像往常一样投影顶点。如果未设置,则将其放在近剪裁平面后面,WebGL管道将为您删除它。

请注意,WebGL中的位操作或多或少是一种痛苦(移位/和/或不可用),您应该避免使用int,因为某些Mac驱动程序不支持这些操作。我以前成功地完成了它,所以它非常可行。

...类似的东西可能会起作用; D