0

我有一个实时绘图系统,它从流中检索和预处理数据并绘制它,每个通道(从 1 到例如 100)绘制在不同的“行”上。带有pyqtgraph后端的版本是完整的,如下所示:

pyqtgraph 版本

但它的性能不是很好。因此,我想使用vispy,基于这个例子。@djhoese 建议我改用更高级别的场景,但我没有找到一种方法来一次传递整个数据数组(通道、样本),就像我使用 low-level 一样gloo,从而限制了 OpenGL 调用。由于性能是我为实时查看器实现后端的主要原因vispy,因此离开该gloo版本没有任何意义。此外,此版本提供了设置行数和列数的可能性。目前,我只使用一列,但未来的改进之一将是根据通道数选择行数/列数。例如,对于使用 128 个通道的系统,2 列窗口将是理想的。

我正在慢慢更改原始示例代码以满足我的需要。下面,您可以找到修改后的着色器(此处为完整代码):

VERT_SHADER = """
#version 120
// y coordinate of the position.
attribute float a_position;
// row, col, and time index.
attribute vec3 a_index;
varying vec3 v_index;
// 2D scaling factor (zooming).
uniform vec2 u_scale;
// Size of the table.
uniform vec2 u_size;
// Number of samples per signal.
uniform float u_n;
// Color.
attribute vec3 a_color;
varying vec4 v_color;
void main() {
    float nrows = u_size.x;
    float ncols = u_size.y;
    // Compute the x coordinate from the time index.
    float x = -0.9 + 1.9*a_index.z / (u_n-1);
    vec2 position = vec2(x - (1 - 1 / u_scale.x), a_position);
    // Find the affine transformation for the subplots.
    vec2 a = vec2(1./ncols, 1./nrows);
    vec2 b = vec2(-1 + 2*(a_index.x+.5) / ncols,
                  -0.9 + 1.8*(a_index.y+0.5) / nrows);
    // Apply the static subplot transformation + scaling.
    gl_Position = vec4(a*u_scale*position+b, 0.0, 1.0);
    v_color = vec4(a_color, 1.);
    v_index = a_index;
}
"""

FRAG_SHADER = """
#version 120
varying vec4 v_color;
varying vec3 v_index;
void main() {
    gl_FragColor = v_color;
    // Discard the fragments between the signals (emulate glMultiDrawArrays).
    if ((fract(v_index.x) > 0.) || (fract(v_index.y) > 0.))
        discard;
}
"""

我所做的更改之一是在窗口上定位不同点的转换。现在,情节区域从左侧开始,-0.9在右侧停止1;并从-0.9顶部开始并在0.9底部停止,从而释放边距。

我的问题是,如何在画布上添加其他元素?我想在例如添加一条固定垂直线-0.9,我想添加文本元素,我想添加一条移动垂直线,一条水平线,...我猜这些元素中的每一个都应该有自己的 VERT和 FRAG 着色器传递给 python 构造函数。这个对吗?您如何指定要在哪个 Canvas 上绘制,以及用于上述元素的不同构造函数是什么?

4

0 回答 0