1
votes

Recently my textures went crazy. Last 2 textures that I tried to map appeared as in the picture below. I want it to appear as in the first picture but no matter what I did, it insists on appearing like in the latter one. Ignore the text please, it has nothing to do with texture.

enter image description hereenter image description here

I am using GLUT for my openGL windowing, and GLM obj loader's tga reader. I used the reader many times before and there was no problem. It just stopped working for my last two attempts to load texture. The related code is below:

Texture onScreenTexture;


if (LoadTGA(&onScreenTexture, "back.tga")) 
    { 
        glGenTextures(1, &onScreenTexture.texID);
        glBindTexture(GL_TEXTURE_2D, onScreenTexture.texID);
        glTexImage2D(GL_TEXTURE_2D, 0, onScreenTexture.bpp / 8, onScreenTexture.width, onScreenTexture.height, 0, onScreenTexture.type, GL_UNSIGNED_BYTE, onScreenTexture.imageData);

        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);

        if (onScreenTexture.imageData) 
        {
            free(onScreenTexture.imageData);
        }
    }

glEnable(GL_TEXTURE_2D);
    glBindTexture(GL_TEXTURE_2D, onScreenTexture.texID);
    glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);

    glBegin(GL_QUADS);
        glTexCoord2f(0,0); glVertex2f(10.0, 10.0);
        glTexCoord2f(0,1); glVertex2f(260, 10.0);
        glTexCoord2f(1,1); glVertex2f(260, 110);
        glTexCoord2f(1,0); glVertex2f(10.0, 110);
    glEnd();
    glDisable(GL_TEXTURE_2D);
1
[EDIT: Transferred to the comment.] I solved the problem by experimenting. Apparently if your image files width/height ratio is greater than or equal to shape's width/height ratio, it gives such outcome. - hevele

1 Answers

3
votes

This is nothing to do with the ratio of width/height (though you do seem to be rendering it 90 degrees rotated, causing some additional stretching), but with the packing of rows of pixels. This is apparent from the diagonal pattern, indicating an progressive alignment issue, and also the coloured stripes, showing that the RGB data is unaligned differently on each line.

In your case, you're loading a TGA, which has no row-padding, but passing it to GL which by default expects rows of pixels to be padded to a multiple of 4 bytes.

Your working textures probably are either 32-bit rather than 24-bit or are a multiple of 4 pixels wide, either of which gives a natural alignment.

Possible fixes for this are:

  • Change the dimensions of your texture, such that there will be no padding.
  • Change the loading of your texture, such that the padding is consistent with what GL expects
  • Tell GL how your texture is packed, using (for example) glPixelStorei(GL_UNPACK_ALIGNMENT, 1);