how do i use sub - texture of an existing texture

Hi i’m loading in one 256 x 256 texture into the card with glTexImage2D() and then i create a texture object with 3 IDs that i bind with three 64 x 64 subtextures of the large texture but its not working or i’m doing something wrong can someone have a look and tell me if this is correct please cheers.

This is from the init() method :

gl.glEnable(GL.GL_TEXTURE_2D);
gl.glShadeModel(GL.GL_SMOOTH);
gl.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
gl.glHint(GL.GL_PERSPECTIVE_CORRECTION_HINT, GL.GL_NICEST);

gl.glBlendFunc(GL.GL_SRC_ALPHA, GL.GL_ONE);
gl.glEnable(GL.GL_BLEND);

gl.glPixelStorei(GL.GL_UNPACK_SWAP_BYTES, GL.GL_TRUE);
gl.glPixelStorei(GL.GL_UNPACK_ALIGNMENT, 1);

gl.glTexImage2D(GL.GL_TEXTURE_2D, 0, 4, 256, 256, 0, GL.GL_RGBA, GL.GL_UNSIGNED_BYTE, img);

gl.glTexParameterf(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_WRAP_S, GL.GL_CLAMP);

gl.glTexParameterf(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_WRAP_T, GL.GL_CLAMP);

gl.glTexParameterf(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MAG_FILTER, GL.GL_LINEAR);

gl.glTexParameterf(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MIN_FILTER, GL.GL_LINEAR);

gl.glGenTextures(3, textureIDs);

gl.glBindTexture(GL.GL_TEXTURE_2D, textureIDs[0]);

gl.glTexSubImage2D(GL.GL_TEXTURE_2D, 0, 0, 0, 64, 64, GL.GL_RGBA, GL.GL_UNSIGNED_BYTE, img);

gl.glTexParameterf(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_WRAP_S, GL.GL_CLAMP);

gl.glTexParameterf(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_WRAP_T, GL.GL_CLAMP);

gl.glTexParameterf(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MAG_FILTER, GL.GL_LINEAR);

gl.glTexParameterf(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MIN_FILTER, GL.GL_LINEAR);

gl.glBindTexture(GL.GL_TEXTURE_2D, textureIDs[1]);

gl.glTexSubImage2D(GL.GL_TEXTURE_2D, 0, 64, 0, 64, 64, GL.GL_RGBA, GL.GL_UNSIGNED_BYTE, img);

gl.glTexParameterf(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_WRAP_S, GL.GL_CLAMP);

gl.glTexParameterf(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_WRAP_T, GL.GL_CLAMP);

gl.glTexParameterf(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MAG_FILTER, GL.GL_LINEAR);

gl.glTexParameterf(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MIN_FILTER, GL.GL_LINEAR);

gl.glBindTexture(GL.GL_TEXTURE_2D, textureIDs[2]);

gl.glTexSubImage2D(GL.GL_TEXTURE_2D, 0, 128, 0, 64, 64, GL.GL_RGBA, GL.GL_UNSIGNED_BYTE, img);

gl.glTexParameterf(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_WRAP_S, GL.GL_CLAMP);

gl.glTexParameterf(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_WRAP_T, GL.GL_CLAMP);

gl.glTexParameterf(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MAG_FILTER, GL.GL_LINEAR);

gl.glTexParameterf(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MIN_FILTER, GL.GL_LINEAR);

/////////////////////////////////////////////////////////////////////////////

And this is part of the display method to draw one of the sub textures onto a quad:

gl.glClear(GL.GL_COLOR_BUFFER_BIT);

gl.glBindTexture(GL.GL_TEXTURE_2D, textureIDs[currentTexID]);

gl.glColor4f(1.0f, 1.0f, 1.0f, 1.0f);

gl.glBegin(GL.GL_QUADS);
gl.glTexCoord2f(0.0f, 0.0f);
gl.glVertex2i(0, 0);

 gl.glTexCoord2f(0.0f, 1.0f);
 gl.glVertex2i(0, 64 - 1);
          
 gl.glTexCoord2f(1.0f, 1.0f);
 gl.glVertex2i(64 - 1, 64 - 1);
          
 gl.glTexCoord2f(1.0f, 0.0f);
 gl.glVertex2i(64 - 1, 0);

gl.glEnd();

gl.glFlush();

Hi,

From OpenGL docs:

[quote]The glTexSubImage2D function specifies a portion of an existing one-dimensional texture image. You cannot define a new texture with glTexSubImage2D.
[/quote]
glTexSubImage2D typically used if you need to update portion of texture uploaded earlier with new data. As I see in your data you use the same image in both glTexImage2D and glTexSubImage2D. If you want to use one texture to texturize 4 different objects, you can either play with Texture Coordinates or use tecture coordinate transform matrix to transform coords on the card.

There is also topic related to glTexSubImage2D in Xith3D forum:

http://www.java-gaming.org/cgi-bin/JGNetForums/YaBB.cgi?board=xith3d;action=display;num=1069557088, thread name “glTexSubImage2D”.

Yuri