You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在VisPy中为不同点设置不同的尺寸?

实现Vispy中不同点的自定义尺寸

要给每个点设置不同大小,只需要新增一个存储尺寸数据的顶点缓冲区(VBO),并在顶点着色器中读取该数据来设置gl_PointSize,具体实现步骤如下:

1. 新增尺寸VBO

在_GlPoint类的初始化方法中,添加一个用于存储点尺寸的顶点缓冲区:

self._size_vbo = gloo.VertexBuffer()

2. 修改顶点着色器

在顶点着色器中新增一个attribute变量接收尺寸数据,替换固定的gl_PointSize值:

VERTEX_SHADER = """
    #version 120
    varying vec4 v_color;
    attribute float a_size; // 新增的尺寸属性

    void main()
    {
        gl_Position = $transform($to_vec4($position));
        gl_PointSize = a_size; // 使用传入的尺寸值
        v_color = $color;
    }
"""

3. 在绘制准备阶段传递尺寸数据

在_prepare_draw方法中,新增尺寸数据的传递逻辑,和位置、颜色数据的处理方式保持一致:

def _prepare_draw(self, view):
    if self._parent._changed['pos']:
        if self._parent._pos is None or len(self._parent._pos) == 0:
            return False

        pos = self._parent._point
        self._pos_vbo.set_data(pos)                                                                      

        self._program.vert['to_vec4'] = vec2to4
        
        self._color_vbo.set_data(self._parent._pointColor)
        self._program.vert['color'] = self._color_vbo
        
        # 新增:传递尺寸数据
        size_data = self._parent._pointSize  # 父类需提供(n,1)或(n,)的尺寸数组
        self._size_vbo.set_data(size_data)
        self._program.vert['a_size'] = self._size_vbo

完整修改后的代码

class _GlPoint(Visual):
    VERTEX_SHADER = """
        #version 120
        varying vec4 v_color;
        attribute float a_size;

        void main()
        {
            gl_Position = $transform($to_vec4($position));
            gl_PointSize = a_size;
            v_color = $color;

        }
    """

    FRAGMENT_SHADER = """
        #version 120
        varying vec4 v_color;

        void main()
        {
            gl_FragColor = v_color;
        }
    """

    def __init__(self, parent):
        self._parent = parent
        self._pos_vbo = gloo.VertexBuffer()
        self._color_vbo = gloo.VertexBuffer()
        self._size_vbo = gloo.VertexBuffer()  # 新增尺寸VBO

        Visual.__init__(self, vcode=self.VERTEX_SHADER, fcode=self.FRAGMENT_SHADER, gcode=None)

        self._draw_mode = 'points'
        self._connect   = 'segments'

        self.freeze()

    def _prepare_transforms(self, view):
        xform = view.transforms.get_transform()
        view.view_program.vert['transform'] = xform

    def _prepare_draw(self, view):
        if self._parent._changed['pos']:
            if self._parent._pos is None or len(self._parent._pos) == 0:
                return False

            pos = self._parent._point
            self._pos_vbo.set_data(pos)                                                                      

            self._program.vert['to_vec4'] = vec2to4
            
            self._color_vbo.set_data(self._parent._pointColor)
            self._program.vert['color'] = self._color_vbo
            
            # 传递尺寸数据
            size_data = self._parent._pointSize
            self._size_vbo.set_data(size_data)
            self._program.vert['a_size'] = self._size_vbo

注意事项

  • 确保self._parent._pointSize是形状为(n,1)或(n,)的数组,每个元素对应一个点的尺寸值
  • 如果需要让尺寸适配窗口变换,可以在顶点着色器中结合视图矩阵对a_size做进一步计算

内容的提问来源于stack exchange,提问作者maynull

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 11:43:27