I’m not convinced it’s lower left.
IF I make a 16x16 RGB texture like this.
//Blacken out all texture.
memset(data, 0, 16163);
//Make top half white.
memset(data, 255, 1683);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8, 16, 16, 0, GL_RGB, GL_UNSIGNED_BYTE, data);
So we have a texture, with the top half white, bottom half black. The top of the image, is the low address in memory. i.e. &data[0].
Now we render a quad like this. (Texture matrix is identity)
glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
glBegin(GL_QUADS);
glTexCoord2f(0.0f, 0.0f);
glVertex3f(-1.0f, -1.0f, 0.0f);
glTexCoord2f(1.0f, 0.0f);
glVertex3f(1.0f, -1.0f, 0.0f);
glTexCoord2f(1.0f, 1.0f);
glVertex3f(1.0f, 1.0f, 0.0f);
glTexCoord2f(0.0f, 1.0f);
glVertex3f(-1.0f, 1.0f, 0.0f);
glEnd();
As you can see, we start with the lower left coordinate and go round anti-clockwise.
Now, the texture coordinate specified at the bottom of the quad, (where Y = -1.0f) is 0.
Now if the origin of the texture in OpenGL is the lower left corner, this is black in the texture. However, the quad is rendered with white at the bottom and black at the top.
This suggests to me that OpenGL’s texture origin is the top of the texture. i.e. a texcoord of 0 in T, would be the top of the image. (The low address)
Or am I completely mis-understanding something here?!?! 
Nutty