渲染海量数据

Posted

技术标签:

【中文标题】渲染海量数据【英文标题】:Rendering massive amount of data 【发布时间】:2011-07-14 11:13:36 【问题描述】:

我有一个 3D 浮点矩阵,在最坏的情况下,大小可能是 (200000x1000000x100),我想使用 Qt/OpenGL 可视化这个矩阵。

由于元素的数量非常多,我想以一种方式渲染它们,当相机远离矩阵时,我只显示一些有趣的点,这些点给出了矩阵外观的近似值。当相机靠近时,我想获得更多细节,因此计算出更多元素。

我想知道是否有处理这种可视化的技术。

【问题讨论】:

1e5³ 浮点元素。这相当于大约 4PB 的数据。你确定这个数字是正确的吗? @datenwolf:我猜他的矩阵是稀疏的 @eznme:可能。但我在想最坏的情况。我认为最好的攻击线是将矩阵(假设它是稀疏的)转换为空间细分树(Kd 或八叉树)并将其可视化到某个分叉深度阈值。 @datenwolf 我也会这样做 只是一个提示:除了给出的重要提示之外,您可能还想搜索有关“核外渲染”的工作以获取其他材料。 【参考方案1】:

总体思路称为细节层次渲染,它本身就是一门完整的科学。

对于您的域,我建议两个步骤:

1) 通过在不同大小的多维数据集中对它们进行平均(算术平均函数)并缓存这些多维数据集(在磁盘和 RAM 上)来减少单元的数量。 “不同”在这里意味着您在多种尺寸的立方体中拥有相同的数据,例如10000x10000x10000 的粗粒度立方体和 100x100x100 单元格的细立方体,从而产生多个细节层次。您必须将它们组织在一个层次结构中(较大的包含多个较小的),为此我建议使用 Octree: http://en.wikipedia.org/wiki/Octree

2) 第二步是实际渲染这个八叉树的一部分: 为此,请使用您的相机点到子立方体的距离。通过立方体并决定进入子立方体或通过使用此距离函数和启发式选择或猜测的阈值来渲染更大的立方体。

(2) 可以进一步优化,但这是可选的:要优化此渲染,将要渲染的立方体组织成层:层的方向(是否在 x、y 或 z 切片中)取决于在您的相机视点上,它应该接近垂直。然后将每个切片渲染成一个纹理,瞧,您只需为每个切片使用该纹理渲染一个四边形,渲染 1000 个四边形是没有问题的。

【讨论】:

感谢先生的精彩评论,我将在接下来的几周内研究您提到的内容。我想如果你也能推荐一些文献给我最好,因为我有不同的知识背景,我需要阅读更多关于这个主题的内容。 关于这个你不需要读太多,操作(在八叉树中递归分组,对立方体中的所有数据进行平均并存储它,计算到(子)立方体的距离,渲染它们) 在概念上很容易;但是有一个实现细节可能很棘手,您必须牢记:对许多数字求平均值可能在数值上不稳定;将所有单元格添加到单个双精度浮点数中,然后将其除以单元格数不是最佳的(请参阅有关算术平均值的数字文献)。【参考方案2】:

Qt 有一些方法可以有效地渲染大量元素。检查属于 QT 的examples/demo。

【讨论】:

以上是关于渲染海量数据的主要内容,如果未能解决你的问题,请参考以下文章

数据篇31 # 如何对海量数据进行优化性能?

数据篇31 # 如何对海量数据进行优化性能?

介绍一下海量数据的处理方法

海量数据分析处理方法

SQL如何快速处理海量数据?

如何处理海量数据