如何在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
相关产品推荐
相关产品推荐

