Thread: [PyOpenGL-Users] vertex/texture arrays
Brought to you by:
mcfletch
From: Frank R. <cra...@gm...> - 2002-01-06 15:38:22
|
Hello, I'm new to OpenGL and made some pretty good experiences with PyOpenGL so far. But now I've hit vertex arrays and there are some points I'm consistently appearing problems with. I'm using PyOpenGL 2.0.0.44 with pygame-1.3. I now created a list of (x,y,z) tuples for my vertices and a list of (u,v) tuples for the texture coords. I first ignored textures and used glVertexPointerf only which worked perfectly. But I couldn't get it to work using the older(?) glVertexPointer. The second problem is a little bit more complicated. I tried to use glTexCoordPointerf with my list of texture coords. To be able to do that I enabled the appropriate states and generated a texture. But the whole app crashed when calling glTexCoordPointerf(list_of_texcoords) giving me an OpenGL error: Invalid operation The same happened when I used the glTexCoordPointer method. Here's the problem code used: 8<====== # just enabling the arrays glEnableClientState(GL_VERTEX_ARRAY) glEnableClientState(GL_COLOR_ARRAY) glEnableClientState(GL_TEXTURE_COORD_ARRAY) # prepare texturing glEnable(GL_TEXTURE_2D) self.textures = glGenTextures(2) # only first texture used in this sample # create dummy texture surf = pygame.Surface((64,64)) surf.subsurface((32,0,32,32)).fill((255,255,255)) surfdata = pygame.image.tostring(surf,"RGBX",1) # setup the texture glBindTexture(GL_TEXTURE_2D,self.textures[0]) glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST) glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST) glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA, 64,64,0,GL_RGBA,GL_UNSIGNED_BYTE,surfdata) vertices = [] # list of (x,y,z) tuples mx,my = 50,50 # just a dimension to create 2601 vertices colors = [] # list of (r,g,b) tuples texcoords = [] # list of (u,v) tex coords # a loop to get the appropriate values for j in range(my+1): for i in range(mx+1): vertices.append((0.32*i,-0.32*j,0)) colors.append((random.random(),random.random(),random.random())) texcoords.append( ( i%2, j%2 ) ) # prepare vertex arrays # this works fine (also displays the expected output later) glVertexPointerf(vertices) # this doesn't work. leaves me with a blank screen #glVertexPointer(3,GL_FLOAT,0,vertices) # this works again (similar to the vertices) glColorPointerf(colors) # this line crashes with an invalid operation error glTexCoordPointerf(texcoords) # and this one crashes as well #glTexCoordPointer(2,GL_FLOAT,0,texcoords) =====>8 I appreciate any help I can get with this. I already tried RTFM and STFW but couldn't find any fixes. Thanks. |
From: Tarn W. B. <twb...@us...> - 2002-01-06 17:13:41
|
All the PyOpenGL functions are documented in merged man pages at http://pyopengl.sourceforge.net/documentation/manual/ Although the only the prototypes for the decorated functions (glVertexPointerf, etc.) are given in the man pages, they are described in more detail in the user's manual. This documentation is also distributed with 2.0, with the exception of the merged man pages which will be included in the next version. In short, glVertexPointer is like the C function in that it takes a Python string and it respects the stride arguments (in the future it may use the buffer protocol also), whereas glVertexPointerf uses a Python array (or Numeric) and doesn't need stride arguments. Sorry, haven't figured out the INVALID_OPERATION problem yet. Tarn |
From: Frank R. <cra...@gm...> - 2002-01-07 20:55:34
|
On Sun, Jan 06, 2002 at 11:13:24AM -0600, Tarn Weisner Burton wrote: > All the PyOpenGL functions are documented in merged man pages at > http://pyopengl.sourceforge.net/documentation/manual/ > > Although the only the prototypes for the decorated functions > (glVertexPointerf, etc.) are given in the man pages, they are described > in more detail in the user's manual. This documentation is also > distributed with 2.0, with the exception of the merged man pages which > will be included in the next version. I've checked these but couldn't really get anything new from it. > In short, glVertexPointer is like the C function in that it takes a > Python string and it respects the stride arguments (in the future it may > use the buffer protocol also), whereas glVertexPointerf uses a Python > array (or Numeric) and doesn't need stride arguments. How exactly does the string have to look like? I tried having a list vertices = [] and calling vertices.extend([x,y,z]) for each vertex, then did a repr(vertices)[1:-1].replace(',','') to get a string of successive "x1 y1 z1 x2 y2 z2.." vertices, but that didn't work at all with glVertexPointer. > Sorry, haven't figured out the INVALID_OPERATION problem yet. :( This is giving me a headache as I just can't get any more info out. I don't know what to check, why it is invalid.. nothing. Thanks for your help, -- Raiser, Frank aka CrashChaos IRC: irc.openprojects.net #pygame |
From: Mike C. F. <mcf...@ro...> - 2002-01-08 05:03:10
|
The format for the string versions of array functions is the same as for a C array. That is, it's the internal format of the array (not how you would write it in a C program). For instance, the point (1.0, 2.0, 3.0) would be represented as: '\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\x00@\x00\x00\x00\x00\x00\x00\x08@' (with \x00 meaning a byte with the value (hexidecimal) 0, \x08 being a byte with character number 8, etceteras) (I didn't figure that out on my own by the way, I used the struct module). You _could_ convert your data to that format by using the struct module, but it's a lot of work to go through when the other functions will do the conversions for you. So, how do you use those functions? Well, here's an example: '''Test of the glDrawArrays function''' from OpenGLContext import testingcontext BaseContext, MainFunction = testingcontext.getInteractive() from OpenGL.GL import * from Numeric import array import string data = [ (0,0,0), (1,0,0), (1,1,0), (0,1,0), ] class TestContext( BaseContext): def Render( self, mode = 0): BaseContext.Render( self, mode ) glVertexPointerd( data ) glNormalPointerf([ (0,0,1)]*4 ) glEnableClientState(GL_VERTEX_ARRAY); glEnableClientState(GL_NORMAL_ARRAY); glDrawArrays(GL_QUADS, 0, len(data)) if __name__ == "__main__": MainFunction ( TestContext) <plug> That's taken from the OpenGLContext/tests directory (with a simpler set of data in your format substituted). You can find a lot of sample code in the tests directory that gives you examples of how to accomplish common tasks. </plug> Hope that helps, Mike Frank Raiser wrote: > On Sun, Jan 06, 2002 at 11:13:24AM -0600, Tarn Weisner Burton wrote: > >>All the PyOpenGL functions are documented in merged man pages at >>http://pyopengl.sourceforge.net/documentation/manual/ >> >>Although the only the prototypes for the decorated functions >>(glVertexPointerf, etc.) are given in the man pages, they are described >>in more detail in the user's manual. This documentation is also >>distributed with 2.0, with the exception of the merged man pages which >>will be included in the next version. >> > > I've checked these but couldn't really get anything new from it. > > >>In short, glVertexPointer is like the C function in that it takes a >>Python string and it respects the stride arguments (in the future it may >>use the buffer protocol also), whereas glVertexPointerf uses a Python >>array (or Numeric) and doesn't need stride arguments. >> > > How exactly does the string have to look like? > I tried having a list vertices = [] and calling vertices.extend([x,y,z]) > for each vertex, then did a repr(vertices)[1:-1].replace(',','') to get > a string of successive "x1 y1 z1 x2 y2 z2.." vertices, but that didn't > work at all with glVertexPointer. > > >>Sorry, haven't figured out the INVALID_OPERATION problem yet. >> > > :( This is giving me a headache as I just can't get any more info out. I > don't know what to check, why it is invalid.. nothing. > > Thanks for your help, > -- _______________________________________ Mike C. Fletcher http://members.rogers.com/mcfletch/ |
From: Frank R. <cra...@gm...> - 2002-01-08 08:51:15
|
On Tue, Jan 08, 2002 at 12:06:25AM -0500, Mike C. Fletcher wrote: > The format for the string versions of array functions is the same as for > a C array. That is, it's the internal format of the array (not how you > would write it in a C program). For instance, the point (1.0, 2.0, 3.0) > would be represented as: > > '\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\x00@\x00\x00\x00\x00\x00\x00\x08@' > (with \x00 meaning a byte with the value (hexidecimal) 0, \x08 being a > byte with character number 8, etceteras) Ok thanks. I'm gonna try using this if I can't get glTexCoordPointerf to work. > So, how do you use those functions? Well, here's an example: I already got everything working with the vertex and color arrays. My only problem is that the call to glTexCoordPointerf returns an invalid operation error. The rest works splendidly. Although I wonder if using glTexCoordPointer with a struct generated string will not just repeat that error. I'm gonna take a look at this later. Thanks for your help, -- Raiser, Frank aka CrashChaos IRC: irc.openprojects.net #pygame Windows is the one true OS. MS invented the GUI. MS invented the 32 bit OS. MS is open and standard. MS loves you. We have always been at war with Oceana. |
From: Frank R. <cra...@gm...> - 2002-01-08 15:13:44
|
I managed to create the strings using the struct module and they worked exactly the same as glVertexPointerf and glColorPointerf. But when trying to do the same with glTexCoordPointer I got back my beloved 1282 invalid operation error. It's interesting however that I get the very same error when f.ex. producing an actual error by not enabling GL_TEXTURE_2D or the texcoord array. This makes me think I might have missed something essential? Although I wouldn't know what. The texture setup is taken from a working example (well just the 4 lines setting it up until glTexImage2D). And I enabled GL_TEXTURE_2D and GL_TEXTURE_COORD_ARRAY. Any ideas? -- Raiser, Frank aka CrashChaos IRC: irc.openprojects.net #pygame |
From: Jan E. <ch...@in...> - 2002-01-09 08:55:15
|
On Tue, 8 Jan 2002, Frank Raiser wrote: >I managed to create the strings using the struct module and they worked >exactly the same as glVertexPointerf and glColorPointerf. But when >trying to do the same with glTexCoordPointer I got back my beloved >1282 invalid operation error. >It's interesting however that I get the very same error when f.ex. producing >an actual error by not enabling GL_TEXTURE_2D or the texcoord array. This makes >me think I might have missed something essential? Although I wouldn't know >what. The texture setup is taken from a working example (well just the 4 lines >setting it up until glTexImage2D). And I enabled GL_TEXTURE_2D and >GL_TEXTURE_COORD_ARRAY. Any ideas? Does anybody know of any way to get better error messages? Or just have it throw an exception with some more context information? This is probably not the fault of PyOpenGL, but it's the way OpenGL/Mesa works. I'm quite sure that all recent versions of Mesa (as Frank most likely uses) have the glTexCoordPointer() function, so the error (again, I think) is somewhere when PyOpenGL talks to Mesa? -- The Emperor had all the qualifications for a corpse except, as it were, the most vital one. -- Terry Pratchett, Interesting Times |