Textures not working


As I wrote in another thread, I am porting my OpenGL application from Mac to Windows. I am experiencing the following problem:

I have a PPM image, which I am loading into the following variable:

GLubyte texels[512][512][3];

In my init function, I am setting up a texture, using automatic generation of texture coordinates:

// texture image
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 512, 512, 0, GL_RGB,GL_UNSIGNED_BYTE, texels);

// set drawing mode to GL_DECAL so that the textured polygons are
//drawn using the colors from the texture map, and not polygon colors

// enable automatic texture coords generation
// (in two dimensions as the texture map is 2D)
glEnable( GL_TEXTURE_GEN_S);
glEnable( GL_TEXTURE_GEN_T);

// generate texture coords automatically, s is in the x-direction...
GLfloat x_dir[] = { 1, 0, 0 };
glTexGenfv(GL_S, GL_OBJECT_PLANE, x_dir);

// .. t is in the z-direction
GLfloat z_dir[] = { 0, 0, 1 };
glTexGenfv(GL_T, GL_OBJECT_PLANE, z_dir);

// repeat the texture in both directions

// filtering (not totally sure what this is for)

Then, when I draw the polygons that I want to texture on, I specify

glEnable( GL_TEXTURE_2D);

before drawing the polygon and

glDisable( GL_TEXTURE_2D);

afterwards. On Mac this worked perfectly but now (on Windows) the textures are not used - instead, my polygons are just green. If I print out the values of the texels variable, they seem alright (they are values from 0 to 255) so I don’t think it’s the loading of the file that’s gone wrong. What can I do?

GL_RGB is 3 bytes, and may be problematic with the 4 byte alignment which is the default with GL.

It is easier to set it to “tightly packed” like this :
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glPixelStorei(GL_PACK_ALIGNMENT, 1);

More details on the following page, search for “pixelstore” : http://www.opengl.org/resources/features/KilgardTechniques/oglpitfall/
Almost obsolete but still useful.

Can you describe exactly how “texels” array is build and filled in ?

Sure, first I open the PPM file (it is plain text) as an ifstream and then a use the values from the file to build the texels array. This is the for-loop that populates the array:

for (int i = 0; i < width; i++)
  for (int j = 0; j < height; j++)
    for (int c = 0; c < 3; c++)
      getline(file, line);
      texels[i][j][c] = atoi(line.c_str());

If I print them as integers, I can see that the texels variable now holds RGB-triples in the inner array, such as: (78,192,63)

texels[i][j][c] <- this may be a problem, depending on alignement.

Try this :
for (int t = 0; t<heightwidth3 ;t++) {
getline(file, line);
texels[t] = atoi(line.c_str());

What do you mean by “allignment”? If you mean the order in which the RGB-values are specified, they should be alright. However, I tried you suggestion, and it gives the same result. So now I have a single-dimensional texels array of length height x width x 3… Should I still create the texture image like this?

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, height, width,
             0, GL_RGB, GL_UNSIGNED_BYTE, texels);

Anything else I can try?