[PyOpenGL-Users] glPixelStorei causes glReadPixelsub Segmentation Fault (PyOpenGL 3.0.0b1)
Brought to you by:
mcfletch
From: U. A. E. <ar...@cd...> - 2008-04-09 15:29:54
|
I am receiving this error after upgrading my project to use PyOpenGL 3.0.0b1 (the same code works in version 2.0.2.01): ######################################## Traceback (most recent call last): File "C:\Python25\Lib\site-packages\wx-2.8-msw-unicode\wx\_core.py", line 14099, in <lambda> lambda event: event.callable(*event.args, **event.kw) ) File "C:\bicspe\construct\python\src\cdr\cellsim\clients\gui\OpenGLRenderer.py", line 933, in EventUpdate tr.endTile() File "C:\bicspe\construct\python\src\cdr\cellsim\clients\gui\TileRenderer.py", line 118, in endTile data = array(GL.glReadPixelsub(0, 0, width, height, GL.GL_RGB)) File "C:\Python25\lib\site-packages\pyopengl-3.0.0b1-py2.5.egg\OpenGL\GL\images.py", line 233, in glReadPixels ctypes.c_void_p( imageData ) WindowsError: exception: access violation writing 0x00000000 ######################################### Of course, the error shown occurs on windows xp... however, it segmentation faults on Mac OSX and Fedora 8 in the same location. Basically, I am doing a large opengl capture using tile rendering. Here is my class function where the error occurs: <div> ######################################### def endTile(self): GL.glFlush() prevRowLength = GL.glGetIntegerv(GL.GL_PACK_ROW_LENGTH) prevSkipRows = GL.glGetIntegerv(GL.GL_PACK_SKIP_ROWS) prevSkipPixels = GL.glGetIntegerv(GL.GL_PACK_SKIP_PIXELS) destX = self.tileWidth * self.currentColumn destY = self.tileHeight * self.currentRow GL.glPixelStorei(GL.GL_PACK_ROW_LENGTH, int(self.imageWidth)) GL.glPixelStorei(GL.GL_PACK_SKIP_ROWS, int(destY)) GL.glPixelStorei(GL.GL_PACK_SKIP_PIXELS, int(destX)) width = self.tileWidth height = self.tileHeight #grab only the pixels we need on the edges if self.currentRow == self.rows - 1 and self.tileHeightEdge: height = self.tileHeightEdge if self.currentColumn == self.columns - 1 and self.tileWidthEdge: width = self.tileWidthEdge data = array(GL.glReadPixelsub(0, 0, width, height, GL.GL_RGB)) GL.glPixelStorei(GL.GL_PACK_ROW_LENGTH, int(prevRowLength)) GL.glPixelStorei(GL.GL_PACK_SKIP_ROWS, int(prevSkipRows)) GL.glPixelStorei(GL.GL_PACK_SKIP_PIXELS, int(prevSkipPixels)) self.currentTile += 1 if self.currentTile > self.rows * self.columns: GL.glViewport(self.viewportSave[0], self.viewportSave[1], self.viewportSave[2], self.viewportSave[3]) self.currentTile = -1 else: GL.glPixelStorei(GL.GL_PACK_ALIGNMENT, 1) image = Image.fromstring("RGB", (width, height), data.tostring()) self.image.paste(image, (destX, destY)) ######################################### </div> If I comment out all the GL.glPixelStorei(GL.GL_PACK_ROW_LENGTH, ...), GL.glPixelStorei(GL.GL_PACK_SKIP_ROWS, ...), and GL.glPixelStorei(GL.GL_PACK_SKIP_PIXELS, ...) calls, the error DISAPPEARS on all platforms mentioned above; however, the end result that I seek is not right. Is this a known bug or does anyone have a workaround? Thanks, U. Artie Eoff |