2

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

场景不是很大——应该是 128*128*128 体素(200 万点)左右。

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

然而,在看到这个演示后(它不是基于体积(带有“内部”细节)而是一个更简单的“XY坐标+高程+时间”模型):

webgl kinect 演示

我想知道:

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

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

但我不确定three.js 是否会喜欢它。另一方面,体素总是消耗大量内存,所以也许我没有太多选择。

谢谢


更新1:

事实上,我不需要数据的实时可视化。我可以偶尔轮询一下服务器(在 GPU 上加载前一个快照后立即下载一个新快照)!


更新 2:

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

4

1 回答 1

1

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

由于几乎只需要编写一个着色器,我会选择 [GLOW][1] 来支持 Three.js,但这完全取决于你 - 我认为两者都可以工作,但我认为 GLOW 会变得更干净。(实际上,不确定 Three.js 是否支持 drawArrays,这在我的建议中或多或少是必要的。请继续阅读。)

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

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

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

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

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

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

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

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

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

于 2012-08-23T07:38:05.993 回答