PyOpenGL, wxPython weird behaviour

Discussion in 'Python' started by Adeola Bannis, Jan 3, 2008.

  1. Hi everyone,

    I'm doing a project using wxPython and pyopengl, and I seem to have a
    problem rendering textures. This is code that worked before my hard
    drive had a meltdown, but not since I re-installed everything.

    I've determined the problem is in the OpenGL part of my program. I do
    some calculations to generate a 2D numpy array that holds the image
    data, and pylab.imshow() shows me the image as it is meant to be. I
    used the same algorithm in Octave and MATLAB, and all are giving me
    the right picture.

    However, using pyOpenGL and the numpyhandler functions (http://cours-
    info.iut-bm.univ-fcomte.fr/docs/python/OpenGL/
    OpenGL.arrays.numpymodule.NumpyHandler-class.html) doesn't seem to
    work. I get a garbled screen pocked with black pixels. I am including
    my openGL code below. What am I doing wrong?

    And yes, I did make the dtype of my array 'float32'.

    -------code snippets------

    import wx
    from wx.glcanvas import GLCanvas

    from OpenGL.GLU import *
    from OpenGL.GL import *
    from OpenGL.arrays.numpymodule import NumpyHandler


    PC = 1
    RI = 0

    class myGLCanvas(GLCanvas):
    def __init__(self, parent):
    GLCanvas.__init__(self, parent,-1)
    wx.EVT_PAINT(self, self.OnPaint)
    self.init = 0
    self.mode = -1
    # making a texture for the range image
    self.texture = glGenTextures(1)
    # making a spot for the point cloud points
    self.cloud = None
    return

    def OnPaint(self,event):
    dc = wx.PaintDC(self)
    self.SetCurrent()
    if not self.init:
    self.InitGL()
    self.init = 1
    self.OnDraw()
    return

    def OnDraw(self):
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
    if self.mode == RI:
    self.drawRange()
    elif self.mode == PC:
    self.drawCloud()


    def InitGL(self):
    glClearColor(0.0, 0.0, 0.0, 0.0);
    glClearDepth(1.0)
    glEnable(GL_DEPTH_TEST)
    glDepthFunc(GL_LEQUAL)
    glClear(GL_COLOR_BUFFER_BIT)

    glPixelStorei(GL_UNPACK_ALIGNMENT, 1)
    glPixelStorei(GL_PACK_ALIGNMENT, 1)

    #NTSC colour scales...
    glPixelTransferf(GL_RED_SCALE, 0.299);
    glPixelTransferf(GL_GREEN_SCALE, 0.587);
    glPixelTransferf(GL_BLUE_SCALE, 0.114);

    glMatrixMode(GL_PROJECTION)
    glLoadIdentity()
    glOrtho(0.0,1.0,0,1.0,-1.0,1.0)
    glMatrixMode(GL_MODELVIEW)
    glLoadIdentity()

    return

    def rangeImage(self, image):

    glBindTexture(GL_TEXTURE_2D, self.texture)
    glTexEnvf( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE )


    glTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
    GL_LINEAR)
    glTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR)
    glTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT)
    glTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT)

    # flatten it into a list so the OpenGL calls work
    n = NumpyHandler()
    fI = image.flatten()
    flatImage = n.dataPointer(n.contiguous(fI))

    print n.contiguous(fI)

    gluBuild2DMipmaps(GL_TEXTURE_2D, 1, image.shape[0]+1,
    image.shape[1]+1,
    GL_LUMINANCE, GL_FLOAT, flatImage)
    self.mode = RI
    self.OnDraw()


    def drawRange(self):
    ''' Controls the actual drawing of the range image'''

    glMatrixMode(GL_MODELVIEW)
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)

    glColor3f(1.0,1.0,1.0)
    glEnable(GL_TEXTURE_2D)
    glBindTexture(GL_TEXTURE_2D, self.texture)
    glBegin(GL_TRIANGLE_FAN)
    glTexCoord2d(1,1); glVertex3f(0.0, 0.0, 0.0)
    glTexCoord2d(1,0); glVertex3f(0.0, 1.0, 0.0)
    glTexCoord2d(0,0); glVertex3f(1.0, 1.0, 0.0)
    glTexCoord2d(0,1); glVertex3f(1.0, 0.0, 0.0)
    glEnd()
    self.SwapBuffers()

    --------end snippet-----------
     
    Adeola Bannis, Jan 3, 2008
    #1
    1. Advertising

  2. Adeola Bannis

    Guest

    On Jan 3, 11:50 am, Adeola Bannis <> wrote:
    > Hi everyone,
    >
    > I'm doing a project using wxPython and pyopengl, and I seem to have a
    > problem rendering textures. This is code that worked before my hard
    > drive had a meltdown, but not since I re-installed everything.
    >
    > I've determined the problem is in the OpenGL part of my program. I do
    > some calculations to generate a 2D numpy array that holds the image
    > data, and pylab.imshow() shows me the image as it is meant to be. I
    > used the same algorithm in Octave and MATLAB, and all are giving me
    > the right picture.
    >
    > However, using pyOpenGL and the numpyhandler functions (http://cours-
    > info.iut-bm.univ-fcomte.fr/docs/python/OpenGL/
    > OpenGL.arrays.numpymodule.NumpyHandler-class.html) doesn't seem to
    > work. I get a garbled screen pocked with black pixels. I am including
    > my openGL code below. What am I doing wrong?
    >
    > And yes, I did make the dtype of my array 'float32'.
    >
    > -------code snippets------
    >
    > import wx
    > from wx.glcanvas import GLCanvas
    >
    > from OpenGL.GLU import *
    > from OpenGL.GL import *
    > from OpenGL.arrays.numpymodule import NumpyHandler
    >
    > PC = 1
    > RI = 0
    >
    > class myGLCanvas(GLCanvas):
    > def __init__(self, parent):
    > GLCanvas.__init__(self, parent,-1)
    > wx.EVT_PAINT(self, self.OnPaint)
    > self.init = 0
    > self.mode = -1
    > # making a texture for the range image
    > self.texture = glGenTextures(1)
    > # making a spot for the point cloud points
    > self.cloud = None
    > return
    >
    > def OnPaint(self,event):
    > dc = wx.PaintDC(self)
    > self.SetCurrent()
    > if not self.init:
    > self.InitGL()
    > self.init = 1
    > self.OnDraw()
    > return
    >
    > def OnDraw(self):
    > glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
    > if self.mode == RI:
    > self.drawRange()
    > elif self.mode == PC:
    > self.drawCloud()
    >
    > def InitGL(self):
    > glClearColor(0.0, 0.0, 0.0, 0.0);
    > glClearDepth(1.0)
    > glEnable(GL_DEPTH_TEST)
    > glDepthFunc(GL_LEQUAL)
    > glClear(GL_COLOR_BUFFER_BIT)
    >
    > glPixelStorei(GL_UNPACK_ALIGNMENT, 1)
    > glPixelStorei(GL_PACK_ALIGNMENT, 1)
    >
    > #NTSC colour scales...
    > glPixelTransferf(GL_RED_SCALE, 0.299);
    > glPixelTransferf(GL_GREEN_SCALE, 0.587);
    > glPixelTransferf(GL_BLUE_SCALE, 0.114);
    >
    > glMatrixMode(GL_PROJECTION)
    > glLoadIdentity()
    > glOrtho(0.0,1.0,0,1.0,-1.0,1.0)
    > glMatrixMode(GL_MODELVIEW)
    > glLoadIdentity()
    >
    > return
    >
    > def rangeImage(self, image):
    >
    > glBindTexture(GL_TEXTURE_2D, self.texture)
    > glTexEnvf( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE )
    >
    > glTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
    > GL_LINEAR)
    > glTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR)
    > glTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT)
    > glTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT)
    >
    > # flatten it into a list so the OpenGL calls work
    > n = NumpyHandler()
    > fI = image.flatten()
    > flatImage = n.dataPointer(n.contiguous(fI))
    >
    > print n.contiguous(fI)
    >
    > gluBuild2DMipmaps(GL_TEXTURE_2D, 1, image.shape[0]+1,
    > image.shape[1]+1,
    > GL_LUMINANCE, GL_FLOAT, flatImage)
    > self.mode = RI
    > self.OnDraw()
    >
    > def drawRange(self):
    > ''' Controls the actual drawing of the range image'''
    >
    > glMatrixMode(GL_MODELVIEW)
    > glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
    >
    > glColor3f(1.0,1.0,1.0)
    > glEnable(GL_TEXTURE_2D)
    > glBindTexture(GL_TEXTURE_2D, self.texture)
    > glBegin(GL_TRIANGLE_FAN)
    > glTexCoord2d(1,1); glVertex3f(0.0, 0.0, 0.0)
    > glTexCoord2d(1,0); glVertex3f(0.0, 1.0, 0.0)
    > glTexCoord2d(0,0); glVertex3f(1.0, 1.0, 0.0)
    > glTexCoord2d(0,1); glVertex3f(1.0, 0.0, 0.0)
    > glEnd()
    > self.SwapBuffers()
    >
    > --------end snippet-----------


    I've never messed with pyOpenGL, but it seems that they have their own
    user's group, which would probably be better at answering your
    question:

    http://sourceforge.net/mail/?group_id=5988

    Of course, it could be that you upgraded your wxPython to the latest
    version and as I recall, they were discussing some subtle differences
    in DCs, blitting, paint events and other things that I just don't
    understand at this point in my "Pythoneering". You might ask them at
    their group, which is usually very helpful: wxPython.org

    Mike
     
    , Jan 3, 2008
    #2
    1. Advertising

  3. Thanks, will do...
    On Jan 3, 2:07 pm, wrote:
    > On Jan 3, 11:50 am, Adeola Bannis <> wrote:
    >
    >
    >
    > > Hi everyone,

    >
    > > I'm doing a project using wxPython and pyopengl, and I seem to have a
    > > problem rendering textures. This is code that worked before my hard
    > > drive had a meltdown, but not since I re-installed everything.

    >
    > > I've determined the problem is in the OpenGL part of my program. I do
    > > some calculations to generate a 2D numpy array that holds the image
    > > data, and pylab.imshow() shows me the image as it is meant to be. I
    > > used the same algorithm in Octave and MATLAB, and all are giving me
    > > the right picture.

    >
    > > However, using pyOpenGL and the numpyhandler functions (http://cours-
    > > info.iut-bm.univ-fcomte.fr/docs/python/OpenGL/
    > > OpenGL.arrays.numpymodule.NumpyHandler-class.html) doesn't seem to
    > > work. I get a garbled screen pocked with black pixels. I am including
    > > my openGL code below. What am I doing wrong?

    >
    > > And yes, I did make the dtype of my array 'float32'.

    >
    > > -------code snippets------

    >
    > > import wx
    > > from wx.glcanvas import GLCanvas

    >
    > > from OpenGL.GLU import *
    > > from OpenGL.GL import *
    > > from OpenGL.arrays.numpymodule import NumpyHandler

    >
    > > PC = 1
    > > RI = 0

    >
    > > class myGLCanvas(GLCanvas):
    > > def __init__(self, parent):
    > > GLCanvas.__init__(self, parent,-1)
    > > wx.EVT_PAINT(self, self.OnPaint)
    > > self.init = 0
    > > self.mode = -1
    > > # making a texture for the range image
    > > self.texture = glGenTextures(1)
    > > # making a spot for the point cloud points
    > > self.cloud = None
    > > return

    >
    > > def OnPaint(self,event):
    > > dc = wx.PaintDC(self)
    > > self.SetCurrent()
    > > if not self.init:
    > > self.InitGL()
    > > self.init = 1
    > > self.OnDraw()
    > > return

    >
    > > def OnDraw(self):
    > > glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
    > > if self.mode == RI:
    > > self.drawRange()
    > > elif self.mode == PC:
    > > self.drawCloud()

    >
    > > def InitGL(self):
    > > glClearColor(0.0, 0.0, 0.0, 0.0);
    > > glClearDepth(1.0)
    > > glEnable(GL_DEPTH_TEST)
    > > glDepthFunc(GL_LEQUAL)
    > > glClear(GL_COLOR_BUFFER_BIT)

    >
    > > glPixelStorei(GL_UNPACK_ALIGNMENT, 1)
    > > glPixelStorei(GL_PACK_ALIGNMENT, 1)

    >
    > > #NTSC colour scales...
    > > glPixelTransferf(GL_RED_SCALE, 0.299);
    > > glPixelTransferf(GL_GREEN_SCALE, 0.587);
    > > glPixelTransferf(GL_BLUE_SCALE, 0.114);

    >
    > > glMatrixMode(GL_PROJECTION)
    > > glLoadIdentity()
    > > glOrtho(0.0,1.0,0,1.0,-1.0,1.0)
    > > glMatrixMode(GL_MODELVIEW)
    > > glLoadIdentity()

    >
    > > return

    >
    > > def rangeImage(self, image):

    >
    > > glBindTexture(GL_TEXTURE_2D, self.texture)
    > > glTexEnvf( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE )

    >
    > > glTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
    > > GL_LINEAR)
    > > glTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR)
    > > glTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT)
    > > glTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT)

    >
    > > # flatten it into a list so the OpenGL calls work
    > > n = NumpyHandler()
    > > fI = image.flatten()
    > > flatImage = n.dataPointer(n.contiguous(fI))

    >
    > > print n.contiguous(fI)

    >
    > > gluBuild2DMipmaps(GL_TEXTURE_2D, 1, image.shape[0]+1,
    > > image.shape[1]+1,
    > > GL_LUMINANCE, GL_FLOAT, flatImage)
    > > self.mode = RI
    > > self.OnDraw()

    >
    > > def drawRange(self):
    > > ''' Controls the actual drawing of the range image'''

    >
    > > glMatrixMode(GL_MODELVIEW)
    > > glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)

    >
    > > glColor3f(1.0,1.0,1.0)
    > > glEnable(GL_TEXTURE_2D)
    > > glBindTexture(GL_TEXTURE_2D, self.texture)
    > > glBegin(GL_TRIANGLE_FAN)
    > > glTexCoord2d(1,1); glVertex3f(0.0, 0.0, 0.0)
    > > glTexCoord2d(1,0); glVertex3f(0.0, 1.0, 0.0)
    > > glTexCoord2d(0,0); glVertex3f(1.0, 1.0, 0.0)
    > > glTexCoord2d(0,1); glVertex3f(1.0, 0.0, 0.0)
    > > glEnd()
    > > self.SwapBuffers()

    >
    > > --------end snippet-----------

    >
    > I've never messed with pyOpenGL, but it seems that they have their own
    > user's group, which would probably be better at answering your
    > question:
    >
    > http://sourceforge.net/mail/?group_id=5988
    >
    > Of course, it could be that you upgraded your wxPython to the latest
    > version and as I recall, they were discussing some subtle differences
    > in DCs, blitting, paint events and other things that I just don't
    > understand at this point in my "Pythoneering". You might ask them at
    > their group, which is usually very helpful: wxPython.org
    >
    > Mike
     
    Adeola Bannis, Jan 3, 2008
    #3
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. F. GEIGER
    Replies:
    9
    Views:
    1,227
    F. GEIGER
    May 3, 2004
  2. Replies:
    2
    Views:
    621
  3. Clay Hobbs
    Replies:
    0
    Views:
    277
    Clay Hobbs
    Sep 21, 2008
  4. Clay Hobbs

    PyOpenGL + wxPython developer needed

    Clay Hobbs, Nov 5, 2008, in forum: Python
    Replies:
    0
    Views:
    336
    Clay Hobbs
    Nov 5, 2008
  5. dorayme
    Replies:
    1
    Views:
    624
    richard
    Jan 21, 2011
Loading...

Share This Page