Problem with numpy and OpenGL textures

"Adeola Bannis" <[email protected]>
Newsgroups gmane.comp.python.opengl.devel
Message-ID <[email protected]>
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-----------

-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2005.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
_______________________________________________
PyOpenGL Homepage
http://pyopengl.sourceforge.net
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.