我想使用WebGL和Three.js渲染动画体素场景, 对于业余爱好项目(从服务器端流可视化实时点云数据)。
场景不是很大 - 应该是128 * 128 * 128个体素(2百万点)。
所以我想我可以加载一个包含所有体素数据的大型静态文件,然后逐步添加或删除单个体素,具体取决于来自服务器的流中的事件。
然而,在看到此演示(不是基于音量(具有“内部”细节)但是更简单的“XY坐标+高程+时间”模型)之后:
我想知道:
我可以使用相同的东西(视频,纹理,着色器......)来渲染我的体素动画吗?你会如何实现这个?
我没有那么多的“爱好时间”所以我更愿意在此之前提出问题:)目前我正在考虑为体素模型的每一层加载许多视频。
但我不确定three.js会喜欢它。另一方面,体素总是很大的记忆消费者,所以也许我没有很多选择..
谢谢
更新1:
我确实不需要数据的实时可视化。 我可以偶尔轮询服务器(在GPU上加载之前下载新快照)!
更新2:
每个体素都附有一种材料(“颜色”)
答案 0 :(得分:1)
有很多方法可以解决这个问题,但我会建议如下......
因为它几乎要写一个单一的着色器,我选择[GLOW] [1]来支持Three.js,但这完全取决于你 - 我认为两者都有效,但我认为GLOW会转向清洁。 (实际上,不确定Three.js是否支持drawArrays,这在我的建议中或多或少是必要的。请继续阅读。)
对于数据我会使用4张图像(PNG因为它是无损的),这是......
你只需制作一个着色器,在绘制调用之间,切换纹理并向上/向下移动一个位置(添加到顶点)。
有几种方法可以为体素盒创建顶点。有一种直接的方法:为每个体素框创建顶点/法线属性,使用UVs + bit(基本上是3D UV坐标,如果你愿意)创建一个parallell属性来采样正确的位。这将是巨大的,记忆明智,但可能非常快。
在不太直接的方法上:可能你只能使用3D UV坐标属性加上某种顶点索引(存储在vec4属性中的.w),并在顶点着色器中计算顶点/法线飞。我把它留在那里,因为它是如此多的解释,你可以自己解决它;)
着色器将需要顶点纹理,因为您需要在顶点着色器中对上述纹理进行采样。不幸的是,大多数计算机都支持这一点,但不是全部。
如果设置了该位,则只需像往常一样投影顶点。如果未设置,则将其放在近剪裁平面后面,WebGL管道将为您删除它。
请注意,WebGL中的位操作或多或少是一种痛苦(移位/和/或不可用),您应该避免使用int,因为某些Mac驱动程序不支持这些操作。我以前成功地完成了它,所以它非常可行。
...类似的东西可能会起作用; D