This is an example that I referred to : https://github.com/vispy/vispy/blob/d7763448dd398e5dab91cc21db7378c1aa707c63/vispy/visuals/line/line.py#L273
class _GlPoint(Visual):
VERTEX_SHADER = """
#version 120
varying vec4 v_color;
void main()
{
gl_Position = $transform($to_vec4($position));
gl_PointSize = 12;
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()
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
There are 2 inputs: self._parent._point
is an (n, 2) array that corresponds to X, Y coordinates. self._parent._pointColor
is an (n, 4) array that corresponds to the colors of the points.
It works fine when I set gl_PointSize
as a fixed number. My question is how to use another array to set different point sizes. I looked into Visual/Markers but it uses just one VertexBuffer, which is different from Visual/Lines, so I'm more confused. If it's not so complicated, could anyone show me how it can be done?