Re: [PyOpenGL-Devel] Display lists 30 times faster than VBOs ?
Brought to you by:
mcfletch
From: enrike <al...@gm...> - 2010-06-30 03:10:44
|
just an idea.... the bottleneck could be in python and not in opengl, remember that function call is expensive in python az., 2010.eko ekaren 30a 01:33(e)an, Eleftherios Garyfallidis(e)k idatzi zuen: > Hello, > > We are trying to visualize some quite big brain white matter datasets > with PyOpenGL. We have around a quarter of a million of trajectories > where each trajectory consists of up to around 100 line segments. The > goal application is to be able to pick/select and update some or all of > the trajectories in real time in order to help practitioners find their > way through the brain. We had quite a good progress selecting and > picking trajectories using gluUnProject however we are not sure which > design direction we should take from now on as far as vbos are > concernced. According to the Red Book and the community blogs vertex > buffer objects should be more preferable than display lists now and in > the future and display lists have already being tagged as deprecated. We > would very much like your thoughts and feedback about this. > > We are testing this software on a Nvidia GeForce GTX 260 and use > PyOpenGL 3.0.1 > > The following class shows what we tried to do. The input of the class as > shown in __init__() is data which is a list of trajectories where every > trajectory is represented by numpy arrays of shape (N,3) , colors is the > similar but a list of arrays of shape (N,4) (where N is different from > trajectory to trajectory) and if the lists parameter is True then we use > display lists with vbo eitherwise we use vbos only. > > Surprisingly, when using lists=True we get more than 30fps and when > lists=False we get between 1-2 fps. Any ideas what is the reason for > this dramatic change? Shouldn't vbos be the same or faster than dls? > > class Tracks(): > > def __init__(self,data,colors,line_width=3.,lists=False): > > Actor.__init__(self) > > self.data=data > self.cdata=None > self.colors=colors > self.line_width=line_width > self.list_index = None > self.vbo = None > self.lists = lists > > def init(self): > self.init_default() > > def init_default(self): > > self.counts=[len(d) for d in self.data] > cdata=np.concatenate(self.data) > first=np.array(self.counts).cumsum() > self.first=list(np.hstack((np.array([0]),first[:-1]))) > ccolors=np.concatenate(self.colors) > self.min=np.min(cdata,axis=0) > self.max=np.max(cdata,axis=0) > self.mean=np.mean(cdata,axis=0) > cdata = cdata - self.mean > self.cdata = cdata > > stack=np.hstack((cdata,ccolors)) > stack=stack.astype('float32') > self.vbo = vbo.VBO(stack,usage='GL_STATIC_DRAW') > #self.vbo = > vbo.VBO(np.hstack((cdata,ccolors)),usage=gl.GL_DYNAMIC_DRAW) > > if self.lists: > > self.list_index = gl.glGenLists(1) > gl.glNewList( self.list_index,gl.GL_COMPILE) > self._execute_vbos() > gl.glEndList() > > > def _execute_vbos(self): > > gl.glDisable(gl.GL_LIGHTING) > gl.glDisable(gl.GL_DEPTH_TEST) > gl.glEnable(gl.GL_BLEND) > gl.glBlendFunc(gl.GL_SRC_ALPHA,gl.GL_ONE_MINUS_SRC_ALPHA) > gl.glLineWidth(self.line_width) > > self.vbo.bind() > try: > gl.glEnableClientState(gl.GL_VERTEX_ARRAY) > gl.glEnableClientState(gl.GL_COLOR_ARRAY) > #gl.glVertexPointerf(cdata) > gl.glVertexPointer(3, gl.GL_FLOAT, 28, self.vbo ) > gl.glColorPointer(4, gl.GL_FLOAT, 28, self.vbo+12 ) > gl.glMultiDrawArrays(gl.GL_LINE_STRIP,\ > self.first,self.counts,len(self.counts)) > finally: > self.vbo.unbind() > > gl.glDisableClientState(gl.GL_COLOR_ARRAY) > gl.glDisableClientState(gl.GL_VERTEX_ARRAY) > gl.glDisable(gl.GL_BLEND) > gl.glEnable(gl.GL_LIGHTING) > gl.glEnable(gl.GL_DEPTH_TEST) > > > def display(self): > > gl.glPushMatrix() > x,y,z = self.position > gl.glTranslatef(x,y,z) > > if self.lists: > gl.glCallList(self.list_index) > else: > self._execute_vbos() > > gl.glPopMatrix() > > > The Tracks.display function is called from glutDisplayFunc from another > file after the object has been initialized using the init function. We > would be very happy to hear about your ideas to make this visualization > better and ideas about how to update the datasets using the vbo from > OpenGL.arrays or a different method in a nice efficient way. > > We would be more than happy to continue using PyOpenGL and contribute to > the list in the future. PyOpenGL fits very well with a new project we > have created found at nipy.org/dipy <http://nipy.org/dipy> .We are more > than eager at the moment to switch from python-vtk or mayavi to pyopengl > for all our visualization needs as we think that it can deal better with > big datasets. > > Best wishes, > Eleftherios & Ian > > > > > > > > ------------------------------------------------------------------------------ > This SF.net email is sponsored by Sprint > What will you do first with EVO, the first 4G phone? > Visit sprint.com/first -- http://p.sf.net/sfu/sprint-com-first > > > > _______________________________________________ > PyOpenGL Homepage > http://pyopengl.sourceforge.net > _______________________________________________ > PyOpenGL-Devel mailing list > PyO...@li... > https://lists.sourceforge.net/lists/listinfo/pyopengl-devel |