Thread: Re: [PyOpenGL-Users] 3D Textures
Brought to you by:
mcfletch
From: Ian M. <geo...@gm...> - 2009-06-18 20:07:31
|
Hi, I've been trying to get 3D textures working in PyOpenGL. I tried a simple 2D image (depth = 1). The source image (which I choose randomly) is here<http://www.savvyhousekeeping.com/wp-content/uploads/2009/01/cheese.jpg>. texture3darray = pygame.surfarray.array3d(#pygame.Surface) data = Numeric.array(Numeric.ravel(texture3darray),"uint8") texture = glGenTextures(1) glBindTexture(GL_TEXTURE_3D,texture) glTexImage3D(GL_TEXTURE_3D,0,GL_RGB,480,342,1,0,GL_RGB,GL_UNSIGNED_BYTE,data) glTexParameterf(paramtype,GL_TEXTURE_MIN_FILTER,GL_LINEAR) glTexParameterf(paramtype,GL_TEXTURE_MAG_FILTER,GL_LINEAR) I tried using this code to texture a rectangular solid, but I get an incorrect result--see here<http://img20.imageshack.us/img20/3905/image1dsz.png>. Here's the code for the solid: #Inside a function box = glGenLists(1) glNewList(box,GL_COMPILE) glDisable(GL_TEXTURE_2D) glEnable(GL_TEXTURE_3D) glSelectTexture(GL_TEXTURE_3D,texture) glBegin(GL_QUADS) # Right face if normalflip: glNormal3f( 1.0, 0.0, 0.0) else: glNormal3f(-1.0, 0.0, 0.0) glTexCoord3f(1.0, 1.0, 1.0); glVertex3f( size[0], size[1], size[2]) glTexCoord3f(1.0, 0.0, 1.0); glVertex3f( size[0], -size[1], size[2]) glTexCoord3f(1.0, 0.0, 0.0); glVertex3f( size[0], -size[1], -size[2]) glTexCoord3f(1.0, 1.0, 0.0); glVertex3f( size[0], size[1], -size[2]) # Left Face if normalflip: glNormal3f(-1.0, 0.0, 0.0) else: glNormal3f( 1.0, 0.0, 0.0) glTexCoord3f(0.0, 1.0, 1.0); glVertex3f(-size[0], size[1], size[2]) glTexCoord3f(0.0, 1.0, 0.0); glVertex3f(-size[0], size[1], -size[2]) glTexCoord3f(0.0, 0.0, 0.0); glVertex3f(-size[0], -size[1], -size[2]) glTexCoord3f(0.0, 0.0, 1.0); glVertex3f(-size[0], -size[1], size[2]) # Top Face if normalflip: glNormal3f( 0.0, 1.0, 0.0) else: glNormal3f( 0.0, -1.0, 0.0) glTexCoord3f(0.0, 1.0, 0.0); glVertex3f(-size[0], size[1], -size[2]) glTexCoord3f(0.0, 1.0, 1.0); glVertex3f(-size[0], size[1], size[2]) glTexCoord3f(1.0, 1.0, 1.0); glVertex3f( size[0], size[1], size[2]) glTexCoord3f(1.0, 1.0, 0.0); glVertex3f( size[0], size[1], -size[2]) # Bottom Face if normalflip: glNormal3f( 0.0,-1.0, 0.0) else: glNormal3f( 0.0, 1.0, 0.0) glTexCoord3f(1.0, 0.0, 1.0); glVertex3f( size[0], -size[1], size[2]) glTexCoord3f(0.0, 0.0, 1.0); glVertex3f(-size[0], -size[1], size[2]) glTexCoord3f(0.0, 0.0, 0.0); glVertex3f(-size[0], -size[1], -size[2]) glTexCoord3f(1.0, 0.0, 0.0); glVertex3f( size[0], -size[1], -size[2]) # Front Face if normalflip: glNormal3f( 0.0, 0.0,-1.0) else: glNormal3f( 0.0, 0.0, 1.0) glTexCoord3f(1.0, 1.0, 0.0); glVertex3f( size[0], size[1], -size[2]) glTexCoord3f(1.0, 0.0, 0.0); glVertex3f( size[0], -size[1], -size[2]) glTexCoord3f(0.0, 0.0, 0.0); glVertex3f(-size[0], -size[1], -size[2]) glTexCoord3f(0.0, 1.0, 0.0); glVertex3f(-size[0], size[1], -size[2]) # Back Face if normalflip: glNormal3f( 0.0, 0.0, 1.0) else: glNormal3f( 0.0, 0.0,-1.0) glTexCoord3f(0.0, 0.0, 1.0); glVertex3f(-size[0], -size[1], size[2]) glTexCoord3f(1.0, 0.0, 1.0); glVertex3f( size[0], -size[1], size[2]) glTexCoord3f(1.0, 1.0, 1.0); glVertex3f( size[0], size[1], size[2]) glTexCoord3f(0.0, 1.0, 1.0); glVertex3f(-size[0], size[1], size[2]) glEnd() glDisable(GL_TEXTURE_3D) glEnable(GL_TEXTURE_2D) glEndList() Why am I not seeing the rectangular solid be textured properly? It should look like the 2D image on the top and bottom and the edges of the image on the sides of the box, right? Ian |
From: Ian M. <geo...@gm...> - 2009-06-19 02:26:05
Attachments:
3D Texture Test.py
|
Here's a simple example, showing my problem. Ian |
From: Ian M. <geo...@gm...> - 2009-06-19 07:49:27
Attachments:
3D Texture Test.py
|
I seem to have made an improvement. There's still weird noise though on the four sides (texture depth changes). Here's the updated file, showing the issue. |
From: Ian M. <geo...@gm...> - 2009-06-19 20:41:20
|
The issue is caused by texture wrapping (fix by clamping to edge). Anyone know where I can get some 3D textures? |