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

OpenGL-一种动态显示大量点的方法,opengl,Opengl,我提供了一个关于我现在正在研究的主题的问题 我有一个OpenGL视图,我想在其中显示点。 到目前为止,这是我能处理的;) 对于每个点,我都有它的坐标(X;Y;Z)和一个值(无符号字符)。 我有一个颜色数组,给出一个值和一种颜色之间的链接。 例如,255是红色,0是蓝色,依此类推 我想在OpenGL视图中显示这些点。 我想使用一个阈值,以便根据它,我可以根据一个点的值修改颜色的透明度值。 我还希望性能不会变差,即使我有很多分数(在最坏的情况下是50亿,但在标准情况下是1~2百万) 我现在正在寻找处

我提供了一个关于我现在正在研究的主题的问题

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

对于每个点,我都有它的坐标(X;Y;Z)和一个值(无符号字符)。 我有一个颜色数组,给出一个值和一种颜色之间的链接。 例如,255是红色,0是蓝色,依此类推

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

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


我愿意接受任何建议,我愿意讨论你的任何想法

> P>如果你需要为更新做一些模拟,你应该考虑使用CUDA或OpenCL来完全在GPU上运行更新。这将给你最好的表现。否则,您可以使用单个VBO并从CPU每帧更新一次。如果速度太慢,您可以尝试使用多个缓冲区,并将更新分发到多个帧


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

如果您需要为更新模拟某些内容,您应该考虑使用CUDA或OpenCL来完全在GPU上运行更新。这将给你最好的表现。否则,您可以使用单个VBO并从CPU每帧更新一次。如果速度太慢,您可以尝试使用多个缓冲区,并将更新分发到多个帧


对于阈值,应使用着色器统一变量,而不是修改顶点缓冲区。这允许您设置一个每帧的值,该值可以与顶点缓冲区中的数据组合(例如,您设置了一个float minVal;并且在几何体着色器中,每个属性小于minVal的顶点都会被丢弃。)

尝试显示十亿点或更多点通常是毫无意义的(请原谅双关语)

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


因此,您的第一步几乎毫无疑问是找到一种方法,将您的显示限制在至少一半合理的点数范围内。如果你要求OpenGL显示更多点,OpenGL可以(也会)同意,但你的显示器不会,也不会,也不会挖掘或显示更多点或其他任何人的点。

试图显示十亿点或更多点通常是毫无意义的(请原谅双关语)

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


因此,您的第一步几乎毫无疑问是找到一种方法,将您的显示限制在至少一半合理的点数范围内。如果您要求OpenGL显示更多内容,OpenGL可以(也将)满足您的要求,但您的显示器不会,您的显示器也不会,您的显示器也不会,您的显示器也不会是我的显示器或其他任何人的显示器。

与您问题的OpenGL部分没有直接关系,但是,如果您正在考虑渲染大规模点云,您可能希望阅读空间分区层次结构(如八叉树),以检查性能。

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

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


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

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


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

Hi Jerry。谢谢你的回复。你有什么方法可以根据屏幕分辨率和OpenGL视图中实际显示的区域来优化点数吗?@Toyo:一般来说,对代码一无所知,很难确定,但从场景图开始可能有意义。嗨,Jerry。谢谢你的回复。你有什么方法可以根据屏幕分辨率和OpenGL视图中实际显示的区域来优化点数吗?@Toyo:一般来说,对代码一无所知,很难确定,但从场景图开始可能有意义。