OpenGL - 一种动态显示大量点的方法

时间:2011-05-03 14:33:59

标签: opengl

我正在提出一个关于我正在研究的主题的问题。

我有一个OpenGL视图,我想在其中显示点。 到目前为止,这是我可以处理的事情;)

对于每一点,我都有它的坐标(X; Y; ​​Z)和一个值(unsigned char)。 我有一个颜色数组,给出一个值和一个颜色之间的链接。 例如,255为红色,0为蓝色,依此类推......

我想在OpenGL视图中显示这些点。 我想使用一个阈值,以便根据它,我可以根据一个点的值修改颜色的透明度值。 我还希望即使我有很多分数(在最坏的情况下为50亿,但在标准情况下为1~2百万),性能也不会变坏。

我现在正在寻找处理此问题的有效方法。 我对VBO很感兴趣。我已经读过它可以提供一些良好的性能,而且我可以根据需要修改缓冲区而无需从头开始重新计算(与显示列表一样)。 这样我就可以解决门槛问题了。 但是,动态地在一百万个点上执行此操作将提供一些繁重的计算(至少对循环来说非常糟糕),不是吗?

我对任何建议持开放态度,我想讨论你的任何想法!

4 个答案:

答案 0 :(得分:3)

试图显示十亿分或更多分一般(原谅双关语)毫无意义。

即使是极高分辨率的屏幕也只有几百万像素。你所做的一切都不会让它显示出更多的分数。

因此,您的第一步几乎无疑是找出一种方法将您的显示限制在至少一半合理的点数。如果你要求它显示更多,OpenGL可以(并且将会)强制要求,但是你的显示器不会,也不会开采或者很多或者其他任何人。

答案 1 :(得分:3)

与您的问题的OpenGL部分没有直接关系,但如果您正在寻找渲染大量的点云,您可能需要阅读空间分区层次结构(如八叉树)以控制性能。

答案 2 :(得分:1)

如果您需要为更新模拟某些内容,则应考虑使用CUDA或OpenCL在GPU上完全运行更新。这将为您提供最佳性能。否则,您可以使用单个VBO并从CPU每帧更新一次。如果速度太慢,您可以尝试使用多个缓冲区并将更新分布到多个帧中。

对于阈值,您应该使用着色器统一变量而不是修改顶点缓冲区。这允许您设置每帧的值,然后可以将其与顶点缓冲区中的数据组合在一起(例如,您设置一个浮点minVal;并且在几何着色器中将丢弃具有小于minVal的某个属性的每个顶点。)< / p>

答案 3 :(得分:0)

将所有内容放入一个VBO中。将其绘制为点数组:glDrawArrays(GL_POINTS,0,num)。计算像素着色器中的alpha(使用作为统一传递的阈值)。

如果要更改一小部分点,可以映射VBO的子范围。如果您需要经常更新大型部件 - 您可以使用“变换反馈”来使用GPU。