使用 OpenGL 的散点图:如何设置标记样式
Posted
技术标签:
【中文标题】使用 OpenGL 的散点图:如何设置标记样式【英文标题】:Scatter plots with OpenGL: how to style markers 【发布时间】:2012-10-20 09:57:19 【问题描述】:我正在尝试使用 OpenGL(出于性能原因)绘制散点图。我对 2D 和 3D 都感兴趣。
我有哪些样式标记的选项,例如可见不同的组?
显然我可以改变颜色。但在“传统”散点图中,也使用圆形、加号、Xes、框等 - 我如何在 OpenGL 散点图中最好地实现这些?
我是否应该将所需的 2D 标记渲染为一个小纹理,然后为每个标记绘制一个带有纹理的三角形?我可以将纹理仅用于 Alpha,但使用动态颜色吗? (例如有纹理=类,颜色=其他分数)?
在 OpenGL 中是否有任何我在常规绘图库(例如,gnuplot)中没有的用于设置标记样式的非常酷的方法?
关于性能的任何提示?显示列表或顶点缓冲区?
【问题讨论】:
【参考方案1】:这是很多问题。让我一一解决。
我有哪些样式标记的选项,例如可见不同的组?
颜色、形状、大小,甚至动画。
显然我可以改变颜色。但在“传统”散点图中,也使用圆形、加号、Xes、框等 - 我如何在 OpenGL 散点图中最好地实现这些?
广告牌精灵 (tutorial)。这个想法是绘制一个小四边形,使其始终面向相机。这种旋转可以在 CPU 上完成,但如果相机移动并且您需要在每一帧重新计算它,那么在顶点着色器中执行它可能会更快。
我是否应该将所需的 2D 标记渲染到一个小纹理,然后为每个标记绘制一个带有纹理的三角形?
两个三角形(即一个正方形)是常用的方法,因为正方形更容易纹理化。
我可以只为 Alpha 使用纹理,但使用动态颜色吗? (例如有纹理=类,颜色=其他分数)?
是的。如果您使用固定管道,纹理将由当前颜色调制。换句话说,如果您的纹理中有一个带有 alpha 的白色标记,并且您将当前颜色设置为红色,您将得到一个红色标记。如果您使用着色器,则必须在片段着色器中执行此操作。
在 OpenGL 中是否有任何我在常规绘图库(例如,gnuplot)中没有的用于设置标记样式的非常酷的方法?
就像我提到的:动画。你可以让你的标记旋转,上下摆动,或者以不同的速度随机摆动。我曾经听说过一种计算机网络可视化系统,其中水会从计算机图标中滴出以指示数据包丢失,并且会冒出烟雾和火来指示 CPU 过热。极限是你的想象力!
关于性能的任何提示?显示列表或顶点缓冲区?
顶点缓冲区。可能是着色器。但根据您的数据集大小和您使用 OpenGL 的经验,您可以不使用任何一种。
先尝试最简单的事情,如果太慢,用更快的实现来代替瓶颈。不要试图一次做所有事情;让一件事发挥作用,然后逐步添加和改进一个步骤。
【讨论】:
感谢您的广泛回复。这对我帮助很大。动画是一个很好的指针,我可以例如使用脉冲效应指示选择。广告牌听起来似乎有助于 3D 情节。【参考方案2】:OpenGL 在它为您提供的图形基元方面是非常基础的。任何比点、线或三角形更复杂的东西,无论是否有纹理,都必须由用户实现。
我认为最好的做法是在标记位置绘制小四边形。使用实例化绘图和着色器可以非常有效地完成此操作。寻找现代粒子系统渲染技术来获得这个想法。标记的形状可以由纹理定义,或者,这就是我要做的,在片段着色器中通过求解一些描述标记形状的方程来程序化,并且discard
-ing 所有片段不属于形状。
【讨论】:
如今着色器的便携性如何?我什至需要它才能在我的 Atom 上网本上工作。对我来说,着色器听起来仍然像是我的(低端)图形不完全支持的东西。但谷歌表示像素着色器 2.0 应该可以工作。感谢您提供粒子系统的指针,我没有想到这个并行! @Anony-Mousse:着色器,至少着色器模型 2 现在应该无处不在。不幸的是,当您说“Intel Atom”时,这有点不具体,因为在整个 Atom 世代中使用了不同的 GPU 内核。但是它们都应该支持着色器模型 2。但是请注意,英特尔的 Windows OpenGL 驱动程序有错误和损坏的代表。而且据我所知,Atom 也没有完美运行的 Linux OpenGL 驱动程序。 我实际上在 Linux 上。我没有注意到这里的英特尔驱动程序有任何缺陷,与我更旧的 i945 相比,我确实在其中一个游戏中看到了故障(但显然,在使用旧英特尔显卡的 Windows 上根本无法运行)。但我会将像素着色器 2 放在我的“调查列表”中。无处不在是我所需要的。 @Anony-Mousse:你用什么 Atom?其中一些具有 GPU,这些 GPU 得到了 Mesa/DRI2 的 Linux OSS 驱动程序的良好支持。非 Atom 英特尔 GPU 实际上在 Linux 下工作得非常好,而且驱动程序质量非常好。 我不太清楚,lspci 只说 D4xx/D5xx/N4xx/N5xx。但是 AFAICT 驱动程序比 945GM/GMS 943/940GML 的驱动程序工作得更好。事实上,后者的问题似乎与着色器有关。以上是关于使用 OpenGL 的散点图:如何设置标记样式的主要内容,如果未能解决你的问题,请参考以下文章
使用 OpenGL 在 C++ 中绘制具有大量数据点的散点图的最佳方法