Loading image into OpenGL

Started by
16 comments, last by Ramal Kurdy 10 years, 2 months ago

Are you trying to display this on a 2d quad stuck to the screen, or, in 3d? Im assuming 2d because you are using gluOrtho. Its going to be blurry to some degree if the pixels dont map 1 to 1 with the quad.

Use the following to stop the image from repeating, unless repeating is what you want then use GL_REPEAT


glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

Im not sure what size the glut window is, so try this to start


int gWidth = 800, gHeight = 600;  // store these globally where all functions can access

glutInitWindowSize(gWidth, gHeight); // before glutCreateWindow()

Also setup a reshape function to handle window resizing


void Resize()
{
        glViewport(0, 0, (GLsizei)gWidth, (GLsizei)gHeight);

        // initialize viewing values
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        gluOrtho2D(0.0, 1.0, 0.0, 1.0);             // 2d coordinates will need to be normalized (0.0 to 1.0)

        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity();
}

void ReshapeGlut(int w, int h)
{
        // update
        gWidth = w;
        gHeight = h;
        // apply
        Resize();
}

glutReshapeFunc(Reshape);            // set it in main after create window

and when drawing, draw using normalized coordinates and fit the quad to the image (might have to call Resize() before clearing during draw)


const float nw = float(ti->width) / float(gWidth);
const float nh = float(ti->height) / float(gHeight);

glBegin(GL_QUADS);   // counter clock wise
glTexCoord2f(0.0, 0.0);glVertex3f( 0.0, 0.0, 0.0);   // bottom left corner
glTexCoord2f(1.0, 0.0);glVertex3f( nw, 0.0, 0.0);     // bottom right
glTexCoord2f(1.0, 1.0);glVertex3f( nw, nh, 0.0);      // top right
glTexCoord2f(0.0, 1.0);glVertex3f( 0.0, nh, 0.0);    // top left  
glEnd();

Hi NumberXaero. I tried the code, but a white blank screen appears.

This is the size of my window:

 gluOrtho2D(0, 500, 0, 500);

The quad is set in the middle of the window:

glTranslatef(250,250,0);

This is the window position:

glutInitWindowPosition(350, 200);

Advertisement

Hmm, try removing the glTranslatef call.

This is what it looks like.

direct link

http://s30.postimg.org/eurazb6i9/Picture1.png

Can you post a link to the image you're trying to display? It doesn't just look like the image is blurry, it looks like you're reading from the wrong offset and using the wrong image pitch, to have what looks like alternating pixel rows side-by-side, and not starting at the upper-left of the image.

This is what it looks like.

direct link

http://s30.postimg.org/eurazb6i9/Picture1.png

Can you post a link to the image you're trying to display? It doesn't just look like the image is blurry, it looks like you're reading from the wrong offset and using the wrong image pitch, to have what looks like alternating pixel rows side-by-side, and not starting at the upper-left of the image.

This is the link

http://postimg.org/image/mmhvccujl/

This is the link



http://postimg.org/image/mmhvccujl/

Yeah, that looks hardly anything like the end result

First mistake: The majority of Windows and OS/2 bitmap images are in BGR format, not RGB. You'll have to either swap the bytes yourself, or use GL_BGR if your vendor supports it.

Second mistake: If I recall correctly, Windows and OS/2 bitmap images are stored in reverse row order. That's why the image is up-side down.

Third mistake: You don't seem to be reading the header at all; rather, it looks like (from what I can see) that you're reading the image header as if it were image data. That's why there are "corrupted" colors in the lower left of the image (which would be the beginning of the file, where there is no image data.)

Fourth mistake: If I am not mistaken, Windows and OS/2 bitmap images are aligned to a multiple of four bytes at the end of every row, and may have a padding byte for each pixel making it BGRX, not BGR, for some image formats supported by the BMP file format.

If you want to see a working implementation (assuming you like reading other peoples code):

https://github.com/fwsGonzo/library/blob/master/include/library/bitmap/bitmap.hpp

https://github.com/fwsGonzo/library/blob/master/library/bitmap/bitmap.cpp

https://github.com/fwsGonzo/library/blob/master/include/library/opengl/texture.hpp

https://github.com/fwsGonzo/library/blob/master/library/opengl/texture.cpp

Hmm, try removing the glTranslatef call.

I managed to get the picture to display by changing the height and width of the picture. Now it works. However, the colours of the other shapes on the window all turned into black colour. Do I have to call glDisable(GL_TEXTURE_2D);. If yes, where do I call it?

Thanks

Finally I managed to fix it. Now everything works. I will update the code.

Many thanks for all you support.

This topic is closed to new replies.

Advertisement