0

我有一个过程随着时间的推移积累大部分静态数据——其中很多,数百万个数据元素。数据的一小部分可能偶尔会发生变化,但大多数情况下不会发生变化。

但是,我希望允许用户自由更改查看这些数据的方式,包括形状和颜色。

有没有一种方法可以将数据作为数据存储在 GPU 上。然后有多种方法可以将该数据转换为可在 GPU 上渲染的数据。然后,用户可以在这些算法之间进行选择,我们可以有效地交换它,而无需接触数据。此外,颜色 id 将在数据中,但用户可以再次更改每个 id 应匹配的颜色,而无需触摸数据。

因此,例如,也许有以下数据:

[1000, 602, 1, 1] [1003, 602.5, 2, 2]

注意:数据不是顶点,而是可能需要一些计算或查找才能转换为顶点。

用户可以在可视化算法之间进行选择。假设在 (0, 602, 0) 和 (3, 602.5, 100) 处分别显示 2 个立方体。用户选择颜色 id 1 = blue 和 2 = green。所以原点立方体显示为蓝色,另一个显示为绿色。

然后完全不修改数据,用户选择不同的可视化,现在球体显示在 (10, 602, 10) 和 (13, 602.5, 20) 并且颜色不同,因为用户更改了颜色映射.

另一个可视化可能会显示所有数据元素之间的线条,或每组 4 个的矩形等。

上面的描述是否可以直接完成?怎么做最好?

请注意,我们将添加很多新数据,并附加到末尾。每秒可能爆发数千次。对现有数据的修改将更加罕见,并且在这些情况下对性能造成影响是可以接受的。用户更改算法和颜色映射相对较少。

我更喜欢使用跨平台 API(跨操作系统和 GPU)来做到这一点,所以我假设使用 OpenGL。

4

2 回答 2

1

您可以将数据存储在 VBO(在 GPU 内存中)并在它更改时更新它。

在 GPU 方面,您可以使用几何着色器来生成更多几何。不知道如何从线切换到立方体再到球体,但如果您在每个位置绘制一个三角形,您的 GS 可以输出“额外”三角形(线和点同上)。

至于颜色更改功能,您可以将该逻辑烘焙到顶点着色器中。idx(1, 2, ...) 应该是一个顶点属性;让 VS 查找提供 idx -> 颜色映射的表(这可以存储为小纹理)。您可以更新纹理以动态更改颜色映射。

于 2013-04-10T06:35:51.543 回答
0

对于像您这样的应用程序,有特殊的 GPGPU 编程基础设施:CUDA 和 OpenCL。OpenCL 是跨供应商系统。CUDA 是跨平台的,但仅支持 NVidia GPU。OpenGL 也确实在 OpenGL-4.2(计算着色器)中引入了通用计算功能。

还有很多,数以百万计的数据元素

数百万不是很多,即使单个元素消耗 100 个字节,也只有 100 MiB 可以传输。现代 GPU 可以从/向主机系统内存传输大约 10 GiB/s。

上面的描述是否可以直接完成?怎么做最好?

是的,它可以做到。但是,只有当您可以并行化您的问题并使其内存访问模式迎合 GPU 的偏好时,您才会真正看到性能。特别是糟糕的内存访问模式会导致几个数量级的性能损失。

于 2013-04-10T11:10:42.903 回答