opengltexture2dsoil

Texture not appearing on the screen Opengl


I want to load an image on the background, I have written following code to load the texture as background by texturing the Rectangle. My image is in power of 2 (512x512). I am not getting why it is not showing anything on the screen,

please help me in this. I am pasting my code to load the texture and to draw the rect.

Also, I have checked whether the image is loaded properly or not by using SOIL_last_result() and also checked whether there is any error in OpenGL by using glGetError()

Code to load the image as a texture using SOIL

void loadTexture(GLuint* texture, char* path){
    *texture = SOIL_load_OGL_texture(path,
                                     SOIL_LOAD_AUTO,
                                     SOIL_CREATE_NEW_ID,
                                     SOIL_FLAG_NTSC_SAFE_RGB | SOIL_FLAG_MULTIPLY_ALPHA
                                    );


    cout<<*texture<<endl;
    if(*texture == NULL){
        printf("Failed to load %s", path);
    }

}

Following code is to draw texture and rectangle,

void drawRect(int x, int y, int w, int h, GLuint texture){
    glEnable(GL_TEXTURE_2D);
    glBindTexture(GL_TEXTURE_2D, texture);
    glEnable(GL_BLEND);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
    glDepthMask(GL_FALSE);
    glDisable(GL_DEPTH_TEST);

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    glPushMatrix();
    glColor3f(1.0,1.0,1.0);
    glBegin(GL_POLYGON);

        glTexCoord2i(0,0);
        glVertex2i(x,y);
        glTexCoord2i(1,0);
        glVertex2i(x+w,y);
        glTexCoord2i(0,1);
        glVertex2i(x,y+h);
        glTexCoord2i(1,1);
        glVertex2i(x+w,y+h);

    glEnd();
    glPopMatrix();
    glEnable(GL_DEPTH_TEST);
    glDepthMask(GL_TRUE);
    glDisable(GL_BLEND);
}

And I am calling it using init mehod,

void initGL(void)
{
    glClearDepth(1.0);
        glClearColor(0,0,0, 1.0f);
        glColor3f(0.0, 0.0, 0.0);
        glLineWidth(1);
        glDepthFunc(GL_LESS);

        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
        glLoadIdentity();
        GLuint texture;
        loadTexture(&texture, "image.png");
        drawRect(0,0,screen_width-100,screen_height-100,texture);
        glfwSwapBuffers(window);
}

Please help me and let me know if you need more information. Thanks in advance!!


Solution

  • The projection matrix describes the mapping from 3D points of a scene, to 2D points of the viewport. It transforms from eye space to the clip space, and the coordinates in the clip space are transformed to the normalized device coordinates (NDC) by dividing with the w component of the clip coordinates. The NDC are in range (-1,-1,-1) to (1,1,1).
    Every geometry which is out of the clippspace is clipped.

    Since you do not set up a projection matrix, you're projection matrix is the identity matrix. This means you will only "see" the geometry, whose coordinates are in the range -1 to 1.

    I recommend to setup a orthographic projection matrix (glOrtho). At Orthographic Projection the coordinates in the eye space are linearly mapped to normalized device coordinates and the clip sapce coordinates are equal the normalized device coordiantes.

    Set up the projection somehow like this:

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(0, screen_width, 0, screen_height, -1, 1);